Cel*_*ydy 0 cakephp url-routing cakephp-3.0 cakephp-3.x cakephp-3.3
我正在尝试创建SEO友好的路由。我有一个包含酒店和旅馆客房的网站。我想创建一个路由进度,以路由到不同的控制器/动作。
我希望我的网址看起来像 www.hotelwebsite.com/language/hotel-name/room-name
这是我需要的三条路线:
如果网址具有语言参数+ 2个参数:
$routes->connect('/:language/:hotelname/:room/', ['controller' => 'rooms', 'action' => 'viewRoom']);
Run Code Online (Sandbox Code Playgroud)
哪里
public function viewRoom($hotel_slug, $room_slug)
Run Code Online (Sandbox Code Playgroud)
在其中
:hotelname == $hotel_slug and :room == $room_slug
Run Code Online (Sandbox Code Playgroud)
如果网址具有语言参数+ 1参数:
$routes->connect('/:language/:hotelname/', ['controller' => 'hotels', 'action' => 'viewHotel']);
Run Code Online (Sandbox Code Playgroud)
哪里
public function viewHotel($hotel_slug)
Run Code Online (Sandbox Code Playgroud)
在其中
:hotelname == $hotel_slug
Run Code Online (Sandbox Code Playgroud)
否则使用我的标准路线
$routes->connect('/:language/:controller/:action/*');
Run Code Online (Sandbox Code Playgroud)
这甚至可以实现吗?
当然有可能,示例路由几乎已经准备就绪,您只需要定义应将哪些元素作为函数参数传递,并且您最有可能必须限制哪些:hotelname和/或:room匹配项,否则路由器将无法区分之间:
/:language/:hotelname/:room
Run Code Online (Sandbox Code Playgroud)
和:
/:language/:controller/:action
Run Code Online (Sandbox Code Playgroud)
而第一条路线将永远获胜。
可以通过该pass选项配置作为参数传递,例如:
$routes->connect(
'/:language/:hotelname/:room',
[
'controller' => 'rooms',
'action' => 'viewRoom'
],
[
'pass' => ['hotelname', 'room']
]
);
$routes->connect(
'/:language/:hotelname',
[
'controller' => 'rooms',
'action' => 'viewHotel'
],
[
'pass' => ['hotelname']
]
);
Run Code Online (Sandbox Code Playgroud)
可以通过正则表达式来限制元素匹配的内容,例如:
$routes->connect(
'/:language/:hotelname/:room',
[
'controller' => 'rooms',
'action' => 'viewRoom'
],
[
'pass' => ['hotelname', 'room'],
'hotelname' => '(?:name1|name2|name3)',
'room' => '[0-9]+'
]
);
Run Code Online (Sandbox Code Playgroud)
如果由于元素是动态的和/或元素太多而不能通过这种方式来限制元素,那么您将不得不尝试一个自定义的路由类(例如,与数据库匹配),例如检查routing中来自数据库的映射段。
也可以看看
| 归档时间: |
|
| 查看次数: |
1565 次 |
| 最近记录: |