带参数的 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,例如与数据库匹配的路由,例如检查 .

另见