关注点分离
编辑本页关注点分离
现在我们的框架的一个缺点是我们需要复制和粘贴代码front.php
每次我们创建一个新网站。60行代码并不多,但是如果我们能够将这些代码包装到一个合适的类中就更好了。它会给我们带来更好的可重用性更容易的测试,仅举几个好处。
如果你仔细看一下代码,front.php
有一个输入,请求和一个输出,响应。我们的框架类将遵循这个简单的原则:逻辑是关于创建与请求相关的响应。
让我们为框架创建自己的命名空间:单纯形
.将请求处理逻辑移到自己的逻辑中单纯形\框架
类:
12 34 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 34 35 36 37 38 39 40 41
/ / example.com/src/Simplex/Framework.php名称空间单纯形;使用ob娱乐下载\组件\HttpFoundation\请求;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\HttpKernel\控制器\ArgumentResolver;使用ob娱乐下载\组件\HttpKernel\控制器\ControllerResolver;使用ob娱乐下载\组件\路由\异常\ResourceNotFoundException;使用ob娱乐下载\组件\路由\匹配器\UrlMatcher;类框架{私人$匹配器;私人$controllerResolver;私人$argumentResolver;公共函数__construct(UrlMatcher$匹配器, ControllerResolver$controllerResolver, ArgumentResolver$argumentResolver){$这->匹配器=$匹配器;$这->controllerResolver =$controllerResolver;$这->argumentResolver =$argumentResolver;}公共函数处理(请求$请求){$这->匹配器->getContext ()->fromRequest ($请求);试一试{$请求->属性->add ($这->匹配器->匹配($请求->getPathInfo ()));$控制器=$这->controllerResolver->getController ($请求);$参数=$这->argumentResolver->getArguments ($请求,$控制器);返回中的call_user_func_array ($控制器,$参数);}抓(ResourceNotFoundException$异常){返回新响应(“没有找到”,404);}抓(\异常$异常){返回新响应(“发生错误”,500);}}}
和更新example.com/web/front.php
因此:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/ / example.com/web/front.php/ /……$请求=请求::createFromGlobals ();$路线=包括__DIR__.“/ . . / src / app.php”;$上下文=新路由\ RequestContext ();$匹配器=新路由\匹配器\ UrlMatcher ($路线,$上下文);$controllerResolver=新ControllerResolver ();$argumentResolver=新ArgumentResolver ();$框架=新单纯形\框架($匹配器,$controllerResolver,$argumentResolver);$响应=$框架->处理($请求);$响应->send ();
为了结束重构,让我们移动除路由定义之外的所有内容example.com/src/app.php
进入另一个名称空间:日历
.
类下定义的类单纯形
而且日历
要自动加载的名称空间,请更新composer.json
文件:
1 2 3 4 5 6
{“…”:“…”,“自动”: {“psr-4”: {"":“src /”}}}
请注意
要更新Composer自动加载器,请运行作曲家dump-autoload
.
将控制器移动到日历\ \ LeapYearController控制器
:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
/ / example.com/src/Calendar/Controller/LeapYearController.php名称空间日历\控制器;使用日历\模型\LeapYear;使用ob娱乐下载\组件\HttpFoundation\请求;使用ob娱乐下载\组件\HttpFoundation\响应;类LeapYearController{公共函数指数(请求$请求,$一年){$leapYear=新LeapYear ();如果($leapYear->isLeapYear ($一年)) {返回新响应(“是的,今年是闰年!”);}返回新响应(“不,今年不是闰年。”);}}
然后移动is_leap_year ()
函数也可以赋给它自己的类:
12 3 4 5 6 7 8 9 10 11 12 13 14
/ / example.com/src/Calendar/Model/LeapYear.php名称空间日历\模型;类LeapYear{公共函数isLeapYear($一年= null){如果(零= = =$一年){$一年=日期(“Y”);}返回0= =$一年%400| | (0= =$一年%4& &0! =$一年%One hundred.);}}
别忘了更新example.com/src/app.php
相应的文件:
1 2 3 4
$路线->add (“leap_year”,新路由\路线(“/ is_leap_year /{一}”, (“年”= >零,“_controller”= >“日历\控制器\ LeapYearController:指数”)));
总结一下,这是新的文件布局:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
├──composer。Json├──composer。lock├──src│├──app.php│├──Simplex│├──Framework.php│├──Calendar│├──Controller│├──Model│├──LeapYear.php├──vendor│├──autoload.php├──web├──front.php
就是这样!我们的应用程序现在有四个不同的层,每个层都有一个明确定义的目标:
web / front.php
:前端控制器;唯一公开的PHP代码,使接口与客户端(它获得请求和发送响应),并提供样板代码来初始化框架和我们的应用程序;src /单纯形
:抽象传入请求处理的可重用框架代码(顺便说一下,它使你的控制器/模板更好地可测试——后面会详细介绍);src /日历
:我们的应用程序特定代码(控制器和模型);src / app.php
:应用程序配置/框架定制。
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。