关于路由的问题 [ 2.0 版本 ]
定义路由'<module:\w+>/<controller:\w+>/<action:\w+>/<id:\d+>' => '<module>/<controller>/<action>',
在cms-channel控制器中定义page动作,想得到类似http://localhost/cms/cms-channel/page/1.html
的网址,但是得到的是http://cms/cms/cms-channel/page.html?id=1
这样的
class CmsChannelController extends Controller
{
public function actionPage($id)
{
return $this->render('page', [
'model' => $this->findModel($id)
]);
}
}
echo Url::toRoute([
'cms-channel/page',
'id' => $channel->id
]);
如果将控制器cms-channel改为channel就可以,是中间的-
问题吗?
共 2 个回答
-
请重写UrlRule类。
给你个示例如下:`<?php namespace app\components; use yii\web\UrlRuleInterface; use yii\base\Object; class NewsUrlRule extends Object implements UrlRuleInterface{ /* 此函数可以创建Url,辅助 yii\helpers\Url类创建Url时使用。 */ public function createUrl($manager, $route, $params) { if ($route === 'news/item-detail') { if (isset($params['title'])) { return 'news/'.$params['title']; } } return false; // this rule does not apply } //parse请求 public function parseRequest($manager, $request) { $pathInfo = $request->getPathInfo(); if (preg_match('%^([^\/]*)\/([^\/]*)$%', $pathInfo, $matches)) { if($matches[1] == 'news'){ $params = [ 'title' => $matches[2]]; return ['news/item-detail', $params]; }else{ return false; } } return false; // this rule does not apply } } ?>`
然后在组件中配置相应的类
'urlManager' => [ 'enablePrettyUrl' => true, 'showScriptName' => false, 'rules'=>[ ['class' => 'app\components\NewsUrlRule'], //配置缺省路由规则。 'news/<year:\d{4}>/item-url-test' => 'news/item-url-test', [ 'pattern' => 'news/<category:\w+>/item-url-test', 'route' => 'news/item-url-test', 'defaults' => ['category' => 'shopping'], ], ], ],
共 3 条回复@qq3737002 好吧。我想复杂了。。
qq3737002 河南郑州
注册时间:2015-03-29
最后登录:2022-07-04
在线时长:59小时26分
最后登录:2022-07-04
在线时长:59小时26分
- 粉丝31
- 金钱4498
- 威望170
- 积分6788