【问题标题】:Cakephp generating lowercase urls with uppercase controller namesCakephp 生成带有大写控制器名称的小写 URL
【发布时间】:2014-12-03 16:29:29
【问题描述】:

我正在使用 Cakephp 2 我一直在重构我的代码以使用 Html->url() 函数而不是硬编码网址。对于那些不熟悉的人,我传递了一个包含控制器和动作名称的混合 $url 变量。

我的直觉告诉我,我应该根据文件名定义控制器,并根据控制器内部的函数名定义动作。 IE: 要路由到 AdminsController::index() 我会说

$this->Html->url(array(
    'controller'=>'Admins'
    ,'action'=>'index'
));

应该为我生成 url

http://example.com/admins/index

不幸的是,它对我产生的影响是

http://example.com/Admins/index

*注意管理员中的大写“A”。

我内心最纯粹的人拒绝通过它的变形名称来识别控制器,因为那么使用 url 辅助函数有什么好处呢?我为什么不自己写出网址?

url 函数不应该影响控制器名称吗? 小写/驼峰式不是屈折过程的一部分吗? 有什么办法可以强制这种行为?

谢谢

【问题讨论】:

    标签: php url cakephp


    【解决方案1】:

    如果您在 routes.php 中定义以下路由,那么您将拥有漂亮的小写 url:

    Router::connect('/admins/index', array(
        'controller' => 'Admins', 
        'action' => 'index'
    ));
    

    编辑:其他建议,您还可以考虑定义一个自定义路由,该路由在解析路由 url 时会自动小写操作和控制器: http://book.cakephp.org/2.0/en/development/routing.html#custom-route-classes

    EDIT2:刚刚有了另一个想法。您可以将 Html 帮助程序包装到执行您想要的自定义帮助程序中。

    在视图/Helper/CustomHtmlHelper.php 中:

    <?php
    App::uses('HtmlHelper','View/Helper');
    
    class CustomHtmlHelper extends HtmlHelper {
    
    public function url($url = null, $full = false)
    {
        if(is_array($url)) {
            if(isset($url['controller']) {
                $url['controller'] = strtolower($url['controller']);
            }
            if(isset($url['action']) {
                $url['action'] = strtolower($url['action']);
            }
        }
        return parent::url($url, $full);
    }
    

    在 Controller/AppController.php 中:

    public $helpers = array('Html' => array('className' => 'CustomHtml'));
    

    我没有测试过,所以代码可能有错误。但这就是想法。

    【讨论】:

    • 我必须为我的所有控制器都这样做吗?
    • 我猜是的。但我编辑了我的答案以分享其他可能的解决方案。
    • CustomHelper 似乎是最好的解决方案。谢谢!
    【解决方案2】:

    如果您想使用 HtmlHelper,您需要始终格式化您的操作/控制器和插件:

    $this->Html->url(array(
        'controller'=>'admins'
        ,'action'=>'index'
    ));
    

    或:

    $this->Html->url(array(
        'controller'=>'controllers'
        ,'action'=>'some_other_action'
    ));
    

    Cake 会处理好一切。只需通过小写的下划线版本。包括您的操作是否为(上例中为 someOtherController())

    在您的 URL 中也是如此 - 您访问的是 /admins/,而不是 /Admins/ - 帮助程序的工作方式相同。

    【讨论】:

    • 我是说我希望能够用大写字母编写控制器名称。 'controller'=>'Admins' 并让它仍然呈现一个小写的 url
    • 然后您需要创建一个自定义路由来在生成 url 之前对其进行操作。这是食谱如何做到这一点。或者,您可以创建一个帮助器来接受大写的控制器名称作为默认 HTML 帮助器的包装器,并将该小写版本推迟到 HTML 帮助器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    • 1970-01-01
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    • 2013-08-15
    • 1970-01-01
    相关资源
    最近更新 更多