如何获取Cakephp的完整当前URL

时间:2011-07-26 21:44:20

标签: php cakephp

如何在Cake的视图中回显出当前的URL?

25 个答案:

答案 0 :(得分:78)

你可以做任何一次

从视图文件中:

<?php echo $this->here; ?>

这将为您提供主机名的绝对URL,即/ controller / action / params

或者

<?php echo Router::url( $this->here, true ); ?> 

应该为您提供包含主机名的完整网址。

答案 1 :(得分:47)

我更喜欢这个,因为如果我没有提到“请求”字样,我的IDE会发出警告。

<?php echo $this->request->here; ?>

API文件: class-CakeRequest


编辑: 澄清所有选项

Current URL: http://example.com/en/controller/action/?query=12

// Router::url(null, true)
http://example.com/en/controller/action/

// Router::url(null, false)
/en/controller/action/

// $this->request->here
/en/controller/action/

// $this->request->here()
/en/controller/action/?query=12

// $this->request->here(false)
/en/controller/action/?query=12

// $this->request->url
en/controller/action

// $_SERVER["REQUEST_URI"]
/en/controller/action/?query=12

// strtok($_SERVER["REQUEST_URI"],'?');
/en/controller/action/

答案 2 :(得分:27)

<?php echo $_SERVER[ 'REQUEST_URI' ]; ?>

编辑:或,

<?php echo $this->Html->url( null, true ); ?>

答案 3 :(得分:11)

以下“Cake方式”非常有用,因为您可以获取完整的当前URL并修改其中的部分内容,而无需手动解析$_SERVER[ 'REQUEST_URI' ]字符串,然后手动将其连接回有效的URL以进行输出。

完整的当前网址:
Router::reverse($this->request, true)

轻松修改当前网址的特定部分:
1)制作Cake的请求对象的副本: $request_copy = $this->request

2)然后修改$request_copy->params和/或$request_copy->query数组

3)最后:$new_url = Router::reverse($request_copy, true)

答案 4 :(得分:7)

Cakephp 3.5:

echo $this->Url->build($this->request->getRequestTarget());

调用$ this-&gt; request-&gt; here()自3.4起不推荐使用,将在4.0.0中删除。你应该改用getRequestTarget()。

答案 5 :(得分:5)

我知道这篇文章有点过时了,CakePHP版本自此繁荣起来。在CakePHP的当前(2.1.x)版本中,即使在1.3.x中,如果我没有弄错,也可以像这样得到当前的控制器/视图URL:

$this->params['url'];

虽然此方法不返回参数,但如果您想在构建新URL时将参数附加到链接,则会很方便。例如,我们有当前的网址:

<强>项目/编辑/ 6

我们想要附加一个名为c_action的自定义参数操作,其值为remove_image,可以使用$this->params['url];并将其与自定义参数key =&gt;的数组合并。价值对:

echo $this->Html->link('remove image', array_merge($this->params['url'], array('c_action' => 'remove_image'));

使用上述方法,我们可以将自定义参数附加到链接,而不会导致参数的长链在URL上建立,因为$ this-&gt; params ['url]只返回控制动作URL。

在上面的示例中,我们需要手动将ID 6重新添加到URL中,因此最终的链接构建可能是这样的:

echo $this->Html->link('remove image', array_merge($this->params['url'], array($id,'c_action' => 'remove_image'));

其中$ is是项目的ID,您可以将其分配给控制器级别的变量。然后新的URL将是:

<强>项目/编辑/ 6 / c_action:remove_image

很抱歉,如果这一点没有关系,但我在寻找实现上述目标的方法时遇到了这个问题,并认为其他人可能会从中受益。

答案 6 :(得分:5)

CakePHP 3的

$this->Url->build(null, true) // full URL with hostname

$this->Url->build(null) // /controller/action/params

答案 7 :(得分:4)

获取CakePHP 3.x的当前URL?

在你的布局中:

<?php 
    $here = $this->request->here();
    $canonical = $this->Url->build($here, true);
?>

您将获得当前页面的完整URL,包括查询字符串参数。

e.g。 http://website.example/controller/action?param=value

如果你需要做一些搜索引擎优化,你可以在元标记规范中使用它。

<link rel="canonical" href="<?= $canonical; ?>">

答案 8 :(得分:4)

在视图文件中获取当前URL非常简单

echo Router::url($this->here, true);

这将返回完整的网址http://www.example.com/subpath/subpath

如果您只想要相对路径,请使用以下

echo $this->here;

理想情况下,Router :: url(“”,true)应返回当前视图的绝对URL,但它始终返回相对URL。所以获取绝对URL的黑客是

$absolute_url  = FULL_BASE_URL + Router::url(“”, false);

要获取FULL_BASE_URL,请检查here

答案 9 :(得分:3)

在请求对象中,您拥有所需的一切。 要理解它:

debug($this->request->url);

,在你的情况下

$here = $this->request->url;

答案 10 :(得分:3)

获取不带参数的完整网址:

echo $this->Html->url('/', true);

将返回http(s)://(www.)your-domain.com

答案 11 :(得分:1)

在视图中

Blank URL: <?php echo $this->Html->Url('/') ?>
Blank Full Url: <?php echo $this->Html->Url('/', true) ?>
Current URL: <?php echo $this->Html->Url($this->here) ?>
Current Full URL: <?php echo $this->Html->Url($this->here, true) ?>

在控制器中

Blank URL: <?php echo Router::url('/') ?>
Blank Full Url: <?php echo Router::url('/', true) ?>
Current URL: <?php echo Router::url($this->request->here()) ?>
Current Full URL: <?php echo Router::url($this->request->here(), true) ?>

答案 12 :(得分:1)

for cakephp3 +:

$url = $this->request->scheme().'://'.$this->request->domain().$this->request->here(false);

会得到例如: http://bgq.dev/home/index?t44=333

答案 13 :(得分:1)

CakePHP 3.x的

您可以使用UrlHelper

$this->Url->build(null, true) // output http://somedomain.com/app-name/controller/action/params

$this->Url->build() // output /controller/action/params

或者您可以使用PaginatorHelper(如果您想在javascript或...中使用它):

$this->Paginator->generateUrl() // returns a full pagination URL without hostname

$this->Paginator->generateUrl([],null,true) // returns a full pagination URL with hostname

答案 14 :(得分:1)

1.3的Cake方式是使用Router :: reverse:

Link to documentation

$url = Router::reverse($this->params)
echo $url;

产量

/Full/Path/From/Root/MyController/MyAction/passed1/named_param:bob/?param1=true&param2=27

答案 15 :(得分:1)

我找到的最简单的方法是包含主机/路径/查询和
适用于ControllersCakephp 3.4):

Cake\View\Helper\UrlHelper::build($this->request->getRequestTarget());

返回类似这样的内容(我们将其用作登录回调网址):

http://192.168.0.57/archive?melkId=12

答案 16 :(得分:0)

经过研究,我发现它是CakePHP 3的完美完整URL

param6

完整URL 类似于

  

http://example.com/books/edit/12

您可以在此处阅读更多信息: https://pritomkumar.blogspot.com/2017/04/how-to-get-complete-current-url-for.html

答案 17 :(得分:0)

在CakePHP 3中,$this->here已被弃用。实际方法是使用这种方法:

Router::url($this->request->getRequestTarget())

答案 18 :(得分:0)

Cakephp 3.x随时随地:

Router::reverse(Router::getRequest(),true)

答案 19 :(得分:0)

对于CakePHP 4。*

echo $this->Html->link(
    'Dashboard',
    ['controller' => 'Dashboards', 'action' => 'index', '_full' => true]
);

答案 20 :(得分:0)

如果要返回基本路径,可以检查 Router 类是否使用了 Configure::read ('App.fullBaseUrl')。因此,如果您喜欢六边形架构,您可以创建一个 Cake 实现来创建仅使用来自所有 CakePHP 框架的 Configure 的 URL。

答案 21 :(得分:0)

使用Html助手

<?php echo $this->Html->url($this->here, true); ?> 

它会生成从http或https开始的完整网址

答案 22 :(得分:0)

是的,CakePHP 1.3中的Controller Work中的简单FULL URL&gt;

<?php echo Router::url( array('controller'=>$this->params['controller'],'action'=>$this->params['action']), true );

Saludos

答案 23 :(得分:0)

以前提出的所有方法都不符合我获取完整网址的要求(完全符合条件),例如:用于从控制器动作发送的电子邮件中。我还需要方案和主机名,因此偶然发现了以下方法:

<?php echo Router::url( array( $id ), true ) ?>

由于提供路由器阵列电流控制器并且保持动作,但是id不是,因此必须再次提供。第二个参数true实际上是要求提供主机名等以获取完整的URL。

使用Router :: url()可以在任何情况下使用,因此也可以在视图文件中使用。

答案 24 :(得分:0)

我使用$this->here作为路径,以获取Juhana所说的并使用$_SERVER变量时必须执行的整个网址。没有必要使用Cake函数。