关注点分离的

编辑该页面

警告:你浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 4.0,不再维护。

这个页面的更新版本Symf欧宝娱乐app下载地址ony 6.2(当前的稳定版本)。

关注点分离的

现在我们框架的一个问题是,我们需要复制和粘贴代码front.php每次我们创建一个新的网站。60行代码并不是那么多,但就好了,如果我们能够将这段代码包装到一个合适的类。它将给我们带来更好可重用性和更容易测试几个好处。

如果你有仔细看看代码,front.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日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美元匹配器,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因此:

1 2 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 /”}}}

请注意

作曲家自动装卸机的更新,运行作曲家dump-autoload

移动控制器日历\ \ LeapYearController控制器:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
/ / example.com/src/Calendar/Controller/LeapYearController.php名称空间日历\控制器;使用欧宝娱乐app下载地址\组件\HttpFoundation\请求;使用欧宝娱乐app下载地址\组件\HttpFoundation\响应;使用日历\模型\LeapYear;LeapYearController{公共函数指数(请求美元请求,美元一年){美元leapYear=LeapYear ();如果(美元leapYear- >isLeapYear (美元一年)){返回响应(“是的,这是一个闰年!”);}返回响应(“不,这不是一个闰年。);}}

和移动is_leap_year ()函数的类:

1 2 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:: indexAction”)));

总之,这里是新文件布局:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
example.com├──作曲家。json├──作曲家。锁├──src│├──app.php│└──单工│└──框架。php│└──日历│└──控制器││└──LeapYearController。php│└──模型│└──LeapYear。php├──供应商│└──自动装载。php└──web└──front.php

就是这样!我们的应用程序现在已经四个不同层次和每个人都有一个明确的目标:

  • web / front.php:前端控制器;唯一暴露PHP代码,使接口与客户(它被请求并发送响应)并提供样板式代码初始化框架和应用程序;
  • src /单纯形:抽象的可重用的框架代码的处理传入的请求(顺便说一下,它使得你的控制器/模板很容易测试,稍后详细说明);
  • src /日历:我们的特定于应用程序的代码(控制器和模型);
  • src / app.php:应用程序配置/框架定制。
这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。