带参数的 CakePHP 3 路由
CakePHP 3 routing with parameters
我正在尝试创建 SEO 友好的路由。我有一个关于酒店和酒店房间的网站。我想创建一个路由到不同 controllers/actions.
的路由进程
我希望我的 url 看起来像 www.hotelwebsite.com/language/hotel-name/room-name
这是我需要的三个路线:
如果url有一个语言参数+2个参数:
$routes->connect('/:language/:hotelname/:room/', ['controller' => 'rooms', 'action' => 'viewRoom']);
其中
public function viewRoom($hotel_slug, $room_slug)
其中
:hotelname == $hotel_slug and :room == $room_slug
如果url有一个语言参数+1个参数:
$routes->connect('/:language/:hotelname/', ['controller' => 'hotels', 'action' => 'viewHotel']);
其中
public function viewHotel($hotel_slug)
其中
:hotelname == $hotel_slug
否则使用我的标准路线
$routes->connect('/:language/:controller/:action/*');
这有可能吗?
当然可以,示例路由几乎可以使用了,您只需要定义哪些元素应该作为函数参数传递,而且您很可能必须限制什么 :hotelname
and/or :room
匹配,否则路由器将无法区分:
/:language/:hotelname/:room
和:
/:language/:controller/:action
第一条路线总是赢。
可以通过 pass
选项配置作为参数传递,例如:
$routes->connect(
'/:language/:hotelname/:room',
[
'controller' => 'rooms',
'action' => 'viewRoom'
],
[
'pass' => ['hotelname', 'room']
]
);
$routes->connect(
'/:language/:hotelname',
[
'controller' => 'rooms',
'action' => 'viewHotel'
],
[
'pass' => ['hotelname']
]
);
可以通过正则表达式来限制元素匹配的内容,例如:
$routes->connect(
'/:language/:hotelname/:room',
[
'controller' => 'rooms',
'action' => 'viewRoom'
],
[
'pass' => ['hotelname', 'room'],
'hotelname' => '(?:name1|name2|name3)',
'room' => '[0-9]+'
]
);
如果您不能那样限制元素,因为它们是动态的 and/or 元素太多,那么您将不得不尝试自定义路由 class,例如与数据库匹配的路由,例如检查 .
另见
我正在尝试创建 SEO 友好的路由。我有一个关于酒店和酒店房间的网站。我想创建一个路由到不同 controllers/actions.
的路由进程我希望我的 url 看起来像 www.hotelwebsite.com/language/hotel-name/room-name
这是我需要的三个路线:
如果url有一个语言参数+2个参数:
$routes->connect('/:language/:hotelname/:room/', ['controller' => 'rooms', 'action' => 'viewRoom']);
其中
public function viewRoom($hotel_slug, $room_slug)
其中
:hotelname == $hotel_slug and :room == $room_slug
如果url有一个语言参数+1个参数:
$routes->connect('/:language/:hotelname/', ['controller' => 'hotels', 'action' => 'viewHotel']);
其中
public function viewHotel($hotel_slug)
其中
:hotelname == $hotel_slug
否则使用我的标准路线
$routes->connect('/:language/:controller/:action/*');
这有可能吗?
当然可以,示例路由几乎可以使用了,您只需要定义哪些元素应该作为函数参数传递,而且您很可能必须限制什么 :hotelname
and/or :room
匹配,否则路由器将无法区分:
/:language/:hotelname/:room
和:
/:language/:controller/:action
第一条路线总是赢。
可以通过 pass
选项配置作为参数传递,例如:
$routes->connect(
'/:language/:hotelname/:room',
[
'controller' => 'rooms',
'action' => 'viewRoom'
],
[
'pass' => ['hotelname', 'room']
]
);
$routes->connect(
'/:language/:hotelname',
[
'controller' => 'rooms',
'action' => 'viewHotel'
],
[
'pass' => ['hotelname']
]
);
可以通过正则表达式来限制元素匹配的内容,例如:
$routes->connect(
'/:language/:hotelname/:room',
[
'controller' => 'rooms',
'action' => 'viewRoom'
],
[
'pass' => ['hotelname', 'room'],
'hotelname' => '(?:name1|name2|name3)',
'room' => '[0-9]+'
]
);
如果您不能那样限制元素,因为它们是动态的 and/or 元素太多,那么您将不得不尝试自定义路由 class,例如与数据库匹配的路由,例如检查
另见