nepster-web
@nepster-web

Как игнорировать регистр в экшинах Yii2?

Столкнулся с такой проблемой:

Я написал вот такой экшин:
public function actionUpdateContact($id)
	{
              ...
	}


При этом никак не могу попасть на сего через url. Пробую:
site.ru/admin/users/UpdateContact - 404
site.ru/admin/users/updateContact - 404
site.ru/admin/users/Updatecontact - 404
site.ru/admin/users/updatecontact - 404


Однако если написать вот такое название экшина: actionUpdatecontact
site.ru/admin/users/UpdateContact - 404
site.ru/admin/users/updateContact - 404
site.ru/admin/users/Updatecontact - 404
site.ru/admin/users/updatecontact - ОК


Мои конфигурации:
'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,

			//'enableStrictParsing' => true,
			'suffix' => '',
            
			'rules' => [
                '' => 'admin/default/index',
                
				// Модуль [[users]]  
                'users/<action:\w+>/<id:\d+>' => 'users/default/<action>',              
                'users/<action:\w+>/<page:\d+>' => 'users/default/<action>',         
                'users/<action:\w+>/' => 'users/default/<action>',
                
                
                '<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
                '<controller:\w+>/<action:\w+>' => '<controller>/<action>',
              
			]
		],


Подскажите, пожалуйста, как в экшинах игнорировать регистр при url?
  • Вопрос задан
  • 3647 просмотров
Решения вопроса 3
metamorph
@metamorph
actionUpdateContact = /update-contact
Ответ написан
@nepster09, можно сделать так, чтобы все url перед проверкой на соответствие правилам переводились в lowercase. Для это придется немножко поковыряться в движке: заходим в vendor/yiisoft/yii2/web/UrlRule.php и в методе parseRequest

меняем
<?php
// ...
$pathInfo = $request->getPathInfo();

на
<?php
// ...
$pathInfo = strtolower($request->getPathInfo());

Не знаю, насколько это правильно, поэтому советовать делать именно так не буду, но вы можете пробовать. Во всяком случае, вашу проблему оно решает.
Ответ написан
nepster-web
@nepster-web Автор вопроса
'urlManager' => [
            'ruleConfig' => ['class'=>'backend\components\MyUrlManager'],
...


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

В общем MyUrlManager полностью такой-же как и стандартный UrlManager с различием в одну строку в функции parseRequest

$pathInfo = $request->getPathInfo();
        $pathInfo = rtrim(strtolower($pathInfo),'/');
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы