2014-12-21 4 views
0

다음과 같은 패턴의 URL을 보내고 싶습니다.3.0 Cakephp 루트 html 전용

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/ 

는 .html 중에서 확장자로 끝 페이지에

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

을 제한 할 수있는 방법이 있습니까?

답변

1

내가 알기로는 이것이 가능하지 않다는 것을 기억하면 추가적인 처리가 필요합니다.

가장 좋은 방법은 들어오는 URL (Route::parse())의 일치를 제한 할 수있을뿐만 아니라 역방향 라우팅 (Route::match())도 할 수있는 가장 좋은 방법은 custom route class입니다.

당신은 단순히 RouteBuilder::extensions()를 통해 정의 된 확장에 대한 URL (배열)의 확장 때문에 구문 분석 확장 중 하나가 필요하다는 것을, 여기에 아주 기본적인 예제를 테스트 할 수

:

SRC/라우팅/경로/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 
/en/page.xml 
['controller' => 'Pages', 'action' => 'view'] 
['controller' => 'Pages', 'action' => 'view', '_ext' => 'xml'] 

있는 동안 않을 것, 즉

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

일하는 것이, 일치시킬 수 있습니다.자세한 내용

참조

+0

감사합니다. 이렇게하면 문제가 해결됩니다. – MontrealDevOne

0

그 이유는 확실하지 않지만 정규식 조건을 다음과 같이 설정하여 .html 파일 경로를 제한 할 수있었습니다.

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

편집 : 위의 솔루션은 실제로 작동 (NDM 주석을 참조)하지 않습니다. 나는 당신이 라우팅 시스템으로 찾고있는 것을 처리하지 못했습니다. 내가 제안하는 것은 "html"과 일치하지 않으면 컨트롤러에서 직접 확장을 검사하고 404 오류를 던집니다.

+0

이것은 OP가 찾고있는 것을하지 않을 것이며, 확장을 제공하지 않아도 경로가 잘 작동하는 것을 볼 수 있습니다. 이것은'.html' 확장이 제공되지 않는 경우 경로가 일치하지 않게합니다.이 경우 확장은': page' 요소의 일부가 될 것이기 때문에 정규 표현식을 통과시키지 않습니다 도트를 허용하지 않습니다. – ndm