Yii2 URL路由管理器规则对多个路径失败

时间:2019-09-16 13:33:33

标签: yii2 yii2-urlmanager

我希望除api路由之外的所有路由都可以导航到站点/索引路由,而所有/ api路径则要对相应模块执行。 我添加了以下路线规则

    'urlManager' => [
        'enablePrettyUrl' => true,
        'showScriptName' => false,
        'rules' => [
            //api module
            'api/<controller:\w+>/<action:[\w\-]+>' => '<controller>/<action>',
            'api/<controller:\w+>' => 'api/<controller>',

             //all other paths
            '<controller:[\w\-]+>/<action:[\w\-]+>' => 'site/index',
            '<controller:[\w\-]+>/' => 'site/index',
        ],
    ],

以下内容适用于

的2级网址路由
/users/create
/users/view

但是当我访问的路径超过2条时,例如

/users/create/12
/admin/uom/create/new

路由未重新定向到站点/索引

我还需要添加些什么来确保即使路径超过3条的所有路由都通过站点/索引执行,而具有api前缀的那些路由则通过controller/action/api/controller执行。

我错过了什么?

1 个答案:

答案 0 :(得分:0)

没有针对这种情况的内置支持。但是您可以创建将匹配任何路由的自定义URL规则:

class FallbackUrlRule extends Component implements UrlRuleInterface {

    public $route = 'site/index';

    public function parseRequest($manager, $request) {
        return [$this->route, []];
    }

    public function createUrl($manager, $route, $params) {
        return false;
    }
}

并在您的应用程序配置中使用它:

'urlManager' => [
    'enablePrettyUrl' => true,
    'showScriptName' => false,
    'rules' => [
        //api module
        'api/<controller:\w+>/<action:[\w\-]+>' => '<controller>/<action>',
        'api/<controller:\w+>' => 'api/<controller>',

         //all other paths
        [
            'class' => FallbackUrlRule::class,
            'route' => 'site/index',
        ]
    ],
],

请注意,它只会忽略请求路径并捕获所有请求,包括那些应引发404错误的请求。它还不会检测路径中的参数(它将忽略12中的/users/create/12)。