Yii2 routing with get parameters only ( hidden controller and action )

夙愿已清 提交于 2019-12-24 08:57:48

问题


I saw routing where the controller and the action are hidden and url is constructed like www.domain.com/en/page-33/category-28/product-89?param=some_param. In this routing when I try to get the parameters with var_dump(Yii::$app->getRequest()->getQueryParams()) I got array like so :

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

How can I do that ? I saw the rules and they are

'<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'

I tried to make it this way at home but when I dump the Yii::$app->getRequest()->getQueryParams() it is an empty array. How this url is made like a GET parameters ( if I understood right ). I red articles about how to hide the controller and action in the url but how can I make it this way ? Thank you in advance! P.S. page-33 - first part e.g page is the title of the page stored in db and the second one e.g. 33 is the id.


回答1:


I will give an example, and i hope you will see the pattern from it how to make it work in your specific case.

Let's say you want to implement a simple search. There is your searchform, you submit the params for an action, to the SearchController::actionIndex(). Here you can process your parameters what was sent to it.

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
            )
        );
}

After this, set your url rules in a url-manager config file like this:

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
]

So this way if your application recognizes a rule, it will parse it and send the request to the right route.

You will need another action in your 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);
 }


来源:https://stackoverflow.com/questions/50746730/yii2-routing-with-get-parameters-only-hidden-controller-and-action

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!