繁体   English   中英

模块Yii2的urlManager

[英]urlManager for module Yii2

我有一个基本的Yii2项目,在其中创建了一个单独的模块“ rest”。 我已经在config / web.php文件中设置了urlManager。 它适用于常见的url,但在我看来,它不能使用以我的模块名称开头的url:rest /.。我的rest模块中的AuthController中有actionAuth(),可通过以下URL进行访问:test。 RU /认证/身份验证。 但是我希望它可以通过此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不想为模块工作。 接下来,我尝试在rest /目录的Module.php中编写相同的代码。 但是它产生了许多错误。 我认为由于同样的错误,类似的东西也无法正常工作。

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

所以我的问题是:如何在Yii2中为模块设置urlManager? 我需要配置HTTP DELETE方法,发布方法无需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);
      }
     }

尝试这个:

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' => [
    '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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM