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

问题描述 投票:7回答:4

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

关于我的旧路由规则,在qazxsw poi我添加了这个。

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'); }); 失败了。我收到此错误:example.com/en/works因为我的控制器文件是Error: worksController could not be found.

控制器名称部分是否被判处casein cakeinp 3? WorksController.php

如何解决此路由问题?

编辑: 将bar改为Route::defaultRouteClass('Route')解决了问题1.但问题2存在。

php cakephp routing cakephp-3.0
4个回答
6
投票

必须通过Route::defaultRouteClass('InflectedRoute')的第三个参数Router::connect()参数传递选项,例如路径元素模式。

这条路线

$options

将捕捉你的$routes->connect('/:language/:controller', ['action' => 'index', 'language' => 'ar|de|en|fr']); 网址,它将匹配/foo/barfoo元素,:languagebar元素。

定义路线的正确方法是

:controller

其他路线需要相应调整。

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


2
投票

最好的方法是使用路由范围

Cookbook > Routing > Connecting Routes

代码取自:

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


0
投票

从CakePHP 3应用程序框架扩展默认路由器

原来routes.php删除了评论

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

用定义集中的语言修改

<?php

use Cake\Routing\RouteBuilder;
use Cake\Routing\Router;
use Cake\Routing\Route\DashedRoute;

Router::defaultRouteClass(DashedRoute::class);

Router::scope('/', function (RouteBuilder $routes) {
    $routes->applyMiddleware('csrf');
    $routes->connect('/', ['controller' => 'Pages', 'action' => 'display', 'home']);
    $routes->connect('/pages/*', ['controller' => 'Pages', 'action' => 'display']);
    $routes->fallbacks(DashedRoute::class);
});

0
投票

rooter.php

<?php

use Cake\Routing\RouteBuilder;
use Cake\Routing\Router;
use Cake\Routing\Route\DashedRoute;

Router::defaultRouteClass(DashedRoute::class);

$routerCallback = function (RouteBuilder $routes) {
    $routes->applyMiddleware('csrf');
    $routes->connect('/', ['controller' => 'Pages', 'action' => 'display', 'home']);
    $routes->connect('/pages/*', ['controller' => 'Pages', 'action' => 'display']);
    $routes->fallbacks(DashedRoute::class);
};

// support only for 3 languages, other language will throw 404/NotFoundException
// or will cause different routing problem based on your routes
Router::scope('/', $routerCallback);
foreach (["en", "fr", "de"] as $language) {
    Router::scope('/' . $language, ['language' => $language], $routerCallback);
}

// to access the language param, or default to 'en', use 
// $this->request->getParam('language', 'en')
// from AppController, PagesController, etc...

类Appcontroller公共函数beforeFilter(Event $ event){$ this-> Auth-> allow(['']);

$routes->connect('/:lang/:controller/:action',[],[ 'lang' => '[a-z]{2}','pass' => ['lang']]);
$routes->connect('/:lang/', ['controller' => 'Pages', 'action' => 'index'],[ 'lang' => '[a-z]{2}','pass' => ['lang']]); 
$routes->connect('/:lang/index', ['controller' => 'Pages', 'action' => 'index'],[ 'lang' => '[a-z]{2}','pass' => ['lang']]); 
$routes->connect('/:lang/pages/*', ['controller' => 'Pages', 'action' => 'index'],[ 'lang' => '[a-z]{2}','pass' => ['lang']]);
$routes->connect('/:lang/contact', ['controller' => 'Pages', 'action' => 'contact'],[ 'lang' => '[a-z]{2}','pass' => ['lang']]);
$routes->connect('/:lang/about', ['controller' => 'Pages', 'action' => 'about'],[ 'lang' => '[a-z]{2}','pass' => ['lang']]);

}

© www.soinside.com 2019 - 2024. All rights reserved.