【问题标题】:Is it possible to use dynamic controller name in routing in CodeIgniter 4?是否可以在 CodeIgniter 4 的路由中使用动态控制器名称?
【发布时间】:2020-09-03 16:04:54
【问题描述】:

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

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

【问题讨论】:

    标签: php codeigniter-4


    【解决方案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')。

    【讨论】:

    • 是的,我也这么认为——最好有一个端点,所有请求都会通过它。但是当我试图获得类的实例时,我遇到了错误 - 找不到类“用户”。我的Rerouter 类和我的User 类是同一命名空间App\Controllers 中的控制器。
    • 当我直接设置$controller = new User(); 然后它工作正常。由于某些原因,动态 $className 无法正常工作。
    • 其他选项:转到 CodeIgniter 论坛并将您的问题更改为功能请求。我认为它应该包含在框架中!
    猜你喜欢
    • 1970-01-01
    • 2021-04-01
    • 2015-06-14
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    • 2011-10-13
    • 2013-12-30
    • 2011-09-05
    相关资源
    最近更新 更多