UrlManager, PrettyUrl, suffix и REST

Всё что касается построения API
ivahaev
Сообщения: 30
Зарегистрирован: 2014.06.24, 09:12

UrlManager, PrettyUrl, suffix и REST

Сообщение ivahaev »

ЧПУ - это классно. Если дописывать .html - то вообще красиво получается. Но зато выходит не очень красиво, если в одном модуле имеются ещё REST контроллеры. В урлах вставлять расширение .html уже как-то не очень хорошо.

Как-то вот сходу не увидел, можно ли отключать суффикс для отдельного контроллера? В поиске тоже ничего не нашел.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: UrlManager, PrettyUrl, suffix и REST

Сообщение zelenin »

думаю, можно в beforeAction или в любом другом подобном методе переназначить суффикс на лету
ivahaev
Сообщения: 30
Зарегистрирован: 2014.06.24, 09:12

Re: UrlManager, PrettyUrl, suffix и REST

Сообщение ivahaev »

Ну... Я тоже было так подумал. Но ведь любой экшин станет выполняться только тогда, когда urlManager его найдёт, а без суффикса он искать отказывается.
Аватара пользователя
vova07
Сообщения: 1004
Зарегистрирован: 2012.11.29, 14:52
Откуда: Chisinau, Moldova

Re: UrlManager, PrettyUrl, suffix и REST

Сообщение vova07 »

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: UrlManager, PrettyUrl, suffix и REST

Сообщение zelenin »

vova07 писал(а):Можно! https://github.com/yiisoft/yii2/blob/f0 ... le.php#L70 и специально для REST https://github.com/yiisoft/yii2/blob/3a ... le.php#L67 .
Вася, это понятно. Человек и так выставляет суффикс в конфиге. Ему нужно отменять для некоторых экшнов/контроллеров.
ivahaev
Сообщения: 30
Зарегистрирован: 2014.06.24, 09:12

Re: UrlManager, PrettyUrl, suffix и REST

Сообщение ivahaev »

Видимо, что-то я не до конца понимаю.
Сделал я так:

Код: Выделить всё

                
                [
                    'class' => 'yii\rest\UrlRule',
                    'controller' => [
                        'rest/user',
                        'rest/contact',
                    ],
                    'suffix' => null,
                ],
Никаких изменений. Пробовал и пустую строку подсовывать, и просто случайную последовательность символов - тот же эффект.

Неужели приходится выбирать - или красиво юзеру, или красиво серверу? :)
Аватара пользователя
vova07
Сообщения: 1004
Зарегистрирован: 2012.11.29, 14:52
Откуда: Chisinau, Moldova

Re: UrlManager, PrettyUrl, suffix и REST

Сообщение vova07 »

Саша, я именно это и предложил.
Прям отключить это нельзя, но можно переопределить. REST правила в любом случае пишутся в конфиг.

@ivahaev Судя по исходникам, NULL как раз игнорируется. Попробуйте 'suffix' => '/'
ivahaev
Сообщения: 30
Зарегистрирован: 2014.06.24, 09:12

Re: UrlManager, PrettyUrl, suffix и REST

Сообщение ivahaev »

vova07 писал(а):Саша, я именно это и предложил.
Прям отключить это нельзя, но можно переопределить. REST правила в любом случае пишутся в конфиг.

@ivahaev Судя по исходникам, NULL как раз игнорируется. Попробуйте 'suffix' => '/'
Не, ниче не выходит :(
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: UrlManager, PrettyUrl, suffix и REST

Сообщение zelenin »

vova07 писал(а):Саша, я именно это и предложил.
Прям отключить это нельзя, но можно переопределить. REST правила в любом случае пишутся в конфиг.

@ivahaev Судя по исходникам, NULL как раз игнорируется. Попробуйте 'suffix' => '/'
да, я уже понял, что это суффикс для конкретных правил. Прошу прощения
Аватара пользователя
vova07
Сообщения: 1004
Зарегистрирован: 2012.11.29, 14:52
Откуда: Chisinau, Moldova

Re: UrlManager, PrettyUrl, suffix и REST

Сообщение vova07 »

Напишите конфиг урл мэнеджера, так как это странно.
ivahaev
Сообщения: 30
Зарегистрирован: 2014.06.24, 09:12

Re: UrlManager, PrettyUrl, suffix и REST

Сообщение ivahaev »

Сейчас вот так

Код: Выделить всё

        'urlManager' => [
            'baseUrl' => '/yii/',
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'suffix' => '.html',
            'enableStrictParsing' => false,
            'rules' => [
                '<controller>/<id:\d+>' => '<controller>/view',
                '<controller>/update/<id:\d+>' => '<controller>/update',
                's-article/create/<kind:\w+>/<item_id:\d+>' => 's-article/create',
                [
                    'class' => 'yii\rest\UrlRule',
                    'controller' => [
                        'rest/s-group',
                        'rest/s-questionary',
                    ],
                    'suffix' => '/',
                ],
            ],
        ],

 
Аватара пользователя
vova07
Сообщения: 1004
Зарегистрирован: 2012.11.29, 14:52
Откуда: Chisinau, Moldova

Re: UrlManager, PrettyUrl, suffix и REST

Сообщение vova07 »

А REST правила доступны по адресу "rest/s-group/action/" ?
Если да, и вам не нужны '.html' то 'enableStrictParsing' => true в помощь.
ivahaev
Сообщения: 30
Зарегистрирован: 2014.06.24, 09:12

Re: UrlManager, PrettyUrl, suffix и REST

Сообщение ivahaev »

vova07 писал(а):А REST правила доступны по адресу "rest/s-group/action/" ?
А вот тут опять недопонял. Что там должно быть? Пока 404, т.к. суффикс не дописан.
Если мне не изменяет память, первый Yii принимал и так и сяк - запросы и с суффиксом и без. Специально не использовал, но баловался разными урлами в свое время.
Аватара пользователя
vova07
Сообщения: 1004
Зарегистрирован: 2012.11.29, 14:52
Откуда: Chisinau, Moldova

Re: UrlManager, PrettyUrl, suffix и REST

Сообщение vova07 »

Имелось введу, что сами URL REST-а работают или нет?
Что именно не так сейчас?
ivahaev
Сообщения: 30
Зарегистрирован: 2014.06.24, 09:12

Re: UrlManager, PrettyUrl, suffix и REST

Сообщение ivahaev »

А, так все работает. У меня были просто некие философские рассуждения о красоте ссылок, при использовании суффикса :).
Для REST API как-то не очень красиво html дописывать.
Пока как вариант вижу - выносить в отдельный модуль весь REST API.
rafic
Сообщения: 57
Зарегистрирован: 2013.04.26, 13:19

Re: UrlManager, PrettyUrl, suffix и REST

Сообщение rafic »

Раз уж вы здесь обсуждаете URL менеджер...
Есть у меня контроллер Consumer унаследован от \yii\rest\Controller и расположен в /controllers/rest.
Хочу экшены распределить по типам запросов:
GET /rest/consumers => /rest/consumer/index
GET /rest/consumer/<id> => /rest/consumer/view
POST /rest/consumer/ = > /rest/consumer/create
DELETE /rest/consumer/<id> => /rest/consumer/delete
Смотря вот в эту доку я не понимаю как это сделать(

Я так понимаю, по умолчанию все методы доступны по всем типам запросов. А уже доступность регулируется через метод verbs() контроллера ?
Но тогда как работать с этим куском кода из доки

Код: Выделить всё

[
    'PUT,PATCH users/<id>' => 'user/update',
    'DELETE users/<id>' => 'user/delete',
    'GET,HEAD users/<id>' => 'user/view',
    'POST users' => 'user/create',
    'GET,HEAD users' => 'user/index',
    'users/<id>' => 'user/options',
    'users' => 'user/options',
]
Ищу разработчика или команду разработчиков для поддержки проекта.
Детальнее узнай по ссылке https://goo.gl/YU8uTS.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: UrlManager, PrettyUrl, suffix и REST

Сообщение zelenin »

что вас смущает? это код роутинга.
rafic
Сообщения: 57
Зарегистрирован: 2013.04.26, 13:19

Re: UrlManager, PrettyUrl, suffix и REST

Сообщение rafic »

zelenin писал(а):что вас смущает? это код роутинга.
Меня смущает то, что я не могу догнать куда его нужно писать. Можете показать пример правила в котором контроллер Consumer имеет настроенный роутинг по следующим правилам
GET /rest/consumers => /rest/consumer/index
GET /rest/consumer/<id> => /rest/consumer/view
POST /rest/consumer/ = > /rest/consumer/create
DELETE /rest/consumer/<id> => /rest/consumer/delete
Я буду крайне признателен вам за помощь)
А пока пойду дальше читать документацию(

UPD.
Методом тыка было выяснено, что роутинг не работает, если в ключе 'controllers' указать только путь к контроллеру. Смотрим пример как НЕ РАБОТАЕТ

Код: Выделить всё

            'urlManager' => [
                'class'=>'app\components\UrlManager',
                'enablePrettyUrl' => true,
//                'enableStrictParsing' => true,
                'showScriptName' => false,
                'rules' => [
                    [
                        'class' => 'yii\rest\UrlRule',
                        'controller' => ['rest/lead'],
                    ],

                    // 1. Роуты для общих страниц
                    '<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
                    '<controller:\w+>/<action:\w+>' => '<controller>/<action>',
                ]
            ],
Как проверял?
Слал POST запрос на rest/lead и получал ответ
{"name":"Method Not Allowed","message":"Method Not Allowed. This url can only handle the following request methods: GET, HEAD.","code":0,"status":405,"type":"yii\\web\\MethodNotAllowedHttpException"}
То есть срабатывает экшн Index, а должен Create

Как починил?
сделал вот так

Код: Выделить всё

            'urlManager' => [
                'class'=>'app\components\UrlManager',
                'enablePrettyUrl' => true,
//                'enableStrictParsing' => true,
                'showScriptName' => false,
                'rules' => [
                    [
                        'class' => 'yii\rest\UrlRule',
                        'controller' => ['rest/lead' => 'rest/lead'],
                    ],

                    // 1. Роуты для общих страниц
                    '<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
                    '<controller:\w+>/<action:\w+>' => '<controller>/<action>',
                ]
            ],
И теперь получаю ошибку валидации при попытке создать новую модель.
[{"field":"email","message":"\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u00abEmail\u00bb."}]
Значит сработал экшн Create, все правильно.

Обратите внимание!
Путь, на который шлются запросы не должен заканчиваться слешем. Не знаю почему, но если слать POST запрос на
/rest/lead/ (со слешем на конце) то получаю
{"name":"Method Not Allowed","message":"Method Not Allowed. This url can only handle the following request methods: GET, HEAD.","code":0,"status":405,"type":"yii\\web\\MethodNotAllowedHttpException"}
А если слать тот же POST на
/rest/lead (без слеша на конце) то получаю
[{"field":"email","message":"\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u00abEmail\u00bb."}]
Второй вариант работает корректно.

Так же обратите внимание, что параметр 'enableStrictParsing' закоментирован специально.
Если его раскоментировать и послать любой запрос на /rest/lead/ (со слешем вконце)
то получаю вообще HTML-ку мол

Код: Выделить всё

<div class="row">
	<div class="col-lg-12">
		<h1 class="page-header">
			Not Found (#404)		</h1>
	</div>
</div>
<div class="row">
	<div class="col-lg-12">
		<div class="alert alert-danger">
			Страница не найдена.		</div>
	</div>
</div>			</div>
		</div>
Ищу разработчика или команду разработчиков для поддержки проекта.
Детальнее узнай по ссылке https://goo.gl/YU8uTS.
hlorofos
Сообщения: 1
Зарегистрирован: 2015.01.17, 21:47

Re: UrlManager, PrettyUrl, suffix и REST

Сообщение hlorofos »

rafic, большое вам спасибо за рецепт с
'controller' => ['rest/lead' => 'rest/lead'],

к сожалению документация в этом вопросе очень не качественная, только запутывает.
а со слешом в конце ситуация вообще мрак, касается и GET и POST =((
Lev
Сообщения: 1
Зарегистрирован: 2015.03.04, 15:54

Re: UrlManager, PrettyUrl, suffix и REST

Сообщение Lev »

Я для определенных методов контроллеров делаю следующим образом: 'main/<id><suffix:/>'=> 'site/view'
Получается ссылка вида /site/view/<id> меняется на /main/<id>/
Ответить