0

我正在尝试创建 SEO 友好的路由。我有一个包含酒店和酒店房间的网站。我想创建一个路由进程,路由到不同的控制器/动作。

我希望我的网址看起来像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/*');

这甚至有可能吗?

4

1 回答 1

5

当然这是可能的,示例路由几乎准备就绪,您只需要定义哪些元素应该作为函数参数传递,并且您很可能必须限制什么:hotelname和/或: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]+'
    ]
);

如果您不能以这种方式限制元素,因为它们是动态的和/或元素太多,那么您将不得不尝试一个自定义路由类,例如与数据库匹配,检查例如Mapping slugs from database in routing

也可以看看

于 2017-11-10T12:24:51.147 回答