如果给定的操作不存在,则定义Cakephp Route以调用特定控制器

Ama*_*wat 8 php routes cakephp

使用CakePHP v3.3.16

我想写一个后备路由,如果URL没有连接到任何操作,那么它应该转到该回退.

像这样创建SEO友好URL的路由

   $routes->connect(
        ':slug',
        ['prefix'=>'website','controller' => 'Brands', 'action' => 'index'],
        ['routeClass' => 'DashedRoute']
    );
    $routes->connect(
        ':slug/*',
        ['prefix'=>'website','controller' => 'Products', 'action' => 'index'],
        ['routeClass' => 'DashedRoute']
    );
Run Code Online (Sandbox Code Playgroud)

但它也包含了所有的控制器动作,所以如果我试图调用控制器ex:cart/index它将转到网站/品牌/索引/索引

如果我必须删除它,我必须创建一个像这样的路线/

$routes->connect('/cart',['controller' => 'Cart'], ['routeClass' => 'DashedRoute']);
Run Code Online (Sandbox Code Playgroud)

等等到另一个控制器访问.

示例:我有一个控制器CartController动作addCart

情况1

如果我访问URL my_project/cart/addCart/它应该去购物车控制器动作

案例2

如果我访问URL my_project/abc/xyz/并且没有名为abc的控制器,那么它应该转到BrandsController动作索引

我的当前routes.php看起来像这样

Router::defaultRouteClass(DashedRoute::class);

Router::scope('/', function (RouteBuilder $routes) {

    $routes->connect('/', ['prefix'=>'website','controller' => 'Home', 'action' => 'index']);
    $routes->connect('/trending-brands', ['prefix'=>'website','controller' => 'Brands', 'action' => 'trending']);
    $routes->connect('/users/:action/*',['prefix'=>'website','controller' => 'Users'], ['routeClass' => 'DashedRoute']);

    $routes->connect('/cart',['prefix'=>'website','controller' => 'Cart'], ['routeClass' => 'DashedRoute']);
    $routes->connect('/cart/:action/*',['prefix'=>'website','controller' => 'Cart'], ['routeClass' => 'DashedRoute']);

    $routes->connect(
        ':slug',
        ['prefix'=>'website','controller' => 'Brands', 'action' => 'index'],
        ['routeClass' => 'DashedRoute']
    );
    $routes->connect(
        ':slug/*',
        ['prefix'=>'website','controller' => 'Products', 'action' => 'index'],
        ['routeClass' => 'DashedRoute']
    );
    $routes->connect(':controller', ['prefix'=>'website'], ['routeClass' => 'DashedRoute']);
    $routes->connect(':controller/:action/*', ['prefix'=>'website'], ['routeClass' => 'DashedRoute']);


    $routes->fallbacks(DashedRoute::class);
});

Router::prefix('website', function (RouteBuilder $routes) {
    $routes->fallbacks(DashedRoute::class);
});


Plugin::routes();
Run Code Online (Sandbox Code Playgroud)

Cho*_*pic 1

如果我必须删除排除它,我必须创建一个像这样的路由/等等到另一个控制器来访问

无需指定模式中的每个控制器/名称,而是可以先创建所有指定的路由,然后将以下路由放在它们下面以捕获所有不匹配的路由。

$routes->connect(':/prefix/:controller/:action/*', [], ['routeClass' => 'DashedRoute']);
Run Code Online (Sandbox Code Playgroud)

也许还有一个没有前缀的

$routes->connect('/:controller/:action/*', [], ['routeClass' => 'DashedRoute']);
Run Code Online (Sandbox Code Playgroud)

既然您提到您正在使用3.3.*蛋糕版本,您的路线可以利用路线范围来编写

Router::prefix('website', function ($routes) {
 // All routes here will be prefixed with `/prefix`
 // And have the prefix => website route element added.
 $routes->fallbacks(DashedRoute::class);
   $routes->connect(
    '/:slug',
    ['controller' => 'Brands', 'action' => 'index']
);
$routes->connect(
    ':slug/*',
    ['controller' => 'Products', 'action' => 'index']
 }); 
Run Code Online (Sandbox Code Playgroud)