在 CakePHP 3 中从 Helpers 构建 URL 时添加尾部斜线

Add a trailing slash while building URLs from Helpers in CakePHP 3

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

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);
}

到目前为止,还不错。

现在,我想在每次使用 Helper(例如 FormHelperHtmlHelper 构建 URL 时使用尾部斜线构建它们。例如:

$this->Form->create(null, [
    'url' => ['controller' => 'Messages', 'action' => 'send']
]);

本例中的 URL 输出为:

/messages/send

我需要它是:

/messages/send/

目前我正在对 Helper 选项中的 URL 进行硬编码以使其正常工作(尚未投入生产)。如果我使用示例的选项,当提交表单时,它会将 /messages/send 重定向到 /messages/send/ 因为 .htaccess 重定向规则和 POST 数据丢失。

在此先感谢,我为我糟糕的英语道歉,我希望我说清楚了。

如果你想在动作的最后加一个/,你可以试试:

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

另见

我建议 create an alias 为您 Helper 并调整 URL 建筑。

src/View/AppView.php

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

src/View/Helper/MyUrlHelper.php

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 here 的原始来源。

我用三个字符解决了它:) ...

1- 打开 \vendor\cakephp\cakephp\src\View\Helper\UrlHelper.php 2- 转到构建函数并将 .'/' 添加到 return $url 中,如下所示

它应该看起来像 return $url.'/';

而不是 return $url;

我知道它是肮脏的解决方案而且编辑核心不好...我认为你最好覆盖构建函数...

希望有更好的方法