在 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(例如 FormHelper
或 HtmlHelper
构建 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;
我知道它是肮脏的解决方案而且编辑核心不好...我认为你最好覆盖构建函数...
希望有更好的方法
我正在使用 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(例如 FormHelper
或 HtmlHelper
构建 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;
我知道它是肮脏的解决方案而且编辑核心不好...我认为你最好覆盖构建函数...
希望有更好的方法