YII URLManager для RESTfull API - PullRequest
       27

YII URLManager для RESTfull API

4 голосов
/ 11 марта 2012

Попытка работать с RESTfull API с помощью yii (являющегося первым проектом, использующим yii)

Возникли проблемы с получением URLManager для правильной маршрутизации вызовов:

    'urlManager' => array(
        'urlFormat' => 'path',
        'showScriptName' => false,
        'caseSensitive' => false,
        'rules' => array(
          'api/<controller>' => array('api/<controller>/list', 'verb' => 'GET'),
          'api/<controller>' => array('api/<controller>/create', 'verb' => 'POST'),
        ),
    ),

Пробовал работать с этим (это не полный фрагмент, у меня были диспетчеры для PUT / DELETE и т. д. Но это не сработало ... Будучи в отчаянии, я пробовал даже что-то простое:

    'urlManager' => array(
        'urlFormat' => 'path',
        'showScriptName' => false,
        'caseSensitive' => false,
        'rules' => array(
            'tezt' => array('landing/beta', 'verb' => 'GET'),
            'tezt' => array('landing', 'verb' => 'POST'),
        ),
    ),

всякий раз, когда я удаляю одиниз правил, это работает, но когда я вставляю оба правила, ни одно из них не работает, я получаю исключение исключения. CHTTPException.404

 exception 'CHttpException' with message 'Unable to resolve the request
 "tezt".' in /yii-1.1.10/web/CWebApplication.php:280

Я бился об это снова в течение 2 дней.видел все примеры и учебные пособия по URLManager в Интернете (хотя не смог найти простого и полного объяснения правил). Но не радости.

Я что-то не так делаю? Возможно, это настройки моего ящика?

Ответы [ 3 ]

6 голосов
/ 22 ноября 2012

Я попробовал это, и это сработало:

'rules'=>array(
            //API URLs
            array('api/<controller>/index', 'pattern'=>'api/<controller:\w+>', 'verb'=>'GET'),
            array('api/<controller>/create', 'pattern'=>'api/<controller:\w+>', 'verb'=>'POST'),
            array('api/<controller>/view', 'pattern'=>'api/<controller:\w+>/<id:\d+>', 'verb'=>'GET'),
            array('api/<controller>/update', 'pattern'=>'api/<controller:\w+>/<id:\d+>', 'verb'=>'PUT, POST'),
            array('api/<controller>/delete', 'pattern'=>'api/<controller:\w+>/<id:\d+>', 'verb'=>'DELETE'),
            //Other URLs
            '<controller:\w+>/<id:\d+>'=>'<controller>/view',
            '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
            '<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
        ),

"api" - это модуль, сконфигурированный в секции modules как

'api'=>array('defaultController' => 'default',),

В клиенте REST вы должны указать имя контроллера, даже для контроллера по умолчанию.

Я использую Yii 1.1.10, но я думаю, что Yii поддерживает RESTful URL с 1.1.7.

0 голосов
/ 03 июня 2013

Для всех, кто сталкивается с этим, это не сработало, потому что правила были объявлены с использованием тех же ключей, поэтому последнее правило отвергает первое.

В будущем объявите шаблон в массиве конфигурации правил:

array(
    'route',
    'pattern' =>'somePattern',
    'verb' =>'...',
),
array(
    'another/route',
    'pattern' =>'anotherPattern',
    'verb' =>'...',
),
0 голосов
/ 11 марта 2012

попробуйте

'api/<controller:\w+>' => array('api/<controller>/list', 'verb' => 'GET'),  

является ли API модулем?

...