2015-05-21 2 views
3

Я пытаюсь использовать маршрутизацию Yii 2 для REST API.Yii2 route используя yii rest UrlRule с несколькими параметрами

После урока в http://www.yiiframework.com/doc-2.0/guide-rest-routing.html, я уже определился (с успехом) много правил для API точки входа, как так:

'urlManager' => [ 
    'enablePrettyUrl' => true, 
    'enableStrictParsing' => true, 
    'showScriptName' => false, 
    'rules' => [ 
     [ 
      'class' => 'yii\rest\UrlRule', 
      'controller' => 'user' 
     ], 
    ], 
] 

Такое правило определяет:

  • GET/пользователей (список пользователей)
  • GET/пользователи/123 (показать подробно пользователя 123)

Теперь у моих пользователей есть игры. Так что я хотел бы иметь URLs:

  • GET/пользователей/123/игры (список игр пользователя 123)
  • GET/пользователей/123/Игры/864 (подробности игры 864 для пользователей 123 - такие, как его оценка)

Я попытался определение моей новой точки входа (withhout успеха) как так:

'rules' => [ 
    ... previous rules ..., 
    [ 
     'class' => 'yii\rest\UrlRule', 
     'controller' => [ 
      'game' 
     ], 
     'tokens' => [ 
      '{userid}' => '<userid:\\d>', 
      '{gameid}' => '<gameid:\\d>', 
     ], 
     'patterns' => [ 
      'GET,HEAD /users/{userid}/games' => 'index', 
      'GET,HEAD /users/{userid}/games/{gameid}' => 'view', 
     ] 
    ] 
] 

Это определение кажется неправильным, потому что я получаю 404 страницы не найдена ошибку в. Как определить новые маршруты URL? Я хотел бы использовать эквивалентный формат для моих определений, расширяя 'yii \ rest \ UrlRule'

Я не уверен, что это даже возможно, в учебнике, не упоминающем этот случай.

ответ

3

Итак, я понял, как использовать более сложные правила.

Во-первых, решение, затем объяснение.

Вот решение:

'rules' => [ 
    ... previous rules ..., 
    [ 
     'class' => 'yii\rest\UrlRule', 
     'controller' => 'game', 
     'prefix' => '/users/<userid:\\d+>', 
     'tokens' => [ 
      '{gameid}' => '<gameid:\\d+>', 
     ], 
     'patterns' => [ 
      'GET,HEAD' => 'index', 
      'GET,HEAD {gameid}' => 'view', 
     ] 
    ] 
] 

А теперь объяснение:

  • Сначала мои атрибуты Идентификатор_пользователя/GameID были плохо определены. Отсутствовал «+» после «\ d»
  • Контроллер, кажется, автоматически добавляется в качестве префикса к шаблонам. Таким образом, вы должны определить как контроллер, так и префикс (который будет добавлен перед контроллером).
  • Параметры в префиксе, похоже, не обрабатываются, чтобы найти маркеры. Поэтому я написал непосредственно regexp в префиксе вместо добавления «userid» в качестве токена.
  • И, наконец, во время конкатенации «префикс/контроллер/шаблон» автоматически добавляются различные «/», поэтому вам не нужно писать их.
  • Не забудьте также правило плюрализации!"Игра" в единственном числе», но действительные адреса будут

    • /пользователи/123/играми
    • /пользователи/123/игр/789

Надеется, что это поможет.

1

Я думаю There'sa простые решения, пожалуйста, попробуйте следующее:

'rules' => [ 
       ... 
       '/users/<userId:\\d+>/games' => 'game/index' , 
       '/users/<userId:\\d+>/games/<gameId:\\d+>' => 'game/view' , 
       .... 
]; 
0

Просто используйте yii2-nested-rest

Он предоставляет API REST для отношений MANY-to-MANY в структуре Yii2.

Надежда комментарии сделают волшебство более понятным:

'rules' => [ 
// this usual rule for base Yii2 rest usage 
['class' => 'yii\rest\UrlRule', 'controller' => ['sitecomponent' ,'sitepage' , 'sitedomain'], 'pluralize'=>false 
], 
// then rules for yii2-nested-rest 
[ 
    // url sitepage/NNN/sitecomponent[/MMM] 
    //  ^^^^^^^^^  ^^^^^^^^^^^^ 
    //  resourceName model-endpoint 
    'class' => 'tunecino\nestedrest\UrlRule', 
    'modelClass' => 'app\models\SitePage', 
    'resourceName' => 'sitepage', 
    'relations' => ['components' =>   ['sitecomponent'=>'sitecomponent'] ], 
    //    ^^^^^^^^^^^^^^^^    ^^^^^^^^^^^^^ ^^^^^^^^^^^ 
    //    relation name    url-endpoint controller] 
    //    defined in model SitePage model-endpoint with Actions from nested 
    ], 
    [ 
    // cross url sitecomponent/NNN/sitepage[/MMM] 
    'class' => 'tunecino\nestedrest\UrlRule', 
    'modelClass' => 'app\models\SiteComponent', 
    'resourceName' => 'sitecomponent', 
    'relations' => ['pages'  =>   ['sitepage' => 'sitepage'] ], 
    //    ^^^^^^^^^^^^^^^^   ^^^^^^^^^^^^  ^^^^^^^^^ 
    //    relation name    url-endpoint  controller 
    //    from model SiteComponent model-endpoint with Actions from nested 
    ], 

],

+0

И текущая версия yii2-вложенным покоя не работает с PHP 7.2, поскольку генерирует ошибку «Не удается использовать юй \\ базу \\ Object as Object, потому что «Object» - это специальное имя класса ». Вы должны переименовать Object в BaseObject в «vendor/tunecino/yii2-nested-rest/src/UrlRule.php» всюду. –

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