Маршрутизация Yii2 только с параметрами получения (скрытый контроллер и действие) - PullRequest
0 голосов
/ 07 июня 2018

Я видел маршрутизацию, где контроллер и действие скрыты, а URL построен как www.domain.com/en/page-33/category-28/product-89?param=some_param.В этой маршрутизации, когда я пытаюсь получить параметры с var_dump(Yii::$app->getRequest()->getQueryParams()), я получаю массив примерно так:

array(4) { ["first_step"]=> string(7) "page-33" ["second_step"]=> string(11) "category-28" ['product']=> string(10) "product-89" ['param']=> string(10) "some_param"}

Как я могу это сделать?Я видел правила, и они

'<first_step>/<second_step>/<product>/<test>/<test2>/<test3>/<test4>' => 'page/index',
                '<first_step>/<second_step>/<product>/<test>/<test2>/<test3>' => 'page/index',
                '<first_step>/<second_step>/<product>/<test>/<test2>' => 'page/index',
                '<first_step>/<second_step>/<product>/<test>' => 'page/index',
                '<first_step>/<second_step>/<product>' => 'page/index'
                '<first_step>//<product>' => 'page/index', 
                '<first_step>/<second_step>' => 'page/index',
                '<first_step>' => 'page/index'

Я пытался сделать это дома, но когда я сбрасываю Yii::$app->getRequest()->getQueryParams(), это пустой массив.Как этот URL сделан как параметры GET (если я правильно понял).Я пишу статьи о том, как скрыть контроллер и действие в URL, но как я могу сделать это таким образом?Заранее спасибо!PS page-33 - первая часть, например, page - это заголовок страницы, хранящейся в БД, а вторая, например, 33 - это идентификатор.

1 Ответ

0 голосов
/ 08 июня 2018

Я приведу пример, и я надеюсь, что вы увидите из него пример того, как заставить его работать в вашем конкретном случае.

Допустим, вы хотите реализовать простой поиск.Есть ваша поисковая форма, вы отправляете параметры для действия на SearchController::actionIndex().Здесь вы можете обработать ваши параметры, что было отправлено на него.

public function actionIndex()
{
    $searchForm = new SearchForm();

    if (Yii::$app->request->post()) {

        $searchForm->load(Yii::$app->request->post());
        $productType = $searchForm->productType;
        $productName = $searchForm->productName;

        $searchAttributes = $searchForm->attributes;

        unset($searchAttributes['productName']); //unset what you want to be a nicely formatted part of the url, like domain.eu/productType/productName
        unset($searchAttributes['productType']);
        foreach ($searchAttributes as $key => $value) {
            if (empty($value)) {
                unset($searchAttributes[$key]);
            }
        }

        $this->redirect(
            array_merge(
                ['/search/list', 'type' => $producType, 'name' => $productName, 
                $searchAttributes //this variable will contain all other parameters as regualer get parameters
            )
        );
}

После этого установите свои правила url в файле конфигурации url-manager следующим образом:

return [
'class' => 'yii\web\UrlManager',
'enablePrettyUrl' => true,
'showScriptName' => false,
'enableStrictParsing' => false,
'rules' => [
    [
        // /productType/productName
        'pattern' => '<type>/<name>',
        'route' => 'search/list',
        'encodeParams' => false,
        'defaults' => ['type' => null, 'name' => null],
    ],
     //add other rules as you need
]

Таким образом, если ваше приложение распознает правило, оно его проанализирует иотправьте запрос по нужному маршруту.

Вам потребуется другое действие в вашем SearchController:

public function actionList($type = null, $name = null) {
//do the search or anything you want to do here
    $get = Yii::$app->request->get();
    var_dump($get);
    var_dump($type); 
    var_dump($name);
 }
...