关注点分离

编辑本页

警告:您正在浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 5.2,现已不再维护。

本页的更新版本用于Sy欧宝娱乐app下载地址mfony 6.2(当前稳定版本)。

关注点分离

现在我们的框架的一个缺点是我们需要复制和粘贴代码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名称空间单纯形使用欧宝娱乐app下载地址组件HttpFoundation请求使用欧宝娱乐app下载地址组件HttpFoundation响应使用欧宝娱乐app下载地址组件HttpKernel控制器ArgumentResolver使用欧宝娱乐app下载地址组件HttpKernel控制器ControllerResolver使用欧宝娱乐app下载地址组件路由异常ResourceNotFoundException使用欧宝娱乐app下载地址组件路由匹配器UrlMatcher框架私人匹配器私人controllerResolver私人argumentResolver公共函数__construct(UrlMatcher匹配器, ControllerResolvercontrollerResolver, ArgumentResolverargumentResolver->匹配器=匹配器->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 (路线上下文);controllerResolverControllerResolver ();argumentResolverArgumentResolver ();框架单纯形\框架(匹配器controllerResolverargumentResolver);响应框架->处理(请求);响应->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使用欧宝娱乐app下载地址组件HttpFoundation请求使用欧宝娱乐app下载地址组件HttpFoundation响应LeapYearController公共函数指数(请求请求一年leapYearLeapYear ();如果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许可证。