仅具有获取参数的 Yii2 路由(隐藏控制器和操作)
Yii2 routing with get parameters only ( hidden controller and action )
我看到隐藏了控制器和动作的路由,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 中隐藏控制器和操作的文章,但我怎样才能做到这一点?先感谢您!
P.S。 page-33
- 第一部分例如 page
是存储在 db 中的页面的标题,第二部分例如33
是id。
我会举一个例子,我希望你能从中看出模式如何让它在你的具体情况下发挥作用。
假设您想实现一个简单的搜索。这是您的搜索表单,您将操作的参数提交给 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-manager 配置文件中设置你的 url 规则,如下所示:
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);
}
我看到隐藏了控制器和动作的路由,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 中隐藏控制器和操作的文章,但我怎样才能做到这一点?先感谢您!
P.S。 page-33
- 第一部分例如 page
是存储在 db 中的页面的标题,第二部分例如33
是id。
我会举一个例子,我希望你能从中看出模式如何让它在你的具体情况下发挥作用。
假设您想实现一个简单的搜索。这是您的搜索表单,您将操作的参数提交给 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-manager 配置文件中设置你的 url 规则,如下所示:
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);
}