【问题标题】:How to remove controller name and action name from URL in Cakephp如何从 Cakephp 中的 URL 中删除控制器名称和动作名称
【发布时间】:2017-02-07 10:29:26
【问题描述】:

我在管理面板中添加类别、产品(以及类别 ID),我想在简单的 url 中显示产品列表类别:

localhost/project_folder/[:category_name]

插入

localhost/project_folder/HomeController/action/[:category_name]

我还想在简单的 url 中显示产品的详细信息:

localhost/project_folder/[:product_id]

插入

localhost/project_folder/HomeController/action/[:product_id]

我想只使用 HomeController 来显示所有细节。

通过How to remove action name from url in cakephp? 的解决方案,按类别列出的产品有效,但产品详细信息无效。

我得到category_name的产品列表如下:

Router::connect
    '/:param',
    array('controller' => 'Home', 'action' => 'category'), 
    array('pass' => array('param'))
);

但是如果我使用以下一个,产品的详细信息将不起作用:

Router::connect(
    '/:param1',
    array('controller' => 'Home', 'action' => 'details'),
    array('pass' => array('param1'))
);

【问题讨论】:

    标签: php cakephp url-routing


    【解决方案1】:

    如果您使用此配置,您的路由器会感到困惑(因为它们是相同的),您必须通过定义 param 的性质来区分它们

    Router::connect('/:param', array('controller' => 'Home', 'action' => 'category'), array(
        'pass' => array('param'),
        'param' => '[a-zA-Z_]{1}[a-zA-Z_0-9]*' // Accepts just words (category names slugged with _ caracter)
    ));
    Router::connect('/:param1', array('controller' => 'Home', 'action' => 'details'), array(
        'pass' => array('param1'),
        'param1' => '[1-9]{1}[0-9]*' //Accepts just integers (product ids)
    ));
    

    【讨论】:

    • 感谢您的回复。我正在按产品标题播种产品详细信息。类别仅包含字母。产品标题包含字母、- 和数字
    • 通过更改 Router::connect('/:param', array('controller' => 'Home', 'action' => 'category'), array('pass ' => array('param'), 'param' => '[A-Za-z]*' // 只接受单词(类别名称带有 _ 字符))); Router::connect('/:param1', array('controller' => 'Home', 'action' => 'details'), array('pass' => array('param1'), 'param1' = > '[A-Za-z0-9-]*' //接受单词和整数(产品标题)));感谢您的帮助。
    • 好吧,你明白了:)
    • Router::connect('/:param', array('controller' => 'Home', 'action' => 'category'), array('pass' => array(' param'), 'param' => '[a-zA-Z_]{1}[a-zA-Z_0-9]*' // 只接受单词(类别名称带有 _ 字符)));这导致无法访问其他控制器,例如 localhost/project_folder/LoginController
    • 是的,你是对的,事实上我没有看到除了添加子路由来避免这个问题的其他选择,比如Router::connect('/c/:param', 其中c 是子路由
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-15
    • 1970-01-01
    • 2012-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多