0

私は現在ZF2で作業しており、助けが必要です。残念ながら、モジュールが1つしかない場合のルートを設定する例しか見つかりません。または、この例には、動的セグメントルートを含むアプリケーションモジュールがまだ含まれています。アプリケーションモジュールを完全に削除し、自分のモジュールだけですべてのルーティングを構成するようにしたい。

CLFrontend、CLBackendの2つのモジュールがあります

私のアプリケーション構成は次のようになります。

return array(
    'modules' => array(
        'ClFrontend',
        'ClBackend'
    ),
    'module_listener_options' => array(
        'config_glob_paths'    => array(
            'config/autoload/{,*.}{global,local}.php',
        ),
        'module_paths' => array(
            './module',
            './vendor',
        ),
    ),

);

自分の2つのモジュールをそこに登録したいと思います。ルーティングは次のようになります。

/の下にあるものはすべて、フロントエンドモジュールの抜粋/バックエンドに移動する必要があります

/-> IndexController-> indexaction

/ controller1-> Controller1Controller-> indexaction

/ controller1 / add-> Controller1Controller-> addaction

/ controller1 / add / 1 /-> COntroller1Controller-> addaction-> item 1

これで、/backendの下にあるすべてのものがバックエンドモジュールにルーティングされます。

/ backend-> BackendIndexController-> indexaction

/ backend / controller1-> BackendController1Controller-> indexaction

/ backend / controller1 / add-> BackendController1Controller-> addaction

/ backend / controller1 / add / 1 /-> BackendCOntroller1Controller-> addaction-> item 1

そして、私はそのルートを固定し、そのようなセグメントルートのようなものではないことを定義したいと思います:

:module /:controller /:action

私は次のようなものになりたい

/

/ controller1 / [:action [/:id]]

/ backend

/ backend / backendcontroller / [:action [/:id]]

Myapproachは次のとおりです。問題は、バックエンドルートでさえフロントエンドモジュールと一致しているように見えることです。私は404を取得します

要求されたURLはルーティングによって一致しませんでした。

または

致命的なエラー:クラス'ClBackend \ Controller\AnswerController'が/に見つかりません/ * / ** / * ** / checklistenassistent3 / vendor / ZF2 / library / Zend / ServiceManager / AbstractPluginManager.php(177行目)

CLFrontend / config / module.config.php

return array(
        'controllers' => array(
                'invokables' => array(
                        'ClFrontend\Controller\Index' => 'ClFrontend\Controller\IndexController',
                        'ClFrontend\Controller\User' => 'ClFrontend\Controller\UserController',
                ),
        ),
        'router' => array(
            'routes' => array(
                'home' => array(
                    'type'    => 'Zend\Mvc\Router\Http\Literal',
                    'options' => array(
                        'route'    => '/',
                        'defaults' => array(
                            'controller' => 'ClFrontend\Controller\Index',
                            'action'     => 'index',
                        ),
                    ),
                ),
            ),
        ),
        'view_manager' => array(
                'display_not_found_reason' => true,
                'display_exceptions'       => true,
                'doctype'                  => 'HTML5',
                'not_found_template'       => 'error/404',
                'exception_template'       => 'error/index',
                'template_map' => array(
                        'layout/layout'           => __DIR__ . '/../view/cl-frontend/layout/layout.phtml',
                        'application/index/index' => __DIR__ . '/../view/cl-frontend/index/index.phtml',
                        'error/404'               => __DIR__ . '/../view/cl-frontend/error/404.phtml',
                        'error/index'             => __DIR__ . '/../view/cl-frontend/error/index.phtml',
                ),
                'template_path_stack' => array(
                        __DIR__ . '/../view',
                ),
        ),
);

CLBackend / config / module.config.php

return array(
    'controllers' => array(
            'invokables' => array(
                    'ClBackend\Controller\Answer'       => 'ClBackend\Controller\AnswerController',
                    'ClBackend\Controller\AnswerGroup'  => 'ClBackend\Controller\AnswerGroupController',
                    'ClBackend\Controller\Category'     => 'ClBackend\Controller\CategoryController',
                    'ClBackend\Controller\Checklist'    => 'ClBackend\Controller\ChecklistController',
                    'ClBackend\Controller\Index'        => 'ClBackend\Controller\IndexController',
                    'ClBackend\Controller\Question'     => 'ClBackend\Controller\QuestionController',
                    'ClBackend\Controller\User'         => 'ClBackend\Controller\UserController',
            ),
    ),
    'router' => array(
        'routes' => array(
            'backend' => array(
                'type'    => 'Zend\Mvc\Router\Http\Literal',
                'options' => array(
                    'route'    => '/backend',
                    'defaults' => array(
                        'controller' => 'ClBackend\Controller\Index',
                        'action'     => 'index',
                    ),
                    'may_terminate' => true
                ),
                'child_routes' => array (
                    'answer' => array(
                            'type'    => 'Zend\Mvc\Router\Http\Segment',
                            'options' => array(
                                    'route'    => '/answer/:action/:id',
                                    'defaults' => array(
                                            'controller' => 'ClBackend\Controller\Answer',
                                            'action'     => 'index',
                                    ),
                            ),
                    ),
                    'answergroup' => array(
                            'type'    => 'Zend\Mvc\Router\Http\Segment',
                            'options' => array(
                                    'route'    => '/answergroup/:action/:id',
                                    'defaults' => array(
                                            'controller' => 'ClBackend\Controller\AnswerGroup',
                                            'action'     => 'index',
                                    ),
                            ),
                    ),
                    'category' => array(
                            'type'    => 'Zend\Mvc\Router\Http\Segment',
                            'options' => array(
                                    'route'    => '/category/:action/:id',
                                    'defaults' => array(
                                            'controller' => 'ClBackend\Controller\Category',
                                            'action'     => 'index',
                                    ),
                            ),
                    ),
                    'checklist' => array(
                            'type'    => 'Zend\Mvc\Router\Http\Segment',
                            'options' => array(
                                    'route'    => '/checklist/:action/:id',
                                    'defaults' => array(
                                            'controller' => 'ClBackend\Controller\Checklist',
                                            'action'     => 'index',
                                    ),
                            ),
                    ),
                    'question' => array(
                            'type'    => 'Zend\Mvc\Router\Http\Segment',
                            'options' => array(
                                    'route'    => '/question/:action/:id',
                                    'defaults' => array(
                                            'controller' => 'ClBackend\Controller\Question',
                                            'action'     => 'index',
                                    ),
                            ),
                    ),
                    'user' => array(
                            'type'    => 'Zend\Mvc\Router\Http\Segment',
                            'options' => array(
                                    'route'    => '/user/:action[/:id]',
                                    'defaults' => array(
                                            'controller' => 'ClBackend\Controller\User',
                                            'action'     => 'index',
                                    ),
                            ),
                    ),
                ),
            ),
        ),
    ),
);
4

1 に答える 1

0

コントローラファクトリを検討しましたか?これにより、単一のルートを照合し、ロジックを使用して使用するコントローラーを決定できます。

たとえば、ルートは次のようになります。

'backend-default' => array(
    'type' => 'Segment',
    'options' => array(
        'route' => '/:controller_type[/:action][/id]',
        'defaults' => array(
            'action' => 'index',
            'controller' => 'MyFactory'
        ),
    ),
),

このルートが一致した場合は、コントローラーファクトリ(MyFactory)が使用されます。このファクトリ内では、ルート一致パラメーターにアクセスできます。これらのパラメーターを使用すると、適切なコントローラーを返すことができるはずです。

バックエンドコントローラーであることを示す追加のパラメーターを渡すこともできます(単一のファクトリを使用します)。

use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;

class MyFactoryController implements FactoryInterface
{
    public function createService(ServiceLocatorInterface $serviceLocator)
    {
        // $serviceLocator is a Zend\Mvc\Controller\ControllerManager
        $app = $serviceLocator->getServiceLocator()->get('application');
        $routeMatch = $app->getMvcEvent()->getRouteMatch();

        var_dump($routeMatch);

        /**
         * Create controller based off $routeMatch params
         */

        return $controller;
    }
}

コントローラファクトリでは、controller_type変数を有効なクラス名にルックアップするか、呼び出し可能な名前の前にcontroller_typeを付けることができます。

自分でこのルートを取るかどうかはわかりませんが、これがあなたが達成しようとしていることにいくらか役立つことを願っています。

于 2012-11-22T17:37:37.780 に答える