我正在symfony2中开发一个通知系统,我需要为我正在运行的每个页面收到通知。
简单的解决方案是在每个控制器中复制函数的内容,并从$this
调用函数
如何为每个控制器提供通知功能?我听说将控制器设置为服务是不好的做法。什么是最好的做法呢?
答案 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)
毫无疑问,这是不好的做法, 许多解决方案都是可能的,我们将在这里讨论抽象级别