1

是否可以在 CakePHP 中应用全局路由?

例如:

Router::connect('/:controller/:action/:token', 
        array('controller'=>'App'),
        array(
            'pass' => array('token')
            )
    );

这个想法是,如果一个名为 token 的 NAMED 参数被传递到任何由 App Controller 处理的 URL(应该是一切),它将像这样处理它:

/users/login/123abc其中 123abc 是令牌。

以及我如何通过为我的 Notes 控制器分页来完成此操作的示例:

Router::connect('/notes',
        array('controller'=>'notes','action'=>'index', 'page' => 1),
        array(
            'pass' => array('page')
        )
    );

    Router::connect('/notes/page/:page', 
        array('controller' => 'notes', 'action' => 'index'),
        array(
            'pass' => array('page'),
            'page' => '[1-9]+'
            )
    );

这使得 URL 像:

/notes/page:1变得/notes/page/1

问题是我必须为每个动作和控制器执行此操作,并希望将其设为全局,以便适用于所有控制器和动作。因此,我将应用控制器作为路由参数进行了实验。

4

1 回答 1

1

为所有控制器定义路由

您可以在路由定义中使控制器成为变量:

Router::connect('/:controller/page/:page', 
    array('controller' => 'action' => 'index'),
    array(
        'pass' => array('page'),
        'page' => '[1-9]+'
    )
);

这样,每个动作只有一个路由。请注意,此路由不会匹配任何有不同顺序、限制或方向的分页 url - 一般来说,路由和分页是困难/脆弱的。

使用获取参数

编辑后的问题提到了分页参数 - 如果主要或唯一的用例是分页,你最好使用get arguments

public $paginate = array(
    'paramType' => 'querystring'
);

IE

current/url
current/url?page=2

由于 get 参数不会干扰路由,因此您可以在路由定义中忘记它们,并且当用户使用分页链接导航时,不会有 url 发生显着变化的风险。未来版本的 cake 可能会删除命名参数,并使 get 参数成为分页的默认值。

于 2013-08-23T14:42:54.757 回答