<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>框架 on ZRJ | 学习笔记</title>
        <link>https://blog.zrj.me/tags/%E6%A1%86%E6%9E%B6/</link>
        <description>Recent content in 框架 on ZRJ | 学习笔记</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-CN</language>
        <lastBuildDate>Fri, 31 Aug 2012 13:29:24 +0800</lastBuildDate><atom:link href="https://blog.zrj.me/tags/%E6%A1%86%E6%9E%B6/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>临摹了一个 PHP MVC 框架</title>
        <link>https://blog.zrj.me/posts/2012-08-31-%E4%B8%B4%E6%91%B9%E4%BA%86%E4%B8%80%E4%B8%AA-php-mvc-%E6%A1%86%E6%9E%B6/</link>
        <pubDate>Fri, 31 Aug 2012 13:29:24 +0800</pubDate>
        
        <guid>https://blog.zrj.me/posts/2012-08-31-%E4%B8%B4%E6%91%B9%E4%BA%86%E4%B8%80%E4%B8%AA-php-mvc-%E6%A1%86%E6%9E%B6/</guid>
        <description>&lt;p&gt;框架是 slim，&lt;a class=&#34;link&#34; href=&#34;https://github.com/codeguy/Slim&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/codeguy/Slim&lt;/a&gt;，人如其名，真的很 slim，用起来也很简单，就这么几行就可以跑起来了&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;require&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;Slim/Slim.php&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;$app&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Slim&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;$app&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;/:name&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;k&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Hello, &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;$name&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;$app&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;run&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;需要配合这个 apache 重写规则&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;RewriteEngine On

# Some hosts may require you to use the `RewriteBase` directive.
# If you need to use the `RewriteBase` directive, it should be the
# absolute physical path to the directory that contains this htaccess file.
#
# RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [QSA,L]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;运行效果如图&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;http://zrj.me/wp-content/uploads/2012/08/Unnamed-QQ-Screenshot20120831125336.png&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://blog.zrj.me/images/Unnamed-QQ-Screenshot20120831125336.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;跟着源码临摹了一个，现在已经可以跑上面那个例程了，临摹的方法就是顺着函数调用栈，用到哪个就去抄哪个函数过来，呵呵，这么搞现在应该是最简的能跑的了吧&lt;/p&gt;
&lt;p&gt;附上现在源码 &lt;a class=&#34;link&#34; href=&#34;http://zrj.me/wp-content/uploads/2012/08/slim2.zip&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;slim2&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;调用也是一样的&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;require&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;Slim2/Slim2.php&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;$app&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Slim2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;$app&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;/:name&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;k&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Hello, &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;$name&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;$app&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;run&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;运行效果也是一样的&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;http://zrj.me/wp-content/uploads/2012/08/Unnamed-QQ-Screenshot20120831125201.png&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://blog.zrj.me/images/Unnamed-QQ-Screenshot20120831125201.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
	
&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;现在只是实现了最简的&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一个环境资源类&lt;/li&gt;
&lt;li&gt;一个封装了请求的类&lt;/li&gt;
&lt;li&gt;一个路由器类&lt;/li&gt;
&lt;li&gt;一个路由规则类&lt;/li&gt;
&lt;li&gt;还有把他们结合在一起的核心类&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;目前没有实现中间件&lt;/p&gt;
&lt;p&gt;在这个框架中，一次请求其实这么来实现的&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;请求从 index.php 这个统一入口进来&lt;/li&gt;
&lt;li&gt;index.php 构造一个 slim 的实例对象&lt;/li&gt;
&lt;li&gt;slim 对象在初始化的时候构造运行环境类（environment），还有请求类（request），以及一个回应类（response），和一个路由器类（router）&lt;/li&gt;
&lt;li&gt;环境类顾名思义负责收集和整合运行环境的信息，包括请求方法，远端 IP，请求路径，运行的服务器名，服务器端口等等&lt;/li&gt;
&lt;li&gt;请求类其实跟环境的内容有稍稍重复，不过他更是明确职责一些，封装的内容也就是请求方法，请求路径等&lt;/li&gt;
&lt;li&gt;回应类主要负责响应的 http header，还有 set get cookie，还有就是响应正文了&lt;/li&gt;
&lt;li&gt;路由器类管理众多的路由规则，每个路由规则对应一个路由类的实例，同时负责匹配路由的选取（是选取，他不负责具体的匹配计算，匹配计算由每个路由类的实例自己完成）&lt;/li&gt;
&lt;li&gt;路由类负责解析请求的字符串，把他们正则匹配解析到变量中，以备响应函数的使用&lt;/li&gt;
&lt;li&gt;然后就是总揽全局的调用类了，（虽然我没有实现中间件类，但是这个框架却把自己这个调用者本身也当作一个中间件），这个总管的 call 函数负责把请求送到路由器中，让他去求得命中的路由，然后调用该路由的 callable 函数，然后送到响应类去输出&lt;/li&gt;
&lt;li&gt;后面应该还要实现一些模版，渲染引擎之类的东西，现在还没做&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;=============================================================&lt;/p&gt;
&lt;p&gt;2012-08-31 15:26:59 update 发现了框架作者自己写的一篇文章讲一个请求的生命周期的，比我这清晰多了，&lt;a class=&#34;link&#34; href=&#34;http://www.slimframework.com/read/slim-framework-application-lifecycle&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://www.slimframework.com/read/slim-framework-application-lifecycle&lt;/a&gt;，另外买一送一附送一篇，&lt;a class=&#34;link&#34; href=&#34;http://www.slimframework.com/read/how-to-organize-a-large-slim-framework-application&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://www.slimframework.com/read/how-to-organize-a-large-slim-framework-application&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;历史评论&#34;&gt;历史评论
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;从点击到呈现 — 详解一次HTTP请求（3） | ZRJ&lt;/strong&gt; (2012-10-05 08:29:55):&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[&amp;hellip;] mvc 中的生命周期，可以参考这里，临摹了一个 PHP MVC 框架，在视图层把页面准备好后，再从动态脚本解释器送回到 http 服务器，由 [&amp;hellip;]&lt;/p&gt;
&lt;/blockquote&gt;
</description>
        </item>
        
    </channel>
</rss>
