Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在cakephp3中从Helpers构建URL时添加尾随斜杠_Php_Cakephp_Cakephp 3.0_View Helpers_Trailing Slash - Fatal编程技术网

在cakephp3中从Helpers构建URL时添加尾随斜杠

在cakephp3中从Helpers构建URL时添加尾随斜杠,php,cakephp,cakephp-3.0,view-helpers,trailing-slash,Php,Cakephp,Cakephp 3.0,View Helpers,Trailing Slash,我正在使用CakePHP3开发一个类似博客的网站,并为SEO目的创建了带有尾随斜杠的规范URL结构。为了实现这一点,我在routes文件中构建了与尾部斜杠匹配的请求,并在webroot.htaccess中进行了正确的重定向,以处理没有尾部斜杠的请求。此外,在AppControllerI中,我覆盖重定向功能以管理来自控制器的重定向: function redirect($url, $status = null, $exit = true) { $routerUrl = Router::ur

我正在使用CakePHP3开发一个类似博客的网站,并为SEO目的创建了带有尾随斜杠的规范URL结构。为了实现这一点,我在routes文件中构建了与尾部斜杠匹配的请求,并在
webroot
.htaccess
中进行了正确的重定向,以处理没有尾部斜杠的请求。此外,在
AppController
I中,我覆盖重定向功能以管理来自控制器的重定向:

function redirect($url, $status = null, $exit = true)
{
    $routerUrl = Router::url($url, true);
    if(!preg_match('/\.[a-z0-9]{1,5}$/', strtolower($routerUrl)) && substr($routerUrl, -1) != '/') {
        $routerUrl .= '/';
    }
    parent::redirect($routerUrl, $status, $exit);
}
到目前为止,一切顺利

现在,我想在每次使用帮助器构建URL时都使用一个尾随斜杠来构建URL,比如
FormHelper
HtmlHelper
。例如:

$this->Form->create(null, [
    'url' => ['controller' => 'Messages', 'action' => 'send']
]);
本例中的URL输出为:

/信息/发送

我需要的是:

/信息/发送/

目前,我正在帮助器的选项中硬编码URL,以使其工作(尚未投入生产)。如果我使用示例的选项,则在提交表单时,由于
.htaccess
重定向规则,表单会重定向/messages/send to/messages/send/,并且POST数据会丢失


提前谢谢,我为我糟糕的英语道歉,我希望我说得清楚。

如果您想在操作结束时添加
/
,您可以尝试:

$this->Form->create(null, [
    'url' => $this->Url->build('/Messages/send/', true)
]);
另请参见

我建议为您的
助手
调整URL构建

src/View/AppView.php

class AppView extends View
{
    public function initialize()
    {
        $this->loadHelper('Url', [
            'className' => 'MyUrl'
        ]);
    }
}
namespace App\View\Helper;

use Cake\View\Helper\UrlHelper;

class MyUrlHelper extends HtmlHelper
{
    public function build($url = null, $options = false)
    {
        // Add your code to override the core UrlHelper build() function

        return $url;
    }
}
src/View/Helper/MyUrlHelper.php

class AppView extends View
{
    public function initialize()
    {
        $this->loadHelper('Url', [
            'className' => 'MyUrl'
        ]);
    }
}
namespace App\View\Helper;

use Cake\View\Helper\UrlHelper;

class MyUrlHelper extends HtmlHelper
{
    public function build($url = null, $options = false)
    {
        // Add your code to override the core UrlHelper build() function

        return $url;
    }
}

找到
UrlHelper

的原始源代码。我用三个字符解决了它:)

1-open\vendor\cakephp\cakephp\src\View\Helper\UrlHelper.php 2-转到build函数并将“/”添加到返回的$url中,如下所示

它应该看起来像 返回$url.'/'

而不是 返回$url

我知道这是肮脏的解决方案,不好编辑核心。。。我认为你最好覆盖构建函数


我希望有更好的方法

我已经有了这样的URL,但我需要的是使用Controller和Action选项用尾部斜杠来创建URL。['controller'=>'Messages','action'=>'send']我这样做是为了避免在我决定将来更改请求别名时通过此方法跟踪每个URL集,只是不要这样做,无论您使用带或不带尾随斜杠的URL,只要确保你坚持其中一个,谢谢你的建议。也许我没有正确地表达自己。当我说“出于SEO目的”时,我的意思是我想坚持尾部斜杠URL结构,而不是尾部斜杠本身有助于我的SEO。我同意@ndm-但请看@mark谢谢你的建议和参考。在提问之前,我已经找到了该代码。我试着使用它,但它有点麻烦,因为它本打算在CakePHP2.x中使用。事实上,我发现的关于这个“问题”的所有代码和解决方法都是针对CakePHP 2.x的。再次感谢,非常感谢!这正是我所需要的。我不得不对
MyUrlHelper.php
进行一些更改,以使其正常工作:我添加了
use Cake\Routing\Router
并从
UrlHelper
扩展了
MyUrlHelper
,而不是从
HtmlHelper
扩展。再次感谢!这是一个很好的解决方案。很抱歉,这会破坏图像。。。但我把它放在\vendor\cakephp\cakephp\src\View\Helper\HtmlHelper.php->链接函数。。。它很好用