2014-12-21 1 views
0

Я хотел бы направить URL-адреса, имеющие следующий шаблон;3.0 Cakephp route html only

http://mywebsite.com/en/url.html 

Приведенный ниже код работает.

Router::prefix ('en', function ($routes) { 
    $routes->extensions ([ 
      'html' 
    ]); 
    $routes->connect ('/:page', [ 
      'controller' => 'Pages', 
      'action' => 'view', 
    ] 
    , [ 
      'pass' => [ 
        'page' 
      ] 
    ]); 
    $routes->fallbacks ('InflectedRoute'); 
}); 

Проблема возникает для контроллеров, у которых нет расширения html. например

http://mywebsite.com/en/controller/ 

Есть ли способ ограничить

$routes->connect ('/:page', [ 
     'controller' => 'Pages', 
     'action' => 'view', 
] 

к страницам, которые заканчиваются расширением .html?

ответ

1

Насколько я помню, это невозможно из коробки, вам понадобится дополнительная логика, которая так или иначе будет обрабатывать это.

Я бы сказал, что ваш лучший выбор будет custom route class, что может не только ограничить соответствие входящих URL-адресов (Route::parse()), но и обратную маршрутизацию (Route::match()).

Вы можете просто проверить расширение URL (массив) с расширениями, определенное с помощью RouteBuilder::extensions() так, что один из распознавайма расширений требуются, вот очень простой пример:

SRC/Routing/Route/MyCustomRoute .php

namespace App\Routing\Route; 

use Cake\Routing\Route\Route; 

class MyCustomRoute extends Route { 

    public function parse($url) { 
     list(, $ext) = $this->_parseExtension($url); 
     if(!in_array($ext, $this->extensions())) { 
      return false; 
     } 
     return parent::parse($url); 
    } 

    public function match(array $url, array $context = []) { 
     if(!isset($url['_ext']) || !in_array($url['_ext'], $this->extensions())) { 
      return false; 
     } 
     return parent::match($url, $context); 
    } 

} 

конфигурации/routes.php

// ... 

$routes->connect('/:page', [ 
    'controller' => 'Pages', 
    'action' => 'view', 
], [ 
    'routeClass' => '\App\Routing\Route\MyCustomRoute', 
    'pass' => ['page'] 
]); 

// ... 

Это приведет только URL-адреса с расширениями, чтобы быть распознаваем, и только URL массивы с расширением предоставляемых быть согласованы, т.е.

/en/page.html 
['controller' => 'Pages', 'action' => 'view', '_ext' => 'html'] 

будет работать, в то время как

/en/page 
/en/page.xml 
['controller' => 'Pages', 'action' => 'view'] 
['controller' => 'Pages', 'action' => 'view', '_ext' => 'xml'] 

не будет.

Для получения дополнительной информации см

+0

Спасибо. Это решает проблему. – MontrealDevOne

0

не уверен, почему он ведет себя так, но мне удалось ограничить маршрут до файла .html, установив условие регулярного выражения на: page.

Router::prefix ('en', function ($routes) { $routes->extensions ([ 'html' ]); $routes->connect ('/:page', [ 'controller' => 'Pages', 'action' => 'view', ] , [ 'page' => '[0-9a-z]+', 'pass' => [ 'page' ] ]); $routes->fallbacks ('InflectedRoute'); });

EDIT: выше решение фактически не работает (см РПС комментарий). Мне не удалось выполнить то, что вы ищете, с помощью системы маршрутизации. Я предлагаю проверить расширение непосредственно в контроллере и выбросить ошибку 404, если он не соответствует «html».

+0

Это не будет делать то, что ищет OP, не поставляйте расширение, и вы увидите, что маршрут будет работать нормально. Это будет причиной того, что маршрут не будет соответствовать, если не указано расширение '.html', поскольку в этом случае расширение будет частью элемента': page', который не будет проходить проверку правильности регулярного выражения, поскольку это не допускает точек. – ndm