【问题标题】:Get current URL/URI without some of $_GET variables获取当前的 URL/URI 没有一些 $_GET 变量
【发布时间】:2012-01-14 19:57:04
【问题描述】:

如何在 Yii 中获取当前页面的 URL。例如:

http://www.yoursite.com/your_yii_application/?lg=pl&id=15

但不包括$GET_['lg'](不手动解析字符串)?

我的意思是,我正在寻找类似于 Yii::app()->requestUrl / Chtml::link() 方法的东西,用于返回 URL 减去一些 $_GET 变量。

编辑:当前解决方案:

unset $_GET['lg'];

echo Yii::app()->createUrl(
  Yii::app()->controller->getId().'/'.Yii::app()->controller->getAction()->getId() , 
  $_GET 
);

【问题讨论】:

标签: php frameworks uri yii current-page


【解决方案1】:

对于 Yii1

我发现首先从 CUrlManager 获取当前路由,然后再次使用该路由来构建新 url 是一种干净的方法。这样您就不会“看到”应用的 baseUrl,请参阅下面的示例。

控制器/动作示例:

GET /app/customer/index/?random=param
$route = Yii::app()->urlManager->parseUrl(Yii::app()->request);
var_dump($route); // string 'customer/index' (length=14)
$new = Yii::app()->urlManager->createUrl($route, array('new' => 'param'));
var_dump($new); // string '/app/customer/index?new=param' (length=29)

模块/控制器/动作示例:

GET /app/order/product/admin/?random=param
$route = Yii::app()->urlManager->parseUrl(Yii::app()->request);
var_dump($route); // string 'order/product/admin' (length=19)
$new = Yii::app()->urlManager->createUrl($route, array('new' => 'param'));
var_dump($new); string '/app/order/product/admin?new=param' (length=34)

只有当你的 url 完全被 CUrlManager 的规则覆盖时这才有效:)

【讨论】:

    【解决方案2】:

    Yii 1

    大多数其他答案都是错误的。发帖人要求提供不带(某些)$_GET 参数的网址。

    这是一个完整的细分(为当前活动的控制器创建 url,模块与否):

    // without $_GET-parameters
    Yii::app()->controller->createUrl(Yii::app()->controller->action->id);
    
    // with $_GET-parameters, HAVING ONLY supplied keys
    Yii::app()->controller->createUrl(Yii::app()->controller->action->id,
        array_intersect_key($_GET, array_flip(['id']))); // include 'id'
    
    // with all $_GET-parameters, EXCEPT supplied keys
    Yii::app()->controller->createUrl(Yii::app()->controller->action->id,
        array_diff_key($_GET, array_flip(['lg']))); // exclude 'lg'
    
    // with ALL $_GET-parameters (as mensioned in other answers)
    Yii::app()->controller->createUrl(Yii::app()->controller->action->id, $_GET);
    Yii::app()->request->url;
    

    当您没有相同的活动控制器时,您必须像这样指定完整路径:

    Yii::app()->createUrl('/controller/action');
    Yii::app()->createUrl('/module/controller/action');
    

    查看 Yii 构建 url 的指南:http://www.yiiframework.com/doc/guide/1.1/en/topics.url#creating-urls

    【讨论】:

    • 是的,很好的答案! (而且确实是唯一正确的问题)不过也可以为 Yii2 使用更新..
    • 找到它:Yii2:Yii::$app->urlManager->createUrl(array_merge([Yii::$app->requestedRoute], $getParams));
    【解决方案3】:

    对于 Yii2: 这应该更安全Yii::$app->request->absoluteUrl 而不是Yii::$app->request->url

    【讨论】:

      【解决方案4】:

      Yii 1

      Yii::app()->request->url
      

      对于 Yii2:

      Yii::$app->request->url
      

      【讨论】:

      • 这应该是正确的答案,因为提问者想用 Yii 完成
      • 这不是发帖人要求的。请参阅下面的答案:stackoverflow.com/questions/8413062/…
      • 这是错误的答案。用户需要排除一些 GET 参数。
      • 这个答案有很多赞成票但它具有误导性,@MichaelButler 答案非常好但您可以看到更短的 yii2 具体答案stackoverflow.com/questions/8413062/…
      • Yii2: Yii::$app->request->url
      【解决方案5】:

      Yii2

      Url::current([], true);
      

      或

      Url::current();
      

      【讨论】:

        【解决方案6】:

        在 Yii2 中你可以这样做:

        use yii\helpers\Url;
        $withoutLg = Url::current(['lg'=>null], true);
        

        更多信息: https://www.yiiframework.com/doc/api/2.0/yii-helpers-baseurl#current%28%29-detail

        【讨论】:

          【解决方案7】:
          echo Yii::$app->request->url;
          

          【讨论】:

          • 如何从 URL 中删除“一些”变量?
          【解决方案8】:

          大部分答案都是错误的。

          问题是在没有一些查询参数的情况下获取 url。

          这是有效的功能。它实际上做了更多的事情。您可以删除不需要的参数,并且可以添加或修改现有参数。

          /**
           * Function merges the query string values with the given array and returns the new URL
           * @param string $route
           * @param array $mergeQueryVars
           * @param array $removeQueryVars
           * @return string
           */
          public static function getUpdatedUrl($route = '', $mergeQueryVars = [], $removeQueryVars = [])
          {
              $currentParams = $request = Yii::$app->request->getQueryParams();
          
              foreach($mergeQueryVars as $key=> $value)
              {
                  $currentParams[$key] = $value;
              }
          
              foreach($removeQueryVars as $queryVar)
              {
                  unset($currentParams[$queryVar]);
              }
          
              $currentParams[0] = $route == '' ? Yii::$app->controller->getRoute() : $route;
          
              return Yii::$app->urlManager->createUrl($currentParams);
          
          }
          

          用法:

          ClassName:: getUpdatedUrl('',[],['remove_this1','remove_this2'])
          

          这将从 URL 中删除查询参数“remove_this1”和“remove_this2”并返回新的 URL

          【讨论】:

            【解决方案9】:

            你肯定在找这个

            Yii::app()->request->pathInfo
            

            【讨论】:

            • 这个是正确答案。但是对于 yii2 应该是Yii::$app->request->pathInfo
            【解决方案10】:
            $validar= Yii::app()->request->getParam('id');
            

            【讨论】:

              【解决方案11】:

              要获取当前请求的绝对 URL(与地址栏中的完全一样,使用 GET 参数和 http://),我发现以下方法效果很好:

              Yii::app()->request->hostInfo . Yii::app()->request->url
              

              【讨论】:

                【解决方案12】:

                所以,你可以使用

                Yii::app()->getBaseUrl(true)
                

                获取一个绝对的 webroot url,并去掉 http[s]://

                【讨论】:

                  【解决方案13】:

                  尝试使用这个变体:

                  <?php echo Yii::app()->createAbsoluteUrl('your_yii_application/?lg=pl', array('id'=>$model->id));?>
                  

                  我猜这是最简单的方法。

                  【讨论】:

                  【解决方案14】:
                  Yii::app()->createAbsoluteUrl(Yii::app()->request->url)
                  

                  这将输出以下格式的内容:

                  http://www.yoursite.com/your_yii_application/
                  

                  【讨论】:

                  • 这应该是正确的答案,有时url不仅包括控制器和动作,还包括视图,并且取决于路由方法。
                  • 我认为这是错误的。因为createAbsoluteUrl 需要一个路由而不是 URL。作者的原始解决方案非常正确,但更正确的解决方案是:$this-&gt;createUrl($this-&gt;getRoute(), $_GET) 并在调用它之前,从$_GET 取消设置您不希望的参数。
                  • 这是一个糟糕的答案,不要使用它!当您的 URL 与路由不匹配时,它会给您带来一堆错误。例如,如果/news/index 应该为带有 slug index 的 News 模型显示路线 news/view。使用此答案,您将获得不正确的 URL - 它会将您重定向到 /news/index route 的 URL,而不是 /news/view.
                  【解决方案15】:

                  如果在控制器中运行,这样的东西应该可以工作:

                  $controller = $this;
                  $path = '/path/to/app/' 
                    . $controller->module->getId() // only necessary if you're using modules
                    . '/' . $controller->getId() 
                    . '/' . $controller->getAction()->getId()
                  . '/';
                  

                  这假设您在应用配置中使用“友好”的 URL。

                  【讨论】:

                  • 依赖一种特定的 url 样式是不好的和不必要的。请参阅有关创建 url 的一般主题:yiiframework.com/doc/guide/1.1/en/topics.url#creating-urls
                  【解决方案16】:

                  我不知道在 Yii 中这样做,但你可以这样做,它应该可以在任何地方工作(很大程度上来自我的回答 here):

                  // Get HTTP/HTTPS (the possible values for this vary from server to server)
                  $myUrl = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] && !in_array(strtolower($_SERVER['HTTPS']),array('off','no'))) ? 'https' : 'http';
                  // Get domain portion
                  $myUrl .= '://'.$_SERVER['HTTP_HOST'];
                  // Get path to script
                  $myUrl .= $_SERVER['REQUEST_URI'];
                  // Add path info, if any
                  if (!empty($_SERVER['PATH_INFO'])) $myUrl .= $_SERVER['PATH_INFO'];
                  
                  $get = $_GET; // Create a copy of $_GET
                  unset($get['lg']); // Unset whatever you don't want
                  if (count($get)) { // Only add a query string if there's anything left
                    $myUrl .= '?'.http_build_query($get);
                  }
                  
                  echo $myUrl;
                  

                  或者,您可以将 Yii 方法之一的结果传递给 parse_url(),并操纵结果以重新构建您想要的。

                  【讨论】:

                  • 这真的很有帮助。我唯一的考虑是 Yii 使用的是“普通”(?var=value) 格式或 PATH (/var/value),它们在配置文件中切换。这就是为什么 Yii 中的链接是使用带有 $_GET 变量数组的 Chtml::link() 构造的。
                  • 哦!所以我可以...在取消设置一个值后将整个 $_GET 数组作为输入参数:)。 [离开一分钟试试看]。
                  • @Sebastian 这可以很容易地重新工作以以/var/value 格式使用它 - 具体如何完成的细节取决于具体情况,但实际上您只是从输入数据,所以并不难。您可以执行类似foreach ($get as $key =&gt; val) $myUrl .= "/$key/$val"; 之类的操作(可能需要稍作改动,具体取决于您的 URL 格式)。
                  • “/$key/$val”的优雅技巧!另一个解决方案:Yii::app()-&gt;createUrl(Yii::app()-&gt;controller-&gt;getId().'/'.Yii::app()-&gt;controller-&gt;getAction()-&gt;getId(), $_GET ); 似乎有效(取消设置$_GET['lg'] :)!
                  • 无需编写 Yii 已经提供的代码。阅读:yiiframework.com/doc/api/1.1/CHttpRequest
                  猜你喜欢
                  • 2013-07-16
                  • 2018-01-12
                  • 2013-11-03
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-06-24
                  • 1970-01-01
                  • 2013-02-27
                  相关资源
                  最近更新 更多