Пишу приложение REST. Есть контроллер test. Обращения AJAX к дефолтным урлам типа
127.0.0.1:8000/tests работают нормально. Пробую добавить кастомный URL. В контроллере создаю соответствующий action :
public function actionYo()
{ return ['result' => 'YO! Pipol!!!! ']; }
в роутах добавляю
[
'class' => 'yii\rest\UrlRule',
'controller' => 'test',
'extraPatterns' => [
'GET yo' => 'yo', // 'xxxxx' refers to 'actionXxxxx'
//пробовал танцевать с бубном вот так - без толку
// 'OPTIONS yo' => 'yo', // 'xxxxx' refers to 'actionXxxxx'
],
],
в postman все работает а в браузере НЕТ. Любимый до слез CORS на страже безопасности!
Если использую еще и // 'OPTIONS yo' => 'yo', // 'xxxxx' refers to 'actionXxxxx' - получаю 401 Unauthorized,
если только 'GET yo' => 'yo', // 'xxxxx' refers to 'actionXxxxx' , то 404 Not Found
Насколько я понимаю, OPTIONS запросы Yii , вообще, должен разруливать самостоятельно.
Дефолтные урлы работают нормально. Cors выглядит вот так (лежит в BaseController от которого и наследуюсь) :
$behaviors['corsFilter'] = [
'class' => \yii\filters\Cors::className(),
'cors' => [ // restrict access to domains:
'Origin' => [
'http://localhost:8080',
],
'Access-Control-Request-Method' => ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS'],
'Access-Control-Allow-Credentials' => true,
'Access-Control-Request-Headers' => ['*'],
'Access-Control-Max-Age' => 3600 * 5,
],
];
Силы и НЕВРЫ на исходе. Само приложение не начинал , ибо воюю с этой....мм..м...б.... нехорошей штукой.
Спасибо!
UPD На решение натолкнул ответ
Decadal. Его варинат рабочий, но писать роуты для каждого нестандартного экшна ,это ...лень! )))
Как известно в Yii имеется ActiveController от которого мы наследуемся , когда пишем свои REST контроллеры. В нем уже определены экшны для стандартных REST роутов. Есть там и экшн для OPTIONS. Таким образом мы можем добавить правило для роутов, которое будет отправлять все OPTIONS запросы на этот экшн. Не надо писать костыли для каждого нестандартного экшна, который нам нужен. Делается это двумя строчками :
[
'class' => 'yii\rest\UrlRule',
'controller' => ['test', 'best'], // строчка ОДЫН - здесь все контроллеры, для которых это должно работать
'extraPatterns' => [
//строчка ДЫВА - эта штука будет отправлять все на экшн options, он уже есть в родительском ActiveController
'OPTIONS <action:\w+>' => 'options'
],
],