倾听事件

倾听事件

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

添加网站页眉

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

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
——/模板/ base.html.twig+ + + b /模板/ base.html.twig@@ -14,6 +14,15 @@{% endblock %}   . {% endblock %+ <标题>+ < h1 > < a href = "{{路径(主页)}}" >留言板< / > < / h1 >+ < ul >+{%表示会议中的会议%}+ 
  • {{conference}}
  • . Id})}}">{{conference}}
    + {% endfor %}+ < / ul >+
    + < /头>{% block body %}{% endblock %} . {% block body %

    将此代码添加到布局中意味着所有扩展该布局的模板必须定义会议变量,必须从它们的控制器中创建和传递。

    因为我们只有两个控制员,你可能执行以下操作(不要将更改应用到您的代码,因为我们很快就会了解更好的方法):

    12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
    ——/ src /控制器/ ConferenceController.php+ + + b / src /控制器/ ConferenceController.php@@ -21,12 +21,13 @@ class ConferenceController extends AbstractController} #[路由('/conference/{id}',名称:'conference')]-公共功能显示(Request $ Request, Conference $ Conference, CommentRepository $ CommentRepository):响应+公共功能显示(请求$请求,会议$会议,CommentRepository $ CommentRepository, ConferenceRepository $ ConferenceRepository):响应{$offset = max(0, $request->query->getInt('offset', 0));$paginator = $commentRepository->getCommentPaginator($conference, $offset);返回$ this - >渲染(会议/ show.html。嫩枝”,(+ 'conference ' => $conferenceRepository->findAll(),'conference' => $conference, 'comments' => $paginator, 'previous' => $offset - CommentRepository::PAGINATOR_PER_PAGE

    想象一下必须更新数十个控制器。对所有新的都这么做。这不是很实际。一定有更好的办法。

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

    发现Symfony事件ob娱乐下载

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

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

    事件是定义良好的扩展点,使框架更加通用和可扩展。许多Symob娱乐下载fony组件(如Security、Messenger、Workflow或Mailer)广泛使用它们。

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

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

    为避免使用描述侦听器希望侦听哪些事件的配置文件,可以创建一个订阅者.订阅者是带有静态的侦听器getSubscribedEvents ()方法返回其配置。这允许订阅者自动在Symfony调度程序中注册。ob娱乐下载

    实现订阅用户

    现在你已经对这首歌烂熟于心了,使用maker bundle来生成一个订阅者:

    1
    ob娱乐下载symfony控制台创建:订阅用户TwigEventSubscriber

    该命令询问您想要收听的事件。选择ob娱乐下载\组件\ HttpKernel\事件\ ControllerEvent事件,它在控制器被调用之前被分派。这是注射的最佳时间会议全局变量,这样当控制器渲染模板时,Twig就可以访问它。更新您的订阅者如下:

    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 {+私人$twig;+ private $conferenceRepository;++公共函数__construct(环境$twig, ConferenceRepository $ ConferenceRepository)+ {+ $this->twig = $twig;+ $this->conferenceRepository = $conferenceRepository;+}+onControllerEvent(ControllerEvent $event):无效{- //…+ $this->twig->addGlobal('conferences', $this->conferenceRepository->findAll());}公共静态函数getSubscribedEvents():数组

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

    请注意

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

    按年份和城市分类会议

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

    12 3 4 5 6 7 8 9 10 11 12 13 14
    ——/ src /仓库/ ConferenceRepository.php+ + + b / src /仓库/ ConferenceRepository.php@@ -21,6 +21,11 @@ class ConferenceRepository扩展ServiceEntityRepository父::__construct($registry, Conference::class);}+公共函数findAll():数组+ {将其作为findBy +返回$ this - >([],['年' = > ' ASC ', '城市' = > ' ASC ']);+}+公共函数保存(会议$entity, bool $flush = false):无效{$this->getEntityManager()->persist($entity);

    在这一步的最后,网站看起来应该如下所示:

    /
    此工作,包括代码示例,是根据知识共享协议BY-NC-SA 4.0许可证。