【问题标题】:How can I get get params in url via slashes in Yii2?如何通过 Yii2 中的斜杠获取 url 中的参数?
【发布时间】:2017-11-08 23:25:29
【问题描述】:

我想通过斜杠获取参数来构建 url。

例如,我想要这个代码:

Url::to(['/controller/action',
    'filter' => 'filter,
    'param1' => 'value1',
    'param2' => 'value2' ...]);

生成网址: //path.to.site/controller/action/filter/param1/value1/param2/value2...

有没有办法通过默认的 urlManager 做到这一点?

【问题讨论】:

    标签: php yii2


    【解决方案1】:

    当然:

    'urlManager' => [
        'rules' => [
            '<controller>/<action>/<filter>/param1/<param1>/param2/<param2>' => '<controller>/<action>',
        ],
    ],
    

    那么Url::to会返回如下结果:

    Url::to([
        '/controller/action',
        'filter' => 'some-filter',
        'param1' => 'value1',
        'param2' => 'value2'
    ]);
    
    // Result: http://base.url/controller/action/some-filter/param1/value1/param2/value2
    

    【讨论】:

    • 这仅适用于 param1 和 param2,我需要预先未知数量的参数。
    【解决方案2】:

    use Yii;
    use yii\web\UrlRuleInterface;
    
    class SearchUrlRule implements UrlRuleInterface
    {
    
        public function parseRequest($manager, $request)
        {
            $pathInfo = $request->getPathInfo();
    
            if (strpos($pathInfo, 'somepath') !== 0) {
                return false;
            }
    
            $parameters = explode('/', $pathInfo);
    
            if ($parameters[1] !== 'f') {
                return false;
            }
    
            $route = 'controller/action';
    
            $params = [
                'filter' => 'f'
            ];
            $count = count($parameters);
            $i = 2;
            var_dump($parameters);
            while (($i + 1) < $count) {
                $params[$parameters[$i]] = $parameters[$i + 1];
                $i = $i + 2;
            }
    
            Yii::trace("Request parsed with URL rule: action/controller", __METHOD__);
    
            return [$route, $params];
        }
    
        public function createUrl($manager, $route, $params)
        {
            if ($route !== 'controller/action') {
                return false;
            }
    
            if ($params['filter'] !== 'f') {
                return false;
            }
            unset($params['filter']);
    
            //If a parameter is defined and not empty - add it to the URL
            $url = 'somepath/f/';
    
            foreach ($params as $k => $param) {
                $url .= "$k/" . $param;
            }
    
            return $url;
        }
    }
    

    这是解决我问题的代码。在配置中:

            'rules' => [
                ...
                ['class' => 'frontend\components\SearchUrlRule'],
                ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-13
      相关资源
      最近更新 更多