Задать вопрос
shcherbanich
@shcherbanich
Программист

ЧПУ Yii2, передача GET параметров, как организовать?

В Yii раньше можно было написать так:
'urlManager'=>array(
			'showScriptName'=>false,
			'urlFormat' => 'path',
		),


И тогда при запросе /site/index/my_get/2 , в экшене index я получал get параметр my_get со значением 2.

Хочу так же сделать в Yii2, пишу:
'urlManager'=>[
            'class'=>'yii\web\UrlManager',
            'showScriptName'=>false,
            'enablePrettyUrl' => true,
        ],

В результате поведение совсем не то, получаю "Unable to resolve the request".
Подскажите пожалуйста, как максимально просто добиться такого же результата как в Yii 1

ПРИМЕР:
перехожу по /site/index/c/1/b/2
РЕЗУЛЬТАТ:
мы в экшене index контроллера site, получаю массив GET [c=>1,b=>2]
  • Вопрос задан
  • 18584 просмотра
Подписаться 8 Оценить Комментировать
Решения вопроса 1
shcherbanich
@shcherbanich Автор вопроса
Программист
Решение:
'rules' => [
                ['class' => 'app\components\CarUrlRule', 'connectionID' => 'db'],
            ],


Код класса:
<?php

namespace app\components;

use yii\web\UrlRule;

class CarUrlRule extends UrlRule
{
    public $connectionID = 'db';
    public $pattern = 'car';
    public $route = 'car';

    public function createUrl($manager, $route, $params)
    {
        if ($route === 'car/index') {
            if (isset($params['manufacturer'], $params['model'])) {
                return $params['manufacturer'] . '/' . $params['model'];
            } elseif (isset($params['manufacturer'])) {
                return $params['manufacturer'];
            }
        }
        return false;  // this rule does not apply
    }

    public function parseRequest($manager, $request)
    {
        $pathInfo = $request->getPathInfo();

        $segs=explode('/',$pathInfo.'/');

        $data = array();
           
        $n=count($segs);       
    
        for($i=0;$i<$n-1;$i+=2){

            if($segs[$i]==='') 
                continue;

            $value = $segs[$i+1];

            if($m=preg_match_all('/\[(.*?)\]/',$segs[$i],$matches)){
                
                $name=substr($segs[$i],0,$pos);

                for($j=$m-1;$j>=0;--$j)
                    if($matches[1][$j]==='')
                        $value=array($value);
                    else
                        $value=array($matches[1][$j]=>$value);

                $data[$name]=$value;
            }
            else
                $data[$segs[$i]]=$value;
        }
        return ['site/index', $data];
    }
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
phpnt
@phpnt
Сделал видео по UrlManager
Ответ написан
Комментировать
wladyspb
@wladyspb
Программист
Есть решение проще, в конфиге урл менеджера это выглядит примерно так:
'urlManager' => [
			'enablePrettyUrl' => true,
			'showScriptName' => false,
			'rules' => [
				'<controller>/<action>' => '<controller>/<action>',
				'site/hello/<name:\w+>' => 'site/hello',
			]
		],

После этого вызов site/hello/someName передаётся в контроллер site, экшн hello с гет-параметром $name = SomeName
Ответ написан
Isolution666
@Isolution666
Full-Stack Developer
ПРИМЕР:
перехожу по /site/index/c/1/b/2

'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'rules' => [
                '' => 'site/index', // сделает главную страницу сайтконтроллера чистой без слэшей и экшенов
               'site/index/<c:\d+>/<b:\d+>' => 'site/index', // если верхнее правило оставить можно вот так обработать http://example.ru/1/2 - d+ - digital - обрабатывает только цифры
...
],


РЕЗУЛЬТАТ:
мы в экшене index контроллера site, получаю массив GET [c=>1,b=>2]


Тут я вижу только два параметра. если хотите как `/site/index/c/1/b/2`

'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'rules' => [
                '' => 'site/index', 
               'site/index/<param:\w+>/<c:\d+>/<params:\w+>/<b:\d+>' => 'site/index', 
               'site/index/<param:\w+>/<c:\d+>/<params:\w+>/<b:\d+>.html' => 'site/index',  // с преффиксом .html
// analog -> http://example.ru/site/index?param=c&c=1&params=b&b=2
// analog -> http://example.ru/site/index/c/1/b/2
// preffix -> http://example.ru/site/index/c/1/b/2.html
...
],


Всё на много проще :)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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