如何在CakePHP3.7中实现自定义路由以生成SEO友好URL(适配2.x升级)
在CakePHP 3.7中实现自定义SEO友好路由
嘿,我来帮你搞定CakePHP 3.7里的自定义SEO路由问题,和你之前2.x版本的功能对齐!下面是具体的实现步骤:
第一步:创建自定义路由类
CakePHP 3.x的目录结构和命名空间有变化,你需要在src/Routing/Route目录下创建路由类(目录不存在的话直接新建)。比如创建CategoryRoute.php:
<?php namespace App\Routing\Route; use Cake\Routing\Route\Route; class CategoryRoute extends Route { public function parse($url) { // 调用父类方法获取基础路由参数 $params = parent::parse($url); // 解析失败则返回false if (empty($params)) { return false; } // 这里可以添加自定义逻辑,比如拆分多级分类路径、参数转换等 // 比如URL是/category/subcategory/subsubcategory,$params['pass']会包含所有分段 return $params; } }
第二步:配置路由规则
在config/routes.php里,不需要再用App::import引入类了,直接通过命名空间加载。推荐用CakePHP 3.x的RouteBuilder闭包方式配置:
<?php use Cake\Routing\RouteBuilder; use Cake\Routing\Router; use App\Routing\Route\CategoryRoute; // 设置默认路由类 Router::defaultRouteClass('DashedRoute'); Router::scope('/', function (RouteBuilder $routes) { // 配置多级分类的SEO路由,匹配任意层级的分类路径 $routes->connect( '/:category/*', ['controller' => 'Products', 'action' => 'liste'], [ 'routeClass' => CategoryRoute::class, 'pass' => ['category'], // URL中的*分段会自动加入pass数组 'category' => '[a-z0-9-]+' // 分类名的正则约束 ] ); // 你原来的/paf/:page路由可以改成这样 $routes->connect( '/paf/:page', ['controller' => 'Products', 'action' => 'liste'], [ 'routeClass' => CategoryRoute::class, 'pass' => ['page'], 'page' => '[0-9]+' ] ); });
第三步:在控制器中接收参数
在ProductsController的liste方法里,你可以通过$this->request->getParam('pass')获取路由传递的分段参数。比如URLdomain.com/electronics/phones/smartphones,这个方法会返回数组['electronics', 'phones', 'smartphones'],你可以用它来处理分类逻辑:
<?php namespace App\Controller; use Cake\Controller\Controller; class ProductsController extends Controller { public function liste() { $categorySegments = $this->request->getParam('pass'); // 根据分类分段查询数据、构建页面内容等 // ... } }
额外小技巧
如果需要生成这种多级分类的URL,可以用UrlHelper的build方法:
// 生成domain.com/electronics/phones/smartphones echo $this->Url->build([ 'controller' => 'Products', 'action' => 'liste', 'electronics', 'phones', 'smartphones' ]);
内容的提问来源于stack exchange,提问作者Fida
相关产品推荐
相关产品推荐

