是否可以在CodeIgniter 4的路由中使用动态控制器名称?

时间:2020-09-03 16:04:54

标签: php codeigniter-4

我想使用此处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将根据需要成功加载。但是通过这种方式,我必须为每个控制器设置路由,并且我想设置一个路由以与所有控制器一起使用。

是否可以通过设置动态控制器名称来设置路由?

1 个答案:

答案 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')