2013-04-03 22 views
5

Ho problemi a configurare più domini/classi nello stesso modulo. Ad esempio, ho un modulo chiamato "Account", nel quale vorrei includere tutte le classi relative all'account (aziende: "account", utenti: "utenti", apri esterni: "api" ecc.). struttura del modulo simile a questo ..Spazi dei nomi multipli sotto lo stesso modulo in 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) 

Essendo nuovo ZF2, ho deciso di mantenere le cose semplici e stupido e non provare l'implementazione del routing complesso ad Account modulo. Così, al fine di innescare indexAction per UserController, URL deve essere/utente

Ecco il modulo di classe (!):

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'; 
    } 
} 

e il file 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', 

     ), 
    ), 
); 

Ma l'errore Sto ottenendo è, "Account di classe \ Controller \ UserController" non trovato ". Sono sicuro di aver perso qualcosa. Qualsiasi indizio per favore?

Grazie

risposta

11

È necessario lasciare che il StandardAutoloader relativi il vostro nuovo spazio dei nomi:

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', 
      ), 
     ), 
    ); 
} 

Nel 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

Molte grazie amico! Non ho capito che i namespace personalizzati non venivano caricati. –

1

StandardLoader deve sapere dove trovare le classi. È possibile definirlo con un'opzione denominata spazi dei nomi, che è un array che contiene percorsi assoluti (o relativi allo script corrente). Esso dovrebbe essere così:

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

__NAMESPACE__ è il nome del modulo, e __DIR__ il percorso assoluto dello script Module.php

check http://framework.zend.com/manual/2.0/en/modules/zend.loader.standard-autoloader.html

Il ClassMapAutoloader viene utilizzato per le prestazioni: si definire la chiave di classe e il suo percorso esatto per il file, invece di una cartella che zf2 deve sfogliare il suo contenuto eseguendo operazioni sul filesystem (metodo di StandardLoader).

check http://framework.zend.com/manual/2.0/en/modules/zend.loader.class-map-autoloader.html

+0

Molte grazie per la tua risposta. Ma sto già caricando spazi dei nomi in module.php (getAutoloaderConfig()). È questo che vuoi dire? –

+0

Ups! Scusa se non ho usato lo scroll orizzontale e ho pensato che i tuoi array fossero vuoti. Se non si scorre la parentesi si chiude a destra! Sono felice di aver risolto il tuo problema. – lluisaznar

Problemi correlati