0

次のようなコントローラーに init() メソッドがあります。

class MyController extends GlobalController
{

    private function init()
    {
        $this->setVariables($first = false, $second = true); // this comes from GlobalController
        $this->bill_repository = $this->setRepository('Bill');
        $this->var = .....;
        ....
    }

    ...
}

GlobalController は次のようになります。

class GlobalController extends BaseController
{
    //Frequently used variables
    protected $user;
    protected $em;
    protected $expense_repository;

    protected function setVariables($first, $second)
    {
        $this->user = $this->container->get('security.context')->getToken()->getUser();

        if($first){
            $this->em = $this->getDoctrine()->getEntityManager();
        }

        if($second){
            $this->expense_repository = $this->setRepository('Expense');
        }
    }
}

サービスを使用してこれを改善するにはどうすればよいですか? Symfony のドキュメントを読んだ後に得た理解は、この両方のコントローラーをサービスとして定義し、次のように定義する必要があるということです。

<service id="my_controller" class="path/MyController" />

<service id="mycontroller_manager" class="path/GlobalController">
    <call method="setVariables">
         <argument type="???" id="???" />
    </call>
</service>

しかし、私はこれについてよくわからず、引数部分を埋める方法がよくわからないか、プロパティインジェクションを使用する必要がありますか? これをよりよく理解し、コードを改善するのを手伝ってください:(

4

1 に答える 1

1

常に具象クラス(抽象クラ​​スを継承する)に注入を適用します。すべての抽象実装にデフォルトを設定することはできません。

あいまいな setArguments() メソッドに複数の引数を適用する代わりに、依存関係ごとに暗黙的にセッターを持ちたい場合があります (それぞれの依存関係に対して - 必要に応じて、これを単一のメソッドにリファクタリングできます)。

<service id="my_controller" class="path/MyController"
    <call method="setUser">
         <argument type="service" id="security.context" />
    </call>
    <call method="setDoctrine">
         <argument type="service" id="doctrine.orm.entity_manager" />
    </call>
    <call method="setRepositoryName">
         <argument>Expense<argument>
    </call>
/>

初期化メソッドはもうありません。

class MyController extends GlobalController
{
}

次に、依存関係を使用するためのセッターを実装する必要があります。

class GlobalController extends BaseController
{
    /** properties */

    public function setEntityManager(\Doctrine\Orm\EntityManager $entityManager)
    {
        $this->entityManager = $entityManager;
    }

    public function setUser(\Symfony\Component\Security\Core\SecurityContext $securityContext)
    {
        $this->user = $securityContext->getToken()->getUser();
    }

    public function setRepositoryName($repositoryName)
    {
        $this->repositoryName = $repositoryName;
    }
}
于 2013-07-19T13:06:21.963 に答える