UrlManager, PrettyUrl, suffix и REST
UrlManager, PrettyUrl, suffix и REST
ЧПУ - это классно. Если дописывать .html - то вообще красиво получается. Но зато выходит не очень красиво, если в одном модуле имеются ещё REST контроллеры. В урлах вставлять расширение .html уже как-то не очень хорошо.
Как-то вот сходу не увидел, можно ли отключать суффикс для отдельного контроллера? В поиске тоже ничего не нашел.
Как-то вот сходу не увидел, можно ли отключать суффикс для отдельного контроллера? В поиске тоже ничего не нашел.
Re: UrlManager, PrettyUrl, suffix и REST
думаю, можно в beforeAction или в любом другом подобном методе переназначить суффикс на лету
Re: UrlManager, PrettyUrl, suffix и REST
Ну... Я тоже было так подумал. Но ведь любой экшин станет выполняться только тогда, когда urlManager его найдёт, а без суффикса он искать отказывается.
Re: UrlManager, PrettyUrl, suffix и REST
Вася, это понятно. Человек и так выставляет суффикс в конфиге. Ему нужно отменять для некоторых экшнов/контроллеров.vova07 писал(а):Можно! https://github.com/yiisoft/yii2/blob/f0 ... le.php#L70 и специально для REST https://github.com/yiisoft/yii2/blob/3a ... le.php#L67 .
Re: UrlManager, PrettyUrl, suffix и REST
Видимо, что-то я не до конца понимаю.
Сделал я так:
Никаких изменений. Пробовал и пустую строку подсовывать, и просто случайную последовательность символов - тот же эффект.
Неужели приходится выбирать - или красиво юзеру, или красиво серверу?
Сделал я так:
Код: Выделить всё
[
'class' => 'yii\rest\UrlRule',
'controller' => [
'rest/user',
'rest/contact',
],
'suffix' => null,
],
Неужели приходится выбирать - или красиво юзеру, или красиво серверу?
Re: UrlManager, PrettyUrl, suffix и REST
Саша, я именно это и предложил.
Прям отключить это нельзя, но можно переопределить. REST правила в любом случае пишутся в конфиг.
@ivahaev Судя по исходникам, NULL как раз игнорируется. Попробуйте 'suffix' => '/'
Прям отключить это нельзя, но можно переопределить. REST правила в любом случае пишутся в конфиг.
@ivahaev Судя по исходникам, NULL как раз игнорируется. Попробуйте 'suffix' => '/'
Re: UrlManager, PrettyUrl, suffix и REST
Не, ниче не выходитvova07 писал(а):Саша, я именно это и предложил.
Прям отключить это нельзя, но можно переопределить. REST правила в любом случае пишутся в конфиг.
@ivahaev Судя по исходникам, NULL как раз игнорируется. Попробуйте 'suffix' => '/'
Re: UrlManager, PrettyUrl, suffix и REST
да, я уже понял, что это суффикс для конкретных правил. Прошу прощенияvova07 писал(а):Саша, я именно это и предложил.
Прям отключить это нельзя, но можно переопределить. REST правила в любом случае пишутся в конфиг.
@ivahaev Судя по исходникам, NULL как раз игнорируется. Попробуйте 'suffix' => '/'
Re: UrlManager, PrettyUrl, suffix и REST
Напишите конфиг урл мэнеджера, так как это странно.
Re: UrlManager, PrettyUrl, suffix и REST
Сейчас вот так
Код: Выделить всё
'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' => '/',
],
],
],
Re: UrlManager, PrettyUrl, suffix и REST
А REST правила доступны по адресу "rest/s-group/action/" ?
Если да, и вам не нужны '.html' то 'enableStrictParsing' => true в помощь.
Если да, и вам не нужны '.html' то 'enableStrictParsing' => true в помощь.
Re: UrlManager, PrettyUrl, suffix и REST
А вот тут опять недопонял. Что там должно быть? Пока 404, т.к. суффикс не дописан.vova07 писал(а):А REST правила доступны по адресу "rest/s-group/action/" ?
Если мне не изменяет память, первый Yii принимал и так и сяк - запросы и с суффиксом и без. Специально не использовал, но баловался разными урлами в свое время.
Re: UrlManager, PrettyUrl, suffix и REST
Имелось введу, что сами URL REST-а работают или нет?
Что именно не так сейчас?
Что именно не так сейчас?
Re: UrlManager, PrettyUrl, suffix и REST
А, так все работает. У меня были просто некие философские рассуждения о красоте ссылок, при использовании суффикса .
Для REST API как-то не очень красиво html дописывать.
Пока как вариант вижу - выносить в отдельный модуль весь REST API.
Для REST API как-то не очень красиво html дописывать.
Пока как вариант вижу - выносить в отдельный модуль весь REST API.
Re: UrlManager, PrettyUrl, suffix и REST
Раз уж вы здесь обсуждаете URL менеджер...
Есть у меня контроллер Consumer унаследован от \yii\rest\Controller и расположен в /controllers/rest.
Хочу экшены распределить по типам запросов:
Я так понимаю, по умолчанию все методы доступны по всем типам запросов. А уже доступность регулируется через метод verbs() контроллера ?
Но тогда как работать с этим куском кода из доки
Есть у меня контроллер 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.
Детальнее узнай по ссылке https://goo.gl/YU8uTS.
Re: UrlManager, PrettyUrl, suffix и REST
что вас смущает? это код роутинга.
Re: UrlManager, PrettyUrl, suffix и REST
Меня смущает то, что я не могу догнать куда его нужно писать. Можете показать пример правила в котором контроллер Consumer имеет настроенный роутинг по следующим правиламzelenin писал(а):что вас смущает? это код роутинга.
Я буду крайне признателен вам за помощь)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 и получал ответ
То есть срабатывает экшн Index, а должен Create{"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"}
Как починил?
сделал вот так
Код: Выделить всё
'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>',
]
],
Значит сработал экшн Create, все правильно.[{"field":"email","message":"\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u00abEmail\u00bb."}]
Обратите внимание!
Путь, на который шлются запросы не должен заканчиваться слешем. Не знаю почему, но если слать POST запрос на
/rest/lead/ (со слешем на конце) то получаю
А если слать тот же POST на{"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"}
/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.
Детальнее узнай по ссылке https://goo.gl/YU8uTS.
Re: UrlManager, PrettyUrl, suffix и REST
rafic, большое вам спасибо за рецепт с
'controller' => ['rest/lead' => 'rest/lead'],
к сожалению документация в этом вопросе очень не качественная, только запутывает.
а со слешом в конце ситуация вообще мрак, касается и GET и POST =((
'controller' => ['rest/lead' => 'rest/lead'],
к сожалению документация в этом вопросе очень не качественная, только запутывает.
а со слешом в конце ситуация вообще мрак, касается и GET и POST =((
Re: UrlManager, PrettyUrl, suffix и REST
Я для определенных методов контроллеров делаю следующим образом: 'main/<id><suffix:/>'=> 'site/view'
Получается ссылка вида /site/view/<id> меняется на /main/<id>/
Получается ссылка вида /site/view/<id> меняется на /main/<id>/