2015-07-12 5 views
6

Ich versuche, CakePHP 2.x zu 3.x zu konvertieren. Ich habe Router::connect() Regeln verwendet, aber ich versuche, sie in die Scope-Version zu konvertieren.CakePHP 3 Routing mit Sprachparameter

In Bezug auf Myold Routing-Regel, in config/routes.php habe ich dies hinzugefügt.

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'); 
}); 
  • Aber das scheitert in example.com/en/works. Ich bekomme diesen Fehler: Error: worksController could not be found. Weil meine Controller-Datei WorksController.php ist.

Ist Controller Name Teil auf Satz Casein CakePHP 3 gehängt? http://book.cakephp.org/3.0/en/intro/conventions.html#controller-conventions

  • Auch example.com/foo/bar gibt diesen Fehler: Error: barController could not be found.. Aber foo ist Controller und bar ist Aktion.

Wie kann ich dieses Routing-Problem beheben?

Edit:
Ändern Route::defaultRouteClass('Route')-Route::defaultRouteClass('InflectedRoute') gelöstes Problem 1. Aber Problem 2 besteht.

+0

Es muss eine Linie sein 'Strecke :: defaultRouteClass ('Route') 'oben auf Ihrer routes.php. Ändern Sie es in 'Route :: defaultRouteClass ('InflectedRoute')'. – ADmad

+0

Dieser feste Fehler 1. Aber Fehler 2 existiert. Wenn ich 'example.com/foo/bar' betrete, sucht cakephp nach barController. – trante

Antwort

5

Optionen wie Routenelementmuster müssen über das dritte Argument Router::connect(), das $options Argument übergeben werden.

Diese Route

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

Ihre /foo/bar URL fangen, wird es foo für das :language Element und bar für das :controller Element entsprechen.

Der korrekte Weg, um die Strecke zu definieren, ist

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

Die anderen Routen müssen entsprechend angepasst werden.

Siehe auch Cookbook > Routing > Connecting Routes

1

Der beste Weg ist mit Routing Tive

<?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; 
}); 

-Code entnommen aus:

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