[Ethna] AppManagerの$afがnullになる問題


ActionFormで、
    public function setFormDef_PreHelper()
    {
        $userManager = $this->backend->getManager('user');
    $userManager->foo();
    }
などとした場合、userマネジャーのプロパティafはnullになります。($userManager->af = null)

マネジャーは一種のシングルトンなので、 この後アクションクラスやビュークラスからuserマネジャーを呼び出した場合、$userManagerのafはnullのままです。

ActionClassで、
    public function perform()
    {
        $userManager = $this->backend->getManager('user');
    $userManager->doSomething();  // マネジャー内ではafがnullのままである。
    }
うっかりマネジャー内で$this->afなどとしてしまうと、バグの原因になります。

原因

Ethna_Controllerの_trigger_WWWメソッドの中で、$backendにafをセットするタイミングが遅いことが原因です。
        $form_name = $this->getActionFormName($action_name);
        $this->action_form = new $form_name($this);
        $this->action_form->setFormDef_PreHelper(); // この時点で、$backend->afはnull
        $this->action_form->setFormVars();
        $backend->setActionForm($this->action_form);

対処方法

_trigger_WWWメソッドを修正する(またはオーバーライドして修正する)
修正前
        $form_name = $this->getActionFormName($action_name);
        $this->action_form = new $form_name($this);
        $this->action_form->setFormDef_PreHelper();
        $this->action_form->setFormVars();
        $backend->setActionForm($this->action_form);
修正後
        $form_name = $this->getActionFormName($action_name);
        $this->action_form = new $form_name($this);
        $backend->setActionForm($this->action_form);
        $this->action_form->setFormDef_PreHelper();
        $this->action_form->setFormVars();

たぶん悪影響などはないと思いますが、「こうした方がよい」などご意見・ご指摘いただけると幸いです。
カテゴリ: