4

Zend Framework 2を初めて使用します。プロジェクトを開始し、そのセキュリティをZfcAdmin、ZfcUser、ZfcUserAdmin、およびBjyAuthorizeで管理したいと考えています。私が最初にやろうとしているのは、作成ユーザーのプロセスを変更することです。新しいユーザーを作成した直後に、そのユーザーに役割を割り当てられるようにしたいと考えています。

私が直面している最初の問題は、ユーザーが作成されたときに、コントローラーがユーザーのリストページにリダイレクトすることです。この動作を変更する必要があります。編集ページにリダイレクトされます。ここで、最近作成されたユーザーに対してN個のロールを選択できます(エンティティとの別の戦争になります...)。UserAdminController(ZfcUserAdmin)をオーバーライドすることを選択しました。それは私がそれを達成するためにしたことです:

1.他のモジュールのプロパティをオーバーライドできるようにするために、 application.config.phpの最後の場所に管理モジュール(MyAdministration)をロードします。

2. MyAdministration / config / module.config.phpのZfcUserAdminコントローラーをオーバーライドして、次のものを使用します。

(...)
'controllers' => array(
    'invokables' => array(
        'zfcuseradmin' => 'MyAdministration\Controller\MyAdministrationController',
    ),
),
(...)

3.クラス MyAdministration/src / MyAdministration / Controller/MyAdministrationController.phpを作成しました

4.ZfcUserAdminを拡張することを宣言しました

namespace Administracion\Controller;
(...)
use ZfcUserAdmin\Controller\UserAdminController;

class AdministracionController extends UserAdminController {
(...)

5. createAction関数をオーバーライドして、編集ページにリダイレクトしました

(...)
public function createAction() {
(...)
return $this->redirect()->toRoute('zfcadmin/zfcuseradmin/edit/:userId', 
    array('userId' => $user->getId()));
}
(...)

それは私がそれを正しくしたかどうかわからないところです。ネットを検索してデバッグすることで、コントローラーの名前空間を目的のテンプレートへのパスに変換するInjectTemplateListenerというクラスがあることがわかりました。私のコントローラーは' my-administration/ my-administration / editに変換されますが、これはどこにもつながりません。テンプレートはZfcUserAdminモジュールに属しています。正しいパスは、そのコントローラー(ZfcUserAdmin \ Controller \ UserAdminController)によって取得されたパスです 。zfc-user-admin/ user-admin / edit

また、テンプレートパスは手動で記述できることも学びました。これらのパスは、InjectTemplateListenerによって無視されます。それが私が使ったアプローチです。MyAdministration / config / module.config.phpに、私は次のように書いています。

(...)
'view_manager' => array( 
    'template_map' => array(
        'my-administration/my-administration/list' => __DIR__ . '/../../../vendor/ZfcUserAdmin/view/zfc-user-admin/user-admin/list.phtml',
        'my-administration/my-administration/create' => __DIR__ . '/../../../vendor/ZfcUserAdmin/view/zfc-user-admin/user-admin/create.phtml',
        'my-administration/my-administration/edit' => __DIR__ . '/../../../vendor/ZfcUserAdmin/view/zfc-user-admin/user-admin/edit.phtml',
        'my-administration/my-administration/pagination_userlist' => __DIR__ . '/../../../vendor/ZfcUserAdmin/view/zfc-user-admin/user-admin/pagination_userlist.phtml',
    ),
    (...) 
),

それがそれを達成するための最良の方法であるかどうかはわかりません。テンプレートパスを手動で作成するのではなく、それを行うためのより良い方法があるはずだと思います。コントローラのオーバーライドについていくつかのことを見つけましたが、例はありません...これで大丈夫ですか?誰かがオーバーライドを行うためのより良いアプローチを持っていますか?

ありがとう!

4

1 に答える 1

4

テンプレート名はリスナーが挿入できるのは正しいです。これは、テンプレート名が設定されていない場合の1つの条件の下にあります。

したがって、このアクションでは、テンプレートの挿入リスナーがテンプレート名を挿入します。

namespace MyModule;

class MyController
{
  public function myAction()
  {
    return new ViewModel;
  }
}

テンプレートはになりますmy-module/my-controller/my-action。ただし、テンプレートを設定すると、リスナーはスキップされます。

namespace MyModule;

class MyController
{
  public function myAction()
  {
    $view = new ViewModel;
    $view->setTemplate('another-module/my-controller/my-action');

    return $view;
  }
}

返されたデータをフォームでオーバーライドしているコントローラーでは、単純な配列であり、ビューモデルでさえないことがわかります。リダイレクトプラグインはResponseオブジェクトを返します。

したがって、戻り値が配列であるかどうかを確認し、配列である場合は、テンプレートを明示的に設定します。これは、リスナーをスキップしてテンプレート名を挿入します。

namespace MyAdminModule;

use ZfcUserAdmin\Controller\UserAdminController as BaseUserAdminController;

use Zend\View\Model\ViewModel;
use Zend\Http\Response;

class UserAdminController extends BaseUserAdminController
{
    public function createAction()
    {
        $result = parent::createAction();

        if ($result instanceof Response) {
            // Old behaviour
            return $this->redirect()->toRoute('zfcadmin/zfcuseradmin/edit/:userId', 
                                              array('userId' => $user->getId()));
        }

        // $result is array
        $view = new ViewModel;
        $view->setVariables($result);
        $view->setTemplate('zfc-user-admin/user-admin/create');

        return $view;
    }
}

ここでテンプレート名を直接設定するため、構成でテンプレートマップの操作をスキップできます。これにより、モジュールの外部のパスを使用してテンプレートパスをハードコーディングしたため、柔軟性も向上します。また、別のモジュールでzfcUserAdminテンプレートマップをオーバーライドするオプションもあります。

于 2012-12-29T13:28:03.203 に答える