2015-11-16 25 views
10

Ho un problema con il routing dei moduli. Ho 2 moduli, applicazione e amministratore. Ogni moduli hanno indexAction come azione di default:Problema di routing dei nomi dei moduli di Zend framework 2

localhost/-> Application/indice

localhost/admin/-> Admin/index

Admin/index funziona solo con localhost/admin/index/

Questo problema si verifica quando il nome di un modulo inizia con la lettera "A". Se rinominare Admin su "Cars", localhost/cars/funziona correttamente!

l'errore è:

A 404 error occurred 
The requested controller was unable to dispatch the request. 
Controller: 
Application\Controller\Application 
No Exception available 

Questo è module.config.php all'interno del modulo di applicazione:

<?php 
return array(
    'router' => array(
     'routes' => array(
      'Application' => array(
       'type' => 'Segment', 
       'options' => array(
        'route' => '[/][:action/]', 
        'constraints' => array(
         'action' => '[a-zA-Z][a-zA-Z0-9_-]*',       
        ), 
        'defaults' => array(
         'controller' => 'Application\Controller\Application', 
         'action'  => 'index', 
        ), 
       ), 
      ), 
     ), 
    ), 
    'controllers' => array(
     'invokables' => array(
      'Application\Controller\Application' => 'Application\Controller\IndexController' 
     ), 
    ), 

    'view_manager' => array(
     'display_not_found_reason' => true, 
     'display_exceptions'  => true, 
     'not_found_template'  => 'error/404', 
     'exception_template'  => 'error/index', 
     'template_map' => array(
      'layout/layout'   => __DIR__ . '/../view/layout/layout.phtml', 
      'Application/Application/index' => __DIR__ . '/../view/Application/index/index.phtml', 
      'error/404'    => __DIR__ . '/../view/error/404.phtml', 
      'error/index'    => __DIR__ . '/../view/error/index.phtml', 
     ), 
     'template_path_stack' => array(
      'Application' => __DIR__ . '/../view', 
     ), 
    ), 
); 
?> 

questo è module.config.php all'interno del modulo di amministrazione:

<?php 
return array(
    'router' => array(
     'routes' => array(
      'Admin' => array(
       'type' => 'Segment', 
       'options' => array(
        'route' => '/admin/[:action/]', 
        'constraints' => array(
         'action' => '[a-zA-Z][a-zA-Z0-9_-]*' 
        ), 
        'defaults' => array(
         'controller' => 'Admin\Controller\AdminController', 
         'action' => 'index' 
        ), 
       ), 
      ), 
     ), 
    ), 
    'controllers' => array(
     'invokables' => array(
      'Admin\Controller\AdminController' => 'Admin\Controller\AdminController' 
     ), 
    ), 
    'view_manager' => array(
     'display_not_found_reason' => true, 
     'display_exceptions'  => true, 
     'template_path_stack'  => array(
      'Admin' => __DIR__ . '/../view', 
     ), 
    ), 
); 
?> 

IndexController.php

namespace Application\Controller; 

use Zend\Mvc\Controller\AbstractActionController; 
use Zend\View\Model\ViewModel; 

class IndexController extends AbstractActionController 
{ 

    public function indexAction(){ 

    } 
} 

AdminController.php

namespace Admin\Controller; 

use Zend\Mvc\Controller\AbstractActionController; 
use Zend\View\Model\ViewModel; 

class AdminController extends AbstractActionController 
{ 

    public function indexAction() 
    {} 
} 

Qualcuno mi può aiutare?

+0

Che tipo di messaggi di errore si verificano? –

+1

La richiesta '/ admin /' corrisponde sia alle rotte dell'applicazione che di amministrazione. Per risolvere il problema è necessario rimuovere questa ambiguità. –

+0

Si è verificato un errore 404 Il controller richiesto non è stato in grado di inviare la richiesta. Controller: Applicazione \ Controller \ Applicazione Nessuna eccezione disponibile –

risposta

3

Prima il tuo errore The requested controller was unable to dispatch the request. si verifica solo quando il router non può inviare la richiesta all'azione definita. Quindi per favore verifica che il tuo controller sia corretto e che le azioni siano presenti e richiamabili.

Come già sottolineato, il percorso /admin/ punterà a due endpoint configurati. Questo non è un problema, in primo luogo, quando la rotta dell'amministratore dovrebbe essere definita prima del percorso dell'applicazione nella configurazione.

Pertanto il percorso del percorso /admin/ non verrà mai instradato al numero AdminController poiché l'altra rotta dinamica verrà confrontata per prima.

Per ottenere il risultato previsto, utilizzare l'impostazione priority nel percorso per assicurarsi che la rotta Admin corrisponda prima del percorso Application.

'router' => array(
    'routes' => array(
     'Admin' => array(
      'priority' => 100, 
      'type' => 'Segment', 
      'options' => array(
       'route' => '/admin/[:action/]', 
       'constraints' => array(
        'action' => '[a-zA-Z][a-zA-Z0-9_-]*' 
       ), 
       'defaults' => array(
        'controller' => 'Admin\Controller\AdminController', 
        'action' => 'index' 
       ), 
      ), 
     ), 
    ), 
), 

Accanto alla tua domanda, non finiscono script PHP con ?> in quanto ciò potrebbe portare ad errori quando uno spazio bianco è dopo il tag di chiusura.

+0

funziona! grazie mille per l'aiuto! –