CakePHP 4:如何让HTML Helper生成不带路由前缀的外部链接?
解决CakePHP路由前缀视图中链接自动带前缀的问题
在CakePHP中,当处于前缀路由的视图上下文时,HTML Helper会默认继承当前路由的prefix参数,导致生成跨前缀的链接时自动带上当前前缀。要解决这个问题,有两种直接的方法:
方法一:显式清除前缀参数
在生成链接的路由数组中,添加'prefix' => false来覆盖当前上下文的前缀设置,示例代码如下:
$this->Html->link( $recipe->user->name, [ 'prefix' => false, 'controller' => 'Users', 'action' => 'view', $recipe->user->id ] );
这样路由生成器就会忽略当前的cooking前缀,直接生成根路由下的/users/1链接。
方法二:使用命名路由(适合频繁调用的链接)
如果需要多次生成到某控制器的跨前缀链接,可以先在路由文件的前缀代码块外部定义命名路由:
// 在$routes->prefix('cooking', ...)代码块之外添加 $routes->connect('/users/view/:id', ['controller' => 'Users', 'action' => 'view'], ['name' => 'users-view', 'pass' => ['id']] );
之后在视图中直接通过路由名称生成链接,无需每次指定前缀:
$this->Html->link( $recipe->user->name, ['route' => 'users-view', 'id' => $recipe->user->id] );
问题原因说明
当请求处于cooking前缀路由下时,当前请求的路由上下文会携带prefix参数,HTML Helper生成URL时默认会复用这些上下文参数,因此自动为链接加上了cooking前缀。通过显式设置prefix => false或使用独立的命名路由,就能避免这种自动继承行为。
内容的提问来源于stack exchange,提问作者Russell Toris
相关产品推荐
相关产品推荐

