模块Yii2的{urlManager}

时间:2017-04-01 19:07:13

标签: php rest yii2

我有一个基本的Yii2项目,其中我创建了一个单独的模块“rest”。我在config / web.php文件中设置了urlManager。它适用于常见的URL,但在我看来,它不能使用我的模块名称开头的url:rest / ..我的rest模块中的authController中有actionAuth(),并且可以使用此url:test访问它。 RU /认证/身份验证。但是我想用这个网址访问它: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方法,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);
      }
     }

2 个答案:

答案 0 :(得分:0)

试试这个:

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;
    }
}

答案 1 :(得分:0)

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

这将有效:

'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