如何为现有的 CakePHP (2) 项目添加新的 url 路由

Posted

技术标签:

【中文标题】如何为现有的 CakePHP (2) 项目添加新的 url 路由【英文标题】:How to add a new url route to an existing CakePHP (2) project 【发布时间】:2022-01-06 14:15:00 【问题描述】:

我的一个客户有一个遗留的 Cakephp2 网站,需要用新页面更新以生成 PDF,我真的很难在 Controller 中调用新方法。

我在 PHP 方面有很多经验,但在过去五年中我并没有大量使用它,而且我从未接触过 CakePHP。该网站由其他人维护,但自从那个人离开后,他们让我看一看。我知道该站点正在运行一个非常旧版本的 Cake,我已经告诉过他们,但他们现在不希望它更新,因为它无论如何都会被替换。

我已经浏览了 CakePHP Docs for v2,但我的客户 routes.php 文件似乎与文档中建议的通配符路径不匹配。

routes.php 中路由到多个现有方法的条目是:

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

然后我编辑了 Controller/SurveysController.php 文件以添加一个新方法,以便我可以执行一个简单的测试。

    public function pdf($id, $type = 1) 
        file_put_contents("/tmp/debug.log", "inside the new method");
        // Call an existing method just to load a page
        $this->report($id);

我已将现有的Views/Survey/report.ctp 文件复制到Views/Survey/pdf.ctp,所以理论上,方法应该采取相同的操作,视图/模板也将相同。

我遇到的问题是,如果我尝试转到 surveys/pdf/123 的新方法 URL,我可以浏览到 surveys/report/123 的现有 URL,我只是将 HTTP302 重定向到网站索引。我尝试在视图中创建的文件没有被创建,但是因为我没有看到 404 页面,例如我去 /surveys/invalid-url/123 我真的不明白发生了什么。

更糟糕的是,由于它使用的所有旧依赖项与我当前的开发机器不兼容,我无法在本地运行该站点。

根据我对 CakePHP 的理解,创建新方法和新 .ctp 文件应该是我需要做的所有事情,以使页面能够正常工作,但显然我错过了一些东西。

希望其他 S/O 用户可以指出我哪里出错了。

更新 正在添加默认路由,因为它们仍然存在:

require CAKE . 'Config' . DS . 'routes.php';

他们正在使用 [ACL from the docs][1] 并安装了 AclExtras,但是当我运行 ./Console/cake AclExtras.AclExtras aco_update 时,他们收到错误消息。

Error: Class QuestionsControllerDec2017 does not exist

我可以看到很多文件和文件夹的名称中有日期,我认为它们是较旧的备份。现在这是否会导致反射拾取它们的问题?

我编辑了 Controller/UsersControllers.php 来为新方法添加一个条目

    $this->Acl->allow($group, 'controllers/Surveys/report');
    $this->Acl->allow($group, 'controllers/Surveys/download_report');
    // New Line below
    $this->Acl->allow($group, 'controllers/Surveys/pdf');

那么是不是 aros_acos 表没有过期,需要一个条目才能添加,但由于之前的错误,我无法动态添加。

** 更新 2 ** 问题是我错过了权限创建,因此必须使用创建遗留代码访问权限

./Console/cake acl create aco Surveys pdf

【问题讨论】:

采用了什么样的身份验证和授权? 造成这种情况的原因有很多,甚至可能不是 PHP 做的,而是服务器级别的重定向,从这里无法判断,您必须进一步调试。话虽如此,您所显示的路线不会连接到除SurveysController 类中的index() 方法之外的任何东西,如果您想连接到pdf() 方法,那么您需要一条额外的路线。 @ndm - 我也是这么想的,但是即使 rotues.php 文件中没有通配符,它​​们也会调用其他方法,例如调用 report 方法的surveys/report/123。从回溯中,我记录了直接调用它的方法,而不是通过 index 方法。我检查了 .htaccess 并且这不会导致重定向。它确实调用了 CakePlugin::routes() 和 ``` 需要 CAKE 。 '配置' 。 DS 。 'routes.php';``` 在我列出的路由条目之后,但仅此而已,所以我不确定如何设置路由。 如果包含核心的路由文件,那么这里将引入包罗万象的路由:github.com/cakephp/cakephp/blob/2.10.24/lib/Cake/Config/… @ndm 所以规则 Router::connect('/:controller/:action/*', array(), array('defaultRoute' => true));应该被击中,这可以解释缺少 404。也许是许可方面。他们使用像book.cakephp.org/2/en/tutorials-and-examples/… 这样的基本ACL,我添加了 $this->Acl->allow($group, 'controllers/Sur​​veys/pdf');在 $this->Acl->allow($group, 'controllers/Sur​​veys/report'); 的两条现有行下方和 $this->Acl->allow($group, 'controllers/Sur​​veys/download_report');但是如何在数据库中刷新它? 【参考方案1】:

问题在于,虽然我更新了 UserController.php 文件,但我没有应用 ACL 更改 as per the docs。

我无法使用 AclExtras,因为旧的备份控制器破坏了它导致的错误,否则这将是所需的命令:

./Console/cake AclExtras.AclExtras aco_update

所以我改用手动方式:

./Console/cake acl create aco Surveys pdf

其中 Surveys 是控制器名称,pdf 是方法名称

【讨论】:

以上是关于如何为现有的 CakePHP (2) 项目添加新的 url 路由的主要内容,如果未能解决你的问题,请参考以下文章

如何为现有的非 android Eclipse 项目制作 android manifest?

如何为 iPhone Light 版本应用程序创建 xcode 项目?

从 Cake 1.3 迁移到 2.0 及更高版本 - 迁移现有的,还是仅用于新的?

如何在intelliJ IDEA中为我现有的Kotlin项目生成build.gradle文件

如何为现有的 WCF 服务原生启用 JSONP?

如何为现有的 graphql-schema 创建动态文档?