2017-04-01 89 views
2

我有一個基本的Yii2項目,其中我創建了一個單獨的模塊「休息」。我已經在config/web.php文件中設置了urlManager。它適用於通用的網址,但在我看來,它不與我的模塊名稱開始工作:休息/ ..我在我的休息模塊中的AuthController actionAuth(),它可以訪問此網址:測試。 RU /認證/身份驗證。但我希望它可以訪問這個網址:test.ru/auth。我試圖在web.php中這樣寫:urlManager模塊Yii2

'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', 
         ], 
    ` 

所以我的問題是:如何設置urlManager的模塊中Yii2?我需要配置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); 
     } 
    } 

回答

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

謝謝你,但有可能在模塊urlManager辦? –

0

使用正斜槓(/),同時在規則數組中定義控制器值。

這將工作:這裏

'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

+0

太晚了,但還是謝謝! –