2015-12-30 15:25:56 4349次浏览 2条回答 0 悬赏 10 金钱

定义路由'<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就可以,是中间的-问题吗?

  • 回答于 2016-01-05 23:16 举报

    请重写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 条回复
    回复于 2016-01-06 06:57 回复

    更新最新的框架此问题就解决了.

    回复于 2016-01-06 07:07 回复

    '<module:[\w._-]+>/<controller:[\w._-]+>/<action:[\w._-]+>/<id:\d+>' => '<module>/<controller>/<action>',
    这是官网的做法

    回复于 2016-01-06 17:21 回复

    好吧。我想复杂了。。

  • 回答于 2016-01-11 17:50 举报

    问题定位的对

您需要登录后才可以回答。登录 | 立即注册
qq3737002
副总裁

qq3737002 河南郑州

注册时间:2015-03-29
最后登录:2022-07-04
在线时长:59小时26分
  • 粉丝31
  • 金钱4498
  • 威望170
  • 积分6788

热门问题