如何为现有的 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/Surveys/pdf');在 $this->Acl->allow($group, 'controllers/Surveys/report'); 的两条现有行下方和 $this->Acl->allow($group, 'controllers/Surveys/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 及更高版本 - 迁移现有的,还是仅用于新的?