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

これを実現するには、少なくとも 2 つの慣用的な方法があります。

  1. イベントリスナー
  2. AOP — Symfony2 でJMSAopBundleを使用します。

このユース ケースにコンストラクターを使用するのは、Bad Idea™ です。オブジェクトのインスタンス化や値の設定に関係のないチェックのためにコンストラクターまたはセッターをハッキングすることは、まさにハックです。いかなる意味においても、論理的でも慣用的でもありません。頭で釘を打つようなものです — 実行可能ですが、より良いオプションが存在します.

于 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 に答える