You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Yii2框架web.php中urlManager的patterns数组如何正确配置?

解决Yii2 REST路由patterns配置及OPTIONS请求问题

我有一个Yii2应用,尝试在web.php的urlManager中添加patterns数组配置REST路由,查阅相关文档后仍未解决问题。

初始可正常工作的配置

当使用如下配置时,Postman调用http://localhost:8080/v1/user/login的POST请求正常:

'urlManager' => [
    'enablePrettyUrl' => true,
    'showScriptName' => false,
    
    'rules' =>  [
        'class' => 'yii\rest\UrlRule', 
        'controller' => 'v1/user', 
        'POST' => 'v1/user/signup',
        'POST' => 'v1/user/login',
    ],                          
],

改用patterns数组后的错误配置

尝试改用patterns数组配置(同时需要支持OPTIONS请求,适配React前端调用):

'urlManager' => [
    'enablePrettyUrl' => true,
    'showScriptName' => false,
    
    'rules' =>  [
        'class' => 'yii\rest\UrlRule', 
        'controller' => 'v1/user', 
        'patterns' => [
            'POST' => 'signup',
            'POST login' => 'login',
            'OPTIONS login' => 'options',                    
        ],
    ],                          
],

完整配置及报错信息

完整web.php配置如下:

<?php
// phpcs:ignoreFile

$params = require __DIR__ . '/params.php';
$db = require __DIR__ . '/db.php';

$config = [
    'id' => 'basic',
    'name' => 'internetsuite 2.0',
    'basePath' => dirname(__DIR__),
    'bootstrap' => ['log'],
    'aliases' => [
        '@bower' => '@vendor/bower-asset',
        '@npm'   => '@vendor/npm-asset',
    ],
    'modules' => [
        'v1' => [
            'class' => 'app\modules\v1\Module',
        ],
    ],
    'components' => [
        'request' => [
            'parsers' => [
                'application/json' => 'yii\web\JsonParser',
            ],
            'cookieValidationKey' => 'OEtCunrAfQNETtmUSDnZw1JPHTB44i3A',
        ],
        'cache' => [
            'class' => 'yii\caching\FileCache',
        ],
        'user' => [
            'identityClass' => 'app\models\User',
            'enableAutoLogin' => true,
        ],
        'errorHandler' => [
            'errorAction' => 'site/error',
        ],
        'mailer' => [
            'class' => \yii\symfonymailer\Mailer::class,
            'viewPath' => '@app/mail',
            'useFileTransport' => true,
        ],
        'log' => [
            'traceLevel' => YII_DEBUG ? 3 : 0,
            'targets' => [
                [
                    'class' => 'yii\log\FileTarget',
                    'levels' => ['error', 'warning'],
                ],
            ],
        ],
        'db' => $db,
        'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'enableStrictParsing' => true,
            
            'rules' =>  [[
                'class' => 'yii\rest\UrlRule', 
                'controller' => 'v1/user', 
                'pluralize' => false,
                ],
                'extraPatterns' => [
                    'OPTIONS {login}' => 'options',                    
                    'POST signup' => 'signup',
                    'POST login' => 'login',
                ],
            ],                          
        ],
    ],
    'params' => $params,
];

if (YII_ENV_DEV) {
    $config['bootstrap'][] = 'debug';
    $config['modules']['debug'] = [
        'class' => 'yii\debug\Module',
    ];

    $config['bootstrap'][] = 'gii';
    $config['modules']['gii'] = [
        'class' => 'yii\gii\Module',
    ];
}

return $config;

运行后出现错误:

Unknown Property – yii\base\UnknownPropertyException
Setting unknown property: yii\web\UrlRule::POST

正确的配置方案

错误核心是rules数组结构错误:extraPatterns是yii\rest\UrlRule的专属属性,必须嵌套在该规则的配置数组内,不能和规则数组同级,否则Yii会将其当作独立的yii\web\UrlRule规则处理,触发属性不存在的错误。另外,patterns会覆盖默认REST路由,建议用extraPatterns追加自定义路由,避免影响原有REST行为。

正确的urlManager配置如下:

'urlManager' => [
    'enablePrettyUrl' => true,
    'showScriptName' => false,
    'enableStrictParsing' => true,
    
    'rules' =>  [
        [
            'class' => 'yii\rest\UrlRule', 
            'controller' => 'v1/user', 
            'pluralize' => false,
            'extraPatterns' => [
                // 处理login接口的跨域预检请求
                'OPTIONS login' => 'options',
                // 自定义POST路由
                'POST signup' => 'signup',
                'POST login' => 'login',
            ],
        ],
    ],                          
],

关键说明

  • pluralize设为false,避免自动生成复数形式的路由(比如users)。
  • OPTIONS路由配置专门用于支持React等前端的跨域预检请求,确保前端能正常调用API。

内容的提问来源于stack exchange,提问作者mightycode Newton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 21:39:53