2013-04-03 13 views
5

同じモジュールの下に複数の名前空間/クラスを設定できません。 たとえば、「アカウント」というモジュールがあります。このモジュールでは、アカウント関連のすべてのクラス(会社:アカウント、ユーザー:ユーザー、外部api:「api」など)を含めたいと思います。モジュール構造は、次のようになります。..ZF2の同じモジュールの下に複数の名前空間があります

 /Account 
     - Module.php 
     - /config 
     - /view 
     - /src 
      - /Account 
      - /Controller (AccountController.php) 
      - /Form  (AccountForm.php) 
      - /Model  (Account.php + AccountTable.php) 
      - /User 
      - /Controller (UserController.php) 
      - /Form  (UserForm.php) 
      - /Model  (User.php + UserTable.php) 
      - /Api 
      - Api.php  (simple class) 

新しいビーイングZF2に、私はシンプルで愚かなものを維持することを決定し、モジュールをアカウントに複雑なルーティングを実装しようとするわけではありません。だから、UserControllerで用indexActionをトリガするために、URLは/ユーザーである必要があり

ここでモジュールクラスです(!):

namespace Account; 

use Account\Model\AccountTable; 
use Account\Model\UserTable; 

class Module 
{ 
    public function getAutoloaderConfig() 
    { 
     return array(
          'Zend\Loader\ClassMapAutoloader' => array(
                         __DIR__ . '/autoload_classmap.php', 
                       ), 
          'Zend\Loader\StandardAutoloader' => array(
                         'namespaces' => array(
                                 __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__, 
                                ), 
                       ), 
     ); 
    } 

    public function getServiceConfig() 
    { 
     return array(
          'factories' => array(
                  'Account\Model\AccountTable' => function($sm) { 
                                   $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); 
                                   $table = new AccountTable($dbAdapter); 
                                   return $table; 
                                  }, 
                  'Account\Model\UserTable'   => function($sm) { 
                                   $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); 
                                   $table = new UserTable($dbAdapter); 
                                   return $table; 
                                  },                
                ), 
     ); 
    }  

    public function getConfig() 
    { 
     return include __DIR__ . '/config/module.config.php'; 
    } 
} 

そしてmodule.configファイル

return array(
    'controllers' => array(
     'invokables' => array(
      'Account\Controller\Account' => 'Account\Controller\AccountController', 
      'Account\Controller\User'   => 'Account\Controller\UserController', 
     ), 
    ), 

    'router' => array(
     'routes' => array(
      'account' => array(
       'type' => 'segment', 
       'options' => array(
        'route'  => '/account[/:action[/:accountId]]', 
        'constraints' => array(
                'action'   => '[a-zA-Z][a-zA-Z0-9_-]*', 
                'accountId'  => '[0-9]+', 
               ), 
        'defaults' => array(
         'controller' => 'Account\Controller\Account', 
         'action'  => 'index', 
        ), 
       ), 
/* 
       'may_terminate' => true, 
       'child_routes' => array(
         'user' => array(
          'type' => 'literal', 
          'options' => array(
           'route' => '/user[/:action[/:userId]]', 
           'constraints' => array(
                'action'   => '[a-zA-Z][a-zA-Z0-9_-]*', 
                'userId'   => '[0-9]+', 
               ), 
           'defaults' => array(
             'controller' => 'Account\Controller\User', 
             'action'  => 'index' 
           ) 
         ) 
        ) 
       ), 
*/ 
      ), 
      'user' => array(
       'type' => 'segment', 
       'options' => array(
        'route'  => '/user[/:action[/:userId]]', 
        'constraints' => array(
                'action'  => '[a-zA-Z][a-zA-Z0-9_-]*', 
                'userId'  => '[0-9]+', 
               ), 
        'defaults' => array(
         'controller' => 'Account\Controller\User', 
         'action'  => 'index', 
        ), 
       ), 
      ) 


     ), 
    ), 

    'view_manager' => array(
     'template_path_stack' => array(
      'account' => __DIR__ . '/../view', 
      'user' => __DIR__ . '/../view', 

     ), 
    ), 
); 

しかしエラー私は "Class \ Account \ Controller \ UserControllerクラスが見つかりません"というメッセージが表示されます。私は何かを逃したと確信しています。どんな手がかりをお願いしますか?

ありがとうございました

答えて

11

あなたはStandardAutoloaderがあなたの新しい名前空間を知らせる必要があります:あなたの答えのための

public function getAutoloaderConfig() 
{ 
    return array(
     'Zend\Loader\ClassMapAutoloader' => array(
      __DIR__ . '/autoload_classmap.php', 
     ), 
     'Zend\Loader\StandardAutoloader' => array(
      'namespaces' => array(
       // This is for the Account namespace 
       __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__, 
       // And this is for the User namespace 
       'User'  => __DIR__ . '/src/' . 'User', 
      ), 
     ), 
    ); 
} 
module.config.phpで

return array(
    'controllers' => array(
     'invokables' => array(
      'Account\Controller\Account' => 'Account\Controller\AccountController', 
      // The key can be what ever you want, but the value must be a valid 
      // class name. Your UserController lives in the User namespace, 
      // not in Account 
      'Account\Controller\User' => 'User\Controller\UserController', 
     ), 
    ), 
    /* ... */ 
); 
+0

多くの感謝の仲間!カスタムネームスペースがロードされていないことを認識していませんでした。 –

1

StandardLoaderは、クラスの場所を知る必要があります。 名前空間というオプションを使用して定義することができます。これは絶対パス(または現在のスクリプトとの相対パス)を含む配列です。それは次のようになります。

'Zend\Loader\StandardAutoloader' => array(
    'namespaces' => array(
     __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__ 
    ) 
) 

__NAMESPACE__はモジュールの名前であり、__ DIR__絶対パスをModule.phpスクリプトに

ClassMapAutoloaderは、パフォーマンスのために使用されているチェックhttp://framework.zend.com/manual/2.0/en/modules/zend.loader.standard-autoloader.html

:あなたzf2がファイルシステム操作(StandardLoaderのやりかた)をしているコンテンツをブラウズしなければならないフォルダの代わりに、クラスキーとそのファイルへの正確なパスを定義します。

チェックhttp://framework.zend.com/manual/2.0/en/modules/zend.loader.class-map-autoloader.html

+0

感謝を。しかし、私はすでにmodule.php(getAutoloaderConfig())に名前空間をロードしています。それはあなたが意味することですか? –

+0

Ups!申し訳ありませんが、横スクロールを使用せず、配列が空であると思いました。あなたがスクロールしない場合、かっこが右に閉じます!あなたの問題を解決してうれしいです。 – lluisaznar

関連する問題