2016-03-30 2 views
2

В документации руководства есть пример:Yii2: REST API действия в ActiveController

namespace app\controllers; 

    use yii\rest\ActiveController; 

    class UserController extends ActiveController 
    { 
     public $modelClass = 'app\models\User'; 
} 

Но я не понимаю, как работать с действиями.

Например:

  • База данных имеет таблицы со многими-ко-многим (через Junction таблицу).

  • Компонент для работы с моделями и формирования общего ответа от нескольких таблиц в соответствии с переданными данными. Может возвращать массив или массив объектов.

При использовании его в контроллер команд, это было как:

class LastTweetsController extends Controller 
    { 
     /** 
     * @param int $count 
     * 
     * @throws yii\base\InvalidConfigException 
     */ 
     public function actionIndex($count = 10) 
     { 
      /** @var TweetLastfinder $tweetLastFinder */ 
      $tweetLastFinder = Yii::$app->get('tweetlastfinder'); 

      /** 
      * @var TweetShow $tweetShow 
      */ 
      $tweetShow = Yii::$app->get('tweetshow'); 

      // For show tweets into terminal: 
$tweetShow->showLastTweetsJSON($tweetLastFinder->findLastTweets($count)); 
     } 
    } 

Но как я могу сделать ту же операцию в ActiveController (Передавать параметр $ счет и вернуть результат в формате JSON)?

ответ

11

Чтобы изменить действия по умолчанию API по как - создание, обновление, вид, индекс, удалить запись ниже код в контроллере

namespace app\controllers; 
use yii\rest\ActiveController; 

class UserController extends ActiveController 
{ 
    public $modelClass = 'app\models\User'; 

    /* Declare actions supported by APIs (Added in api/modules/v1/components/controller.php too) */ 
    public function actions(){ 
     $actions = parent::actions(); 
     unset($actions['create']); 
     unset($actions['update']); 
     unset($actions['delete']); 
     unset($actions['view']); 
     unset($actions['index']); 
     return $actions; 
    } 

    /* Declare methods supported by APIs */ 
    protected function verbs(){ 
     return [ 
      'create' => ['POST'], 
      'update' => ['PUT', 'PATCH','POST'], 
      'delete' => ['DELETE'], 
      'view' => ['GET'], 
      'index'=>['GET'], 
     ]; 
    } 

    public function actionIndex($count = 10){ 
     /** @var TweetLastfinder $tweetLastFinder */ 
     $tweetLastFinder = Yii::$app->get('tweetlastfinder'); 

     /** 
     * @var TweetShow $tweetShow 
     */ 
     $tweetShow = Yii::$app->get('tweetshow'); 

     // This will return in JSON: 
     return $tweetLastFinder->findLastTweets($count); 
    } 
} 

В API основной конфигурационный файл -

'components' => [ 
     .... 
     'urlManager' => [ 
      'enablePrettyUrl' => true, 
      'enableStrictParsing' => true, 
      'showScriptName' => false, 
      'rules' => [ 
       [ 
         'class' => 'yii\rest\UrlRule', 
         'controller' => 'v1/user', 
         'tokens' => [ 
          '{id}' => '<id:\\w+>', 
          '{count}' => '<count:\\w+>', 
         ], 
         //'pluralize' => false, 
         'extraPatterns' => [  
          'POST' => 'create', // 'xxxxx' refers to 'actionXxxxx' 
          'PUT {id}' => 'update', 
          'PATCH {id}' => 'update', 
          'DELETE {id}' => 'delete', 
          'GET {id}' => 'view', 
          'GET {count}' => 'index', 
         ], 

        ], 
      ] 
     ], 
     .... 
    ] 

В вашем случае хотите $ count в параметре действия индекса, поэтому в менеджере URL вам нужно определить токен «count», как «id»

+0

Спасибо, прежде чем закрыть проблему, попросите вас немного объяснить этот код. Также как я могу передать paramaeter $ count и actionIndex возвращаемый массив, который был подготовлен в компоненте ... не json. Как должно быть сделано правильно, что json был в ответе. – user199588

+0

Мой плохой, я нашел ответ) tks – user199588

+0

Большое спасибо. У меня все еще есть вопрос, как использовать ответ компонента в действии по умолчанию, но я уже спрашиваю об этом в другом вопросе) http://stackoverflow.com/questions/36309034/yii2-how-to-use-component-in-activecontroller-default- action – user199588

Смежные вопросы