我想使用此处https://codeigniter.com/user_guide/outgoing/localization.html#in-routes
这样的路由本地化所以我需要添加路由规则,例如:
$routes->get('{locale}/books', 'App\Books::index');
但是我想为所有控制器制定此规则-不为所有控制器指定规则。所以我添加了规则:
$routes->add('{locale}/(:segment)(:any)', '$1::$2');
我有使用方法Login
的控制器index()
。当我转到mydomain.com/Login
时,方法index()
已成功加载。但是,当我转到mydomain.com/en/Login
(因为我希望使用我的路线)时,出现404错误,消息“未找到控制器或其方法:\ App \ Controllers $ 1 :: index”。但是语言环境已定义并正确设置。
如果我将路线更改为$routes->add('{locale}/(:segment)(:any)', 'Login::$2');
,则mydomain.com/en/Login
将根据需要成功加载。但是通过这种方式,我必须为每个控制器设置路由,并且我想设置一个路由以与所有控制器一起使用。
是否可以通过设置动态控制器名称来设置路由?
答案 0 :(得分:1)
我不确定是否可以直接这样做,但这是一种解决方法:
$routes->add('{locale}/(:segment)/(:any)', 'Rerouter::reroute/$1/$2');
然后,您的Rerouter
类看起来像这样:
<?php namespace App\Controllers;
class Rerouter extends BaseController
{
public function reroute($controllerName, ...$data)
{
$className = str_replace('-', '', ucwords($controllerName)); // This changes 'some-controller' into 'SomeController'.
$controller = new $className();
if (0 == count($data))
{
return $controller->index(); // replace with your default method
}
$method = array_shift($data);
return $controller->{$method}(...$data);
}
}
例如,/en/user/show/john-doe
将调用控制器User::show('john-doe')
。