Pregunta Múltiples espacios de nombres bajo el mismo módulo en ZF2


Tengo problemas para configurar múltiples espacios de nombres / clases en el mismo módulo. Por ejemplo, tengo un módulo llamado "Cuenta", en el cual me gustaría incluir todas las clases relacionadas con la cuenta (compañías: 'cuentas', usuarios: 'usuarios', api externa: 'api', etc.). La estructura del módulo se ve así ..

        /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)

Siendo nuevo en ZF2, decidí mantener las cosas simples y estúpidas y no intentar implementar enrutamiento complejo al módulo de Cuenta. Entonces, para disparar indexAction para UserController, url debe ser / user (!)

Aquí está la clase de módulo:

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

Y el archivo 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',

        ),
    ),
);

Pero el error que estoy obteniendo es que no se encontró "Class 'Account \ Controller \ UserController". Estoy seguro de que me he perdido algo. Alguna pista, por favor?

Gracias


5
2018-04-03 01:02


origen


Respuestas:


Debes dejar que el StandardAutoloader Conozca su nuevo espacio de nombres:

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

En el 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',
        ),
    ),
    /* ... */
);

12
2018-04-03 05:23



El StandardLoader necesita saber dónde encontrar las clases. Puede definirlo con una opción llamada espacios de nombres que es una matriz que contiene rutas absolutas (o relativas a la secuencia de comandos actual). Debe tener un aspecto como este:

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

__NAMESPACE__ es el nombre del módulo, y __DIR__ la ruta absoluta al script Module.php

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

El ClassMapAutoloader se usa para el rendimiento: usted define la clave de clase y su ruta exacta al archivo, en lugar de una carpeta en la que zf2 tiene que navegar por su contenido realizando operaciones del sistema de archivos (a la manera de StandardLoader).

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


1
2018-04-03 04:41