1

我正在为一个项目使用 symfony 2。我有一个控制器,在每个函数之前我都会进行几次检查,我想要的是让 symfony 在对该控制器的每个请求时触发该函数。例如

class ChatController extends Controller
{
    public function put()
    {
        $user = $this->getUser();
        $this->checkSomething(); //just a custom function
        $this->checkSomethingElse(); //another custom function
        // do something
    }

    public function get()
    {
        $user = $this->getUser();
        $this->checkSomething(); //just a custom function
        $this->checkSomethingElse(); //another custom function
        // do something
    }
}`

我想实现与以下相同的目标:

class ChatController extends Controller
{
    private $user;

    public function init()
    {
        $this->user = $this->getUser();
        $this->checkSomething(); //just a custom function
        $this->checkSomethingElse(); //another custom function
    }

    public function put()
    {
        //here i can access $this->user          
        // do something
    }

    public function get()
    {
        //here i can access $this->user
        // do something
    }
}`

所以基本上我想要的是让一个函数表现得像一个构造函数。这可以在 Symfony2 中完成吗?

4

2 回答 2

2

至少有两种惯用的方法可以实现这一点:

  1. 事件监听器
  2. AOP — 在 Symfony2 中使用JMSAopBundle

对这个用例使用构造函数是一个坏主意™。侵入构造函数或设置器以进行与实例化对象或设置值无关的检查就是这样 - 黑客。在任何意义上,这都不合逻辑也不惯用语。这就像用头敲钉子一样——可行,但存在更好的选择。

于 2012-05-07T09:43:06.567 回答
-2

您可以覆盖 setContainer ,它的用途与构造相同。

public function setContainer(ContainerInterface $container = null)
{
    parent::setContainer($container);

    // Your stuff
}

但你可能真的不需要这样做。我认为随着您的设计的发展,您真的不需要检查,或者最好使用事件侦听器来完成功能。但这可以让你开始。

于 2012-05-07T10:46:52.453 回答