【问题标题】:urlManager for module Yii2模块 Yii2 的 urlManager
【发布时间】:2017-08-26 22:01:51
【问题描述】:

我有一个基本的 Yii2 项目,我在其中创建了一个单独的模块“rest”。我已经在 config/web.php 文件中设置了 urlManager。它适用于常见的 url,但在我看来,它不适用于以我的模块名称开头的 url:rest/.. 我在我的 rest 模块的 AuthController 中有 actionAuth(),并且可以通过以下 url 访问它:test。 ru/auth/auth。但我希望它可以通过这个 url:test.ru/auth 访问。我试图在 web.php 中这样写:

  'urlManager' => [
        'enablePrettyUrl' => true,
        'showScriptName' => false,
        'rules' => [

           [
              'class' => 'yii\rest\UrlRule',
              'controller' => 'rest\auth',
              'extraPatterns' => [
                  'POST /' => 'auth',
              ],
              'pluralize' => false,
            ],

      ],
    ],

但它不起作用(在浏览器中未发现错误)。 我也试过这样:

'rules' => [

           [
              'class' => 'yii\rest\UrlRule',
              'controller' => 'rest\auth',
              'extraPatterns' => [
                  'POST rest/auth' => 'auth',
              ],
              'pluralize' => false,
            ],

      ],
    ],

在我看来 urlManager 不想为模块工作。接下来,我尝试在我的 Module.php 中的 rest/ 目录中编写相同的代码。但它产生了许多错误。我认为由于同样的错误,这样的事情也不起作用:`

    'class' => 'yii\rest\UrlRule',
                      'controller' => 'rest\city',
                      'extraPatterns' => [
                        'DELETE {id}' => 'delete',
                      ],
    `

所以我的问题是:如何在 Yii2 中为模块设置 urlManager?我需要配置 HTTP DELETE 方法,post 方法无需在 urlManager 中进行任何设置。

整个 web.php 文件:

<?php

 $params = require(__DIR__ . '/params.php');

  $config = [
'id' => 'basic',
'basePath' => dirname(__DIR__),
'bootstrap' => ['log'],
'language' => 'ru',
'components' => [
'authManager' => [
        'class' => 'yii\rbac\DbManager',
    ],
    'request' => [
        // !!! insert a secret key in the following (if it is empty) - this              is required by cookie validation
        'cookieValidationKey' => 'xxxxxxx',
        'parsers' => [
            'application/json' => 'yii\web\JsonParser',
            ]
    ],
    'cache' => [
        'class' => 'yii\caching\FileCache',
    ],
     'user' => [
        'identityClass' => 'app\models\User',
    //    'loginUrl' => ['site/login'],

    ],
    'errorHandler' => [
        'errorAction' => 'site/error',
    ],
    'mailer' => [
        'class' => 'yii\swiftmailer\Mailer',
        // send all mails to a file by default. You have to set
        // 'useFileTransport' to false and configure a transport
        // for the mailer to send real emails.
        'useFileTransport' => true,
    ],
    'log' => [
        'traceLevel' => YII_DEBUG ? 3 : 0,
        'targets' => [
            [
                'class' => 'yii\log\FileTarget',
                'levels' => ['error', 'warning'],
            ],
        ],
    ],
    'db' => require(__DIR__ . '/db.php'),

    'urlManager' => [
        'enablePrettyUrl' => true,
        'showScriptName' => false,
        'rules' => [
            [
              'class' => 'yii\rest\UrlRule',
              'controller' => 'rest\user',
              'except' => ['delete', 'create', 'update', 'index'],
              'extraPatterns' => [
                  'GET all' => 'all',
              ]
           ],
           [
              'class' => 'yii\rest\UrlRule',
              'controller' => 'rest\auth',
              'extraPatterns' => [
                  'POST reg' => 'reg',
                  'POST auth' => 'auth',
                  'POST rest/auth' => 'auth',
              ],
              'pluralize' => false,
            ],
            [
              'class' => 'yii\rest\UrlRule',
              'controller' => 'rest\city',
              'extraPatterns' => [
                'DELETE {id}' => 'delete',
              ],

            ], 



      ],
    ],



        'i18n' => [
    'translations' => [
        '*' => [
            'class' => 'yii\i18n\PhpMessageSource',
           // 'basePath' => '@app/messages', // if advanced application, set @frontend/messages
            'sourceLanguage' => 'en',
            'fileMap' => [
                //'main' => 'main.php',
            ],
        ],
    ],
],


],
'modules' => [
    'admin' => [
        'class' => 'app\modules\admin\Module',
    ],
    'manager' => [
        'class' => 'app\modules\manager\Module',
    ],
    'rest' => [
        'class' => 'app\modules\rest\Module',
    ],

    'rbac' => [
       'class' => 'mdm\admin\Module',
       'controllerMap' => [
             'assignment' => [
                'class' => 'mdm\admin\controllers\AssignmentController',
                /* 'userClassName' => 'app\models\User', */
                'idField' => 'id',
                'usernameField' => 'username',
            ],
        ],
    'layout' => 'left-menu',
    'mainLayout' => '@app/views/layouts/admin.php',
    ]

],


'aliases' => [
    //'@mdm/admin' => 'app/mdm/admin',
],

'params' => $params,
 ];

if (YII_ENV_DEV) {
// configuration adjustments for 'dev' environment
$config['bootstrap'][] = 'debug';
$config['modules']['debug'] = [
    'class' => 'yii\debug\Module',
    // uncomment the following to add your IP if you are not connecting from    localhost.
    //'allowedIPs' => ['127.0.0.1', '::1'],
 ];

$config['bootstrap'][] = 'gii';
$config['modules']['gii'] = [
    'class' => 'yii\gii\Module',
    // uncomment the following to add your IP if you are not connecting from localhost.
    //'allowedIPs' => ['127.0.0.1', '::1'],
 ];
}

   return $config;

我的 Module.php 代码(注释代码显示我尝试编写 urlManager):

    <?php

     namespace app\modules\rest;

     /**
     * rest module definition class
     */
     class Module extends \yii\base\Module
     {
    /**
     * @inheritdoc
     */
    public $controllerNamespace = 'app\modules\rest\controllers';

    /**
     * @inheritdoc
     */
    public function init()
    {
        parent::init();
    // custom initialization code goes here
     \Yii::$app->user->enableSession = false;
      $config = [

      'components' => [
        'basePath' => dirname(__DIR__),
        // 'user' => [
        //           'identityClass' => 'app\models\User',
        //           'class' => 'app\models\User',
        //           'enableSession' => false
        //       ],

        //   'urlManager' => [
        //               'enablePrettyUrl' => true,
        //               'enableStrictParsing' => true,
        //               'showScriptName' => false,
        //               'rules' => [
        //                    [
        //                     'class' => 'yii\rest\UrlRule',
        //                     'controller' => 'rest\city',
        //                     'extraPatterns' => [
        //                     'DELETE {id}' => 'delete',
        //                 ],
        //               ],
        // ],
        //   ],


        'response' => [
                  'format' => \yii\web\Response::FORMAT_JSON,
                  'charset' => 'UTF-8',
                  'class' => 'yii\web\Response',

                  'on beforeSend' => function ($event) {

                      $response = $event->sender;

                      if(( $response->statusCode >= 200) && ( $response->statusCode < 300)) {

                          if(isset($response->data['_appErr'])) {
                              unset($response->data['_appErr']);
                              $response->data = [
                                  'success' => false,
                                  'error' => $response->data,
                                  'data' => null,
                              ];
                          } else {

                              $response->data = [
                                  'success' => $response->isSuccessful,
                                  'error' => null,
                                  'data' => $response->data,
                              ];
                          }

                      } else {

                          if($response->statusCode == 401) {
                              $response->data = [
                                  'success' => false,
                                  'error' => [
                                      'code' => 9,
                                      'message' => 'Unauthorized',
                                      'user_msg' => 'You need to be authorized',
                                  ],
                                  'data' => null,
                              ];
                          }
                        //   else {
                        //       $response->data = [
                        //           'success' => false,
                        //           'error' => [
                        //               'code' => 1,
                        //               'message' => 'server has returned   '.$response->statusCode.' error',
                        //           ],
                        //           'data' => null,
                        //       ];
                        //   }
                      }
                  },
              ],

      ],
      ];


        \Yii::configure(\Yii::$app, $config);
      }
     }

【问题讨论】:

    标签: php rest yii2


    【解决方案1】:

    在规则数组中定义控制器值时使用正斜杠(/)

    这将起作用:

    'urlManager' => [
        'enablePrettyUrl' => true,
        'showScriptName' => false,
        'rules' => [
            [
              'class' => 'yii\rest\UrlRule',
              'controller' => 'rest/user',
              'except' => ['delete', 'create', 'update', 'index'],
              'extraPatterns' => [
                  'GET all' => 'all',
              ]
           ],
           [
              'class' => 'yii\rest\UrlRule',
              'controller' => 'rest/auth',
              'extraPatterns' => [
                  'POST reg' => 'reg',
                  'POST auth' => 'auth',
    
              ],
              'pluralize' => false,
            ],
            [
              'class' => 'yii\rest\UrlRule',
              'controller' => 'rest/city',
              'extraPatterns' => [
                'DELETE {id}' => 'delete',
              ],
    
            ], 
      ]
    

    在此处查看文档:http://www.yiiframework.com/doc-2.0/guide-rest-versioning.html

    【讨论】:

      【解决方案2】:

      试试这个:

      namespace yii\rest;
      
      class UrlRule extends Object implements UrlRuleInterface {
      
          public function parseRequest($manager, $request) {
              list($e1, $e2) = sscanf($request->getPathInfo(), '%[a-zA-Z]/%[a-zA-Z]');
              if ($e1 === 'auth' && $e2 === '') {
                  return ['/auth/auth', $request->queryParams];
              }
              return false;
          }
      }
      

      【讨论】:

      • 谢谢,但是模块中的urlManager可以用吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多