CakePHP 3路由与参数

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)

这甚至可以实现吗?

ndm*_*ndm 5

当然有可能,示例路由几乎已经准备就绪,您只需要定义应将哪些元素作为函数参数传递,并且您最有可能必须限制哪些: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中来自数据库的映射段

也可以看看