2015-07-12 18 views
6

Sto provando a convertire da cakephp 2.x a 3.x. Stavo usando le regole Router::connect(), ma provo a convertirle nella versione dell'ambito.Routing Cakephp 3 con parametro lingua

Riguardo alla regola di routing myold, in config/routes.php ho aggiunto questo.

Router::defaultRouteClass('Route'); 
    Router::scope('/', function ($routes) { 

    $routes->connect('/:language/:controller/:action/*', ['language' => 'ar|de|en|fr']); 
    $routes->connect('/:language/:controller', ['action' => 'index', 'language' => 'ar|de|en|fr']); 
    $routes->connect('/:language', ['controller' => 'Mydefault', 'action' => 'index', 'language' => 'ar|de|en|fr']); 

    $routes->redirect('/gohere/*', ['controller' => 'Mycontroller', 'action' => 'myaction'], ['persist' => array('username')]); 

    $routes->connect('/', ['controller' => 'Mydefault', 'action' => 'index']); 

    $routes->fallbacks('InflectedRoute'); 
}); 
  • Ma questo non riesce a example.com/en/works. Viene visualizzato questo errore: Error: worksController could not be found. Poiché il mio file controller è WorksController.php.

Il nome del controller parte impiccato alla frase casein cakephp 3? http://book.cakephp.org/3.0/en/intro/conventions.html#controller-conventions

  • anche example.com/foo/bar dà questo errore: Error: barController could not be found.. Ma foo è controller e bar è azione.

Come posso risolvere questo problema di routing?

Edit:
Cambiare Route::defaultRouteClass('Route')-Route::defaultRouteClass('InflectedRoute') risolto problema 1. Ma il problema esiste 2.

+0

Ci deve essere una linea 'Percorso :: defaultRouteClass ('Percorso') 'in cima al tuo route.php. Cambialo in 'Route :: defaultRouteClass ('InflectedRoute')'. – ADmad

+0

Questo errore fisso 1. Ma l'errore 2 esiste. Quando inserisco 'example.com/foo/bar', cakephp cerca barController. – trante

risposta

5

Le opzioni, come i modelli degli elementi di percorso, devono essere inoltrate tramite il terzo argomento di Router::connect(), l'argomento $options.

Questo percorso

$routes->connect('/:language/:controller', ['action' => 'index', 'language' => 'ar|de|en|fr']); 

cattura l'URL /foo/bar, essa corrisponderà foo per l'elemento :language, e bar per l'elemento :controller.

la correttezza modo di definire il percorso è

$routes->connect(
    '/:language/:controller', 
    ['action' => 'index'], 
    ['language' => 'ar|de|en|fr'] 
); 

Gli altri percorsi devono essere adattati di conseguenza.

Vedi anche Cookbook > Routing > Connecting Routes

1

Il modo migliore è usare Routing ambiti

<?php 
$builder = function ($routes) { 
    $routes->connect('/:action/*'); 
}; 
$scopes = function ($routes) use ($builder) { 
    $routes->scope('/questions', ['controller' => 'Questions'], $builder); 
    $routes->scope('/answers', ['controller' => 'Answers'], $builder); 
}; 

$languages = ['en', 'es', 'pt']; 
foreach ($languages as $lang) { 
    Router::scope("/$lang", ['lang' => $lang], $scopes); 
} 

Router::addUrlFilter(function ($params, $request) { 
    if ($request->param('lang')) { 
     $params['lang'] = $request->param('lang'); 
    } 
    return $params; 
}); 

Codice tratto da:

https://github.com/steinkel/cakefest2015/blob/c3403729d7b97015a409c36cf85be9b0cc5c76ef/cakefest/config/routes.php