3.0 Cakephp路由html只

时间:2014-12-21 19:36:04

标签: cakephp cakephp-3.0

我想路由具有以下模式的网址;

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扩展名结尾的网页?

2 个答案:

答案 0 :(得分:1)

据我记得,这不可能开箱即用,你需要额外的逻辑来处理这种或那种。

我说你最好的选择是custom route class,它不仅可以限制匹配的传入网址(Route::parse()),还可以反向路由(Route::match())。< / p>

您可以根据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.html
['controller' => 'Pages', 'action' => 'view', '_ext' => 'html']

会有效,而

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

不会。

有关详细信息,请参阅

答案 1 :(得分:0)

不确定为什么它会像那样,但我设法通过将正则表达式条件设置为:page来限制您的.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评论)。我没有设法用路由系统做你正在寻找的东西。我建议直接在控制器中检查扩展名,如果不符合&#34; html&#34;则抛出404错误。