Cakephp 3使用语言参数进行路由

tra*_*nte 7 php routing cakephp cakephp-3.0

我正在尝试将cakephp 2.x转换为3.x. 我正在使用Router::connect()规则,但我尝试将它们转换为范围版本.

关于myold路由规则,config/routes.php我添加了这个.

  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');
});
Run Code Online (Sandbox Code Playgroud)
  • 但这失败了example.com/en/works.我收到此错误:Error: worksController could not be found.因为我的控制器文件是WorksController.php.

控制器名称部分是否被判处casein cakeinp 3?http://book.cakephp.org/3.0/en/intro/conventions.html#controller-conventions

  • example.com/foo/bar给出了这个错误:Error: barController could not be found..但是foo控制器和bar行动.

如何解决此路由问题?

编辑:
更改Route::defaultRouteClass('Route')为已Route::defaultRouteClass('InflectedRoute')解决的问题1.但问题2存在.

ndm*_*ndm 6

选项,如路线元件的图案,必须通过的第三个参数被传递Router::connect(),所述$options参数.

这条路线

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

会抓住你的/foo/bar网址,它会匹配foo:language元素,bar:controller元素.

定义路线的正确方法是

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

其他路线需要相应调整.

另请参阅Cookbook> Routing> Connecting Routes