模板
编辑该页面模板
精明的读者注意到我们的框架硬编码的方式具体的“代码”(模板)运行。对于简单的页面我们创建了到目前为止,这不是一个问题,但如果你想添加更多的逻辑,你将被迫把逻辑模板本身,这可能不是一个好主意,特别是如果你还有分离关注点原则牢记于心。
让我们单独的模板代码逻辑通过添加一个新图层:控制器:控制器的任务是基于传达的信息生成一个响应客户机的请求。
改变模板呈现框架的一部分阅读如下:
1 2 3 4 5 6 7 8 9 10 11
/ / example.com/web/front.php/ /……试一试{美元请求- >属性- >add (美元匹配器- >匹配(美元请求- >getPathInfo ()));美元响应= call_user_func (“render_template”,美元请求);}抓(路由\异常\ ResourceNotFoundException美元异常){美元响应=新响应(“没有找到”,404年);}抓(异常美元异常){美元响应=新响应(“出错”,500年);}
现在呈现由一个外部函数(render_template ()
在这里),我们需要通过它从URL中提取的属性。我们可以通过一个额外的参数render_template ()
,而是,让我们使用的另一个特性请求
类属性:请求属性是一种附加额外信息的请求没有直接关系到HTTP请求数据。
您现在可以创建render_template ()
函数,一个通用的控制器,它显示一个模板当没有特定的逻辑。保持与之前相同的模板,之前请求属性提取模板呈现:
1 2 3 4 5 6 7 8
函数render_template(请求美元请求):响应{提取(美元请求- >属性- >所有(),EXTR_SKIP);ob_start ();包括sprintf (__DIR__。“/ . . / src /页面/ % s.php ',美元_route);返回新响应(ob_get_clean ());}
作为render_template
使用PHP作为参数call_user_func ()
函数,我们可以换成任何有效的PHP回调。这允许我们使用一个函数,一个匿名函数或类作为控制器的方法…你的选择。
作为一个惯例,对于每一个路线,通过配置相关的控制器_controller
路由属性:
1 2 3 4 5 6 7 8 9 10 11 12 13
美元路线- >add (“你好”,新路由\路线(“/ hello /{名称}”,(“名字”= >“世界”,“_controller”= >“render_template”)));试一试{美元请求- >属性- >add (美元匹配器- >匹配(美元请求- >getPathInfo ()));美元响应= call_user_func (美元请求- >属性- >get (“_controller”),美元请求);}抓(路由\异常\ ResourceNotFoundException美元异常){美元响应=新响应(“没有找到”,404年);}抓(异常美元异常){美元响应=新响应(“出错”,500年);}
路线现在可以与任何控制器和控制器内,你仍然可以使用render_template ()
呈现一个模板:
1 2 3 4 5 6
美元路线- >add (“你好”,新路由\路线(“/ hello /{名称}”,(“名字”= >“世界”,“_controller”= >函数(请求美元请求):字符串{返回render_template (美元请求);}));
这是相当灵活,你可以改变响应对象之后,你甚至可以将附加参数传递给模板:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
美元路线- >add (“你好”,新路由\路线(“/ hello /{名称}”,(“名字”= >“世界”,“_controller”= >函数(请求美元请求):响应{/ / $ foo将可用的模板中美元请求- >属性- >集(“foo”,“酒吧”);美元响应= render_template (美元请求);/ /改变一些头美元响应- >头- >集(“内容类型”,“文本/普通”);返回美元响应;}));
这是更新和改进版本的框架:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30 31 32 33
/ / example.com/web/front.phprequire_once__DIR__。“/ . . /供应商/ autoload.php”;使用ob娱乐下载\组件\HttpFoundation\请求;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\路由;函数render_template(请求美元请求):响应{提取(美元请求- >属性- >所有(),EXTR_SKIP);ob_start ();包括sprintf (__DIR__。“/ . . / src /页面/ % s.php ',美元_route);返回新响应(ob_get_clean ());}美元请求=请求::createFromGlobals ();美元路线=包括__DIR__。“/ . . / src / app.php”;美元上下文=新路由\ RequestContext ();美元上下文- >fromRequest (美元请求);美元匹配器=新路由\匹配器\ UrlMatcher (美元路线,美元上下文);试一试{美元请求- >属性- >add (美元匹配器- >匹配(美元请求- >getPathInfo ()));美元响应= call_user_func (美元请求- >属性- >get (“_controller”),美元请求);}抓(路由\异常\ ResourceNotFoundException美元异常){美元响应=新响应(“没有找到”,404年);}抓(异常美元异常){美元响应=新响应(“出错”,500年);}美元响应- >send ();
庆祝我们的新框架的诞生,让我们创建一个全新的应用程序需要一些简单的逻辑。我们的应用程序有一个页面,说是否某一年是一个闰年。当调用/ is_leap_year
今年,你会得到答案,但是你还可以指定在一年/ is_leap_year / 2009
。是通用的,框架不需要以任何方式修改,创建一个新的app.php
文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日24日25日26日
/ / example.com/src/app.php使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\路由;函数is_leap_year(int美元一年= null):bool{如果(零= = =美元一年){美元一年=日期(“Y”);}返回0= = =美元一年%400年| | (0= = =美元一年%4& &0= = !美元一年%One hundred.);}美元路线=新路由\ RouteCollection ();美元路线- >add (“leap_year”,新路由\路线(“/ is_leap_year /{一}”,(“年”= >零,“_controller”= >函数(请求美元请求):响应{如果(is_leap_year (美元请求- >属性- >get (“年”))){返回新响应(“是的,这是一个闰年!”);}返回新响应(“不,这不是一个闰年。);}));返回美元路线;
的is_leap_year ()
函数返回真正的
当给定的年是一个闰年,假
否则。如果一年零
,当前的测试。控制器没有:它从请求属性,通过它is_leap_year ()
根据返回值函数,它会创建一个新的响应对象。
像往常一样,你可以在这里决定停止使用该框架;可能是所有您需要创建简单的网站就像那些华丽的一页网站并希望其他几个人。