2017-11-09 18 views
0

私はSEOに優しいルーティングを作成しようとしています。私はホテルやホテルの部屋のあるウェブサイトを持っています。私は、異なるコントローラ/アクションにルーティングするルートプログレッションを作成したい。パラメータ付きルーティングCakePHP 3

$routes->connect('/:language/:hotelname/:room/', ['controller' => 'rooms', 'action' => 'viewRoom']); 

URLは言語パラメータ+ 2つのパラメータがある場合:

は、私がここでwww.hotelwebsite.com/language/hotel-name/room-name

は私が必要とする3つのルートがあるように私のURLが見てみたいです

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/*'); 

もリモートでも可能です。このでしょうか?

答えて

1

確かに、例のルートはほとんど準備が整っていますが、関数の引数として渡される要素を定義するだけでよく、おそらく:hotelnameおよび/または:roomが一致する必要があります常に勝つ

と最初のルート

/:language/:controller/:action 

/:language/:hotelname/:room 

と:を区別することはできません。あなたは要素を制限することができない場合

$routes->connect(
    '/:language/:hotelname/:room', 
    [ 
     'controller' => 'rooms', 
     'action' => 'viewRoom' 
    ], 
    [ 
     'pass' => ['hotelname', 'room'], 
     'hotelname' => '(?:name1|name2|name3)', 
     'room' => '[0-9]+' 
    ] 
); 

$routes->connect(
    '/:language/:hotelname/:room', 
    [ 
     'controller' => 'rooms', 
     'action' => 'viewRoom' 
    ], 
    [ 
     'pass' => ['hotelname', 'room'] 
    ] 
); 

$routes->connect(
    '/:language/:hotelname', 
    [ 
     'controller' => 'rooms', 
     'action' => 'viewHotel' 
    ], 
    [ 
     'pass' => ['hotelname'] 
    ] 
); 

がelmentの試合のような正規表現を介して行うことができますどのような制限:引数として渡す

は次のように、passオプションで設定することができますそのようにダイナミックであるか、あまりにも多く存在するため、データベースとのマッチングなどのカスタムルートクラスを試してみる必要があります。例:Mapping slugs from database in routing

を参照してください。
関連する問題