步骤12:监听事件

5.2版本
维护 没有维护的
5.0

听事件

当前的布局缺少一个导航标题来返回主页或从一个会议切换到下一个会议。

添加网站标题

任何应该在所有网页上显示的东西,比如标题,都应该是主基础布局的一部分:

patch_file
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
——/模板/ base.html.twig+ + + b /模板/ base.html.twig@@ -8,6 +8,15 @@{% block javascripts %}{% endblock %}  + <标题>+ < h1 > < a href = "{{路径(主页)}}" >留言板< / > < / h1 >+ < ul >+ {% for conference in conferences %}+ 
  • + {% endfor %}+ < / ul >+ <人力资源/ >+ < /头>{% block body %}{% endblock %}
  • 将此代码添加到布局中意味着所有扩展它的模板都必须定义一个会议变量,必须创建并从它们的控制器传递。

    因为我们只有两个控制器可能做以下操作(不要将更改应用到你的代码中,因为我们很快会学到更好的方法):

    12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
    ——/ src /控制器/ ConferenceController.php+ + + b / src /控制器/ ConferenceController.php@@类ConferenceController扩展了AbstractController} #(路线(“/会议/ {id}”,名字:“会议”))—public function show(Request $ Request, Conference $ Conference, CommentRepository $ CommentRepository): Response+ public function show(Request $ Request, Conference $ Conference, CommentRepository $ CommentRepository, ConferenceRepository $ ConferenceRepository){$offset = max(0, $request->查询->getInt('offset', 0));getCommentPaginator($conference, $offset); / /删除页面返回新的反应($ this - >树枝>渲染(会议/ show.html。嫩枝”,(+ '会议' => $conferenceRepository->findAll(),$paginator ('previous') => $offset - comment - pository::PAGINATOR_PER_PAGE, / /分页器

    想象一下必须更新几十个控制器。对所有新的也做同样的事。这不是很实用。一定有更好的办法。

    Twig有全局变量的概念。一个全局变量在所有呈现的模板中可用。您可以在配置文件中定义它们,但它只对静态值有效。要将所有会议添加为一个Twig全局变量,我们将创建一个监听器。

    发现Symfony事件ob娱乐下载

    ob娱乐下载Symfony内置了一个事件分派器组件。一个调度程序分派某些事件在特定的时间听众可以听。监听器是框架内部的钩子。

    例如,有些事件允许您与HTTP请求的生命周期交互。在处理请求期间,当创建了请求、即将执行控制器、准备发送响应或抛出异常时,dispatcher就会分派事件。一个侦听器可以监听一个或多个事件,并根据事件上下文执行一些逻辑。

    事件是定义良好的扩展点,使框架更具通用性和可扩展性。许多Symob娱乐下载fony组件,如安全性、信使、工作流或邮件发送器,都广泛地使用它们。

    事件和监听器的另一个内置示例是命令的生命周期:您可以创建一个监听器来执行之前的代码任何命令运行。

    任何包或包也可以分发它们自己的事件,以使它们的代码可扩展。

    为了避免配置文件描述侦听器想要侦听的事件,请创建订阅者。订阅者是带有静态的监听器getSubscribedEvents ()方法,该方法返回其配置。这允许订阅者在Symfony调度程序中自动注册。ob娱乐下载

    实现一个用户

    现在你已经记住这首歌了,使用maker bundle生成一个订阅者:

    1
    $ ob娱乐下载symfony控制台制作:订户TwigEventSubscriber

    该命令询问您希望侦听哪个事件。选择ob娱乐下载Symfony \组件\ HttpKernel \ \ ControllerEvent事件事件,该事件在控制器被调用之前被调度。这是注射的最佳时机会议全局变量,这样当控制器渲染模板时,Twig就可以访问它。更新您的订户如下:

    patch_file
    12 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
    ——/ src / EventSubscriber / TwigEventSubscriber.php+ + + b / src / EventSubscriber / TwigEventSubscriber.php@@ -2,14 +2,25 @@名称空间的应用程序\ EventSubscriber;+使用App \ Repository \ ConferenceRepository;使用Syob娱乐下载mfony \ \ EventDispatcher \ EventSubscriberInterface组件;使用Syob娱乐下载mfony \组件\ HttpKernel \ \ ControllerEvent事件;+使用树枝\环境;类TwigEventSubscriber实现EventSubscriberInterface {+私人美元树枝;+私人conferenceRepository美元;++公共函数__construct(环境$twig,会议存储库$会议存储库)+ {+ $this->twig = $twig;+ $this->conferenceRepository = $conferenceRepository;+}+public function onControllerEvent(ControllerEvent $event) {- / /…+ $ this - >树枝> addGlobal(“会议”,$ this - > conferenceRepository - > findAll ());} public static function getSubscribedEvents()

    现在,您可以添加任意数量的控制器会议变量将始终在树枝中可用。

    请注意

    我们将在后面的步骤中讨论更好的性能方面的替代方案。

    按年份和城市分类会议

    按年排序会议列表可以方便浏览。我们可以创建一个自定义方法来检索和排序所有会议,但是,我们将重写的默认实现findAll ()方法,以确保排序适用于所有地方:

    patch_file
    12 3 4 5 6 7 8 9 10 11 12 13 14
    ——/ src /仓库/ ConferenceRepository.php+ + + b / src /仓库/ ConferenceRepository.php@@ 19,6 +19,11 @@类ConferenceRepository扩展了ServiceEntityRepository父:__construct(美元注册表、会议::类);}+ public function findAll()+ {将其作为findBy +返回$ this - >([],['年' = > ' ASC ', '城市' = > ' ASC ']);+}+// ** // * @return Conference[]返回一个会议对象数组// */

    在这一步的最后,网站看起来应该像下面这样:


    • «前步骤11:代码分支
    • 下一个”步骤13:管理Doctrine对象的生命周期

    该工作,包括代码示例,根据anc - sa知识共享4.0许可证。