与所有控制器共享方法:最佳实践

时间:2014-07-24 20:49:46

标签: symfony


我正在symfony2中开发一个通知系统,我需要为我正在运行的每个页面收到通知。
简单的解决方案是在每个控制器中复制函数的内容,并从$this调用函数 如何为每个控制器提供通知功能?我听说将控制器设置为服务是不好的做法。什么是最好的做法呢?

3 个答案:

答案 0 :(得分:2)

如果只是在模板中使用它来输出那么最好的方法是使用自定义TwigFunction,然后在基础/布局/扩展模板中调用它,就像这样..

TwigExtension

namespace Acme\NotificationBundle\Twig;

use Acme\NotificationBundle\Provider\NotificationProviderInterface;

class AcmeNotificationExtension extends \Twig_Extension
{
    protected $container;
    protected $notificationProvider;

    public function __construct(
        ContainerInterface $container,
        NotificationProviderInterface $notificationProvider
    )
    {
        $this->notificationProvider = $notificationProvider;
    }

    public function getFunctions()
    {
        return array(
            new \Twig_SimpleFunction(
                'acme_render_notifications', 
                array($this, 'renderNotifications')
            ),
        );
    }

    public function renderNotification($template = 'default:template.html.twig')
    {
        $notifications = $this->notificationsProvider->getCurrentNotifications();
                         // Or whatever method provides your notifications

        return $this->container->get('templating')->render(
            $template,
            array('notifications' => $notifications)
        );
    }

    public function getName()
    {
        return 'acme_notification_extension';
    }
}

服务

parameters:
    acme.twig.notification_extension.class: 
                    Acme\NotificationBundle\Twig\AcmeNotificationExtension

services:
    acme.twig.notification_extension:
        class: %acme.twig.notification_extension.class%
        arguments:
            - @service_container
            - @acme.provider.notifcation
              // Or what ever your notification provider service is named
        tags:
            - { name: twig.extension }

通过这种方式,您可以使用acme_render_notifications()(使用默认模板)或acme_render_notifications('AcmeOtherBundle:Notifications:in_depth.html.twig')(如果需要使用其他模板)在任何模板中调用您的通知,您的控制器甚至无法触及

如果它被放在像......这样的块中的父模板中。

{% block notifications %}
    {{ acme_render_notifications() }}
{% endblock notifications %}

..然后它会在每个页面上运行,除非你覆盖了你的子类中的块。

答案 1 :(得分:0)

我会这样做,我认为它是最好的做法之一,就是使用该功能设置服务,然后在每个控制器中实例化它。

答案 2 :(得分:0)

毫无疑问,这是不好的做法, 许多解决方案都是可能的,我们将在这里讨论抽象级别

  • 根据要求,全局实用程序可以与不同的范围(应用程序,会话范围)一起使用
  • 使所有可用控制器都可以访问此实用程序