2012-10-25 12 views
8

Dopo una lunga ricerca senza esito positivo. prima che mi arrendo, vorrei chiedere:Zend Framework 2 Routing dei sottodomini al modulo

C'è un modo per instradare un sottodominio a un modulo in Zend Framework 2? come:

sottodominio =>modulo
api.site.com => api
dev.site.com => dev
admin.site.com => amministratore
site.com = > public

Ho provato a farlo in questo modo ma non riesco ad accedere a controller diversi da quello predefinito (Indice)

'router' => array(
    'routes' => array(
     'home' => array(
      'type' => 'Hostname', 
      'options' => array(
       'route' => 'site.com', 
       'defaults' => array(
        '__NAMESPACE__' => 'Application\Controller', 
        'controller' => 'Index', 
        'action'  => 'index', 
       ), 
      ) 
     ) 
    ), 
), 

Grazie per aver dedicato del tempo per aiutarmi.

risposta

5

Zend Framework 2 non ha una nozione di routing ai moduli; tutti i mapping di routing sono tra un pattern URI (per route HTTP) e una classe controller specifica. Detto questo, Zend\Mvc fornisce un listener di eventi (Zend\Mvc\ModuleRouteListener) che consente di definire un pattern URI che si associa a più controller in base a un determinato pattern e pertanto emula il "routing del modulo". Per definire un tale percorso, si potrebbe inserire questo come la configurazione di routing:

'router' => array(
    'routes' => array(
     // This defines the hostname route which forms the base 
     // of each "child" route 
     'home' => array(
      'type' => 'Hostname', 
      'options' => array(
       'route' => 'site.com', 
       'defaults' => array(
        '__NAMESPACE__' => 'Application\Controller', 
        'controller' => 'Index', 
        'action'  => 'index', 
       ), 
      ), 
      'may_terminate' => true, 
      'child_routes' => array(
       // This Segment route captures the requested controller 
       // and action from the URI and, through ModuleRouteListener, 
       // selects the correct controller class to use 
       'default' => array(
        'type' => 'Segment', 
        'options' => array(
         'route' => '/[:controller[/:action]]', 
         'constraints' => array(
          'controller' => '[a-zA-Z][a-zA-Z0-9_-]*', 
          'action'  => '[a-zA-Z][a-zA-Z0-9_-]*', 
         ), 
         'defaults' => array(
          'controller' => 'Index', 
          'action'  => 'index', 
         ), 
        ), 
       ), 
      ), 
     ), 
    ), 
), 

(Click here to see an example of this @ ZendSkeletonApplication)

Questa è solo metà dell'equazione, però. È inoltre necessario registrare ogni classe di controller nel modulo utilizzando un formato di denominazione specifico. Questo viene fatto anche attraverso lo stesso file di configurazione:

'controllers' => array(
    'invokables' => array(
     'Application\Controller\Index' => 'Application\Controller\IndexController' 
    ), 
), 

la chiave dell'array è l'alias ModuleRouteListener userà per trovare il controller a destra, e deve essere nel seguente formato:

<Namespace>\<Controller>\<Action> 

Il valore assegnato a questa chiave dell'array è il nome completo della classe controller.

(Click here to see an example of this @ ZendSkeletonApplication)

Nota: se non si utilizza ZendSkeletonApplication, o ha rimosso del modulo applicazione predefinita, è necessario registrare il ModuleRouteListener in uno dei propri moduli. Click here to see an example of how ZendSkeletonApplication registers this listener

+2

Grazie mille per le spiegazioni chiare e precise. Ho preso la tua soluzione. Ho faticato così tanto su questo. – Sapher

+0

È stato grandioso, grazie. – cr125rider

+0

uso mamp pro e creo un sottodominio sul mio nome host virtuale, quindi dopo aver usato reseller.myhost.com/test è okey ma se scrivo reseller.myhost.com va all'indice dell'applicazione non indexaction del mio modulo –

4

Se ho capito scorrere # 39 di DASPRIDS Rounter Presentation correttamente, è così semplice come - in base al modulo - per definire i padroni di casa sottodominio, vale a dire:

'router' => array(
    'routes' => array(
     'home' => array(
      'type' => 'Hostname', 
      'options' => array(
       'route' => 'api.site.com', 
       'defaults' => array(
        '__NAMESPACE__' => 'Api\Controller', 
        'controller' => 'Index', 
        'action'  => 'index', 
       ), 
      ) 
     ) 
    ), 
), 

Etc, faresti questo per ogni modulo da solo.

+0

Scusa se sembra stupido, ma devi registrare un nuovo host webserver virtuale per il sottodominio API? –