mensch 给出的答案并不是我所需要的——我从未接触过 index.php 文件——所以我将详细说明我在这里尝试的内容。
我使用这个网站作为指南,但也有我自己的评论!
http://www.paulmarshall.us/blog/migrating-from-cakephp-13-to-cakephp-20
(我还发现了这个:https ://github.com/dereuromark/upgrade ,如果上面的教程失败了,我可能会尝试一下。不过我不太喜欢它,我喜欢超级详尽的文档,而不是
Put `CakePlugin::loadAll();` in your app bootstrap to make sure this plugin is loaded
这对我来说毫无意义......你能指定文件的文件夹吗?文件中的任何特定位置要添加该行?等等......我会努力对我所做的事情保持特别的态度!)
首先,我注意到我的蛋糕使用的 index.php 不是 cake2.1 代码附带的 index.php。不确定为什么会这样,但我复制了“新”2.1 index.php(是的,这是 app/webroot/index.php 文件),现在我有一个新错误:
注意:未定义索引:第 94 行 /cake_install/lib/Cake/Core/Configure.php 中的错误 注意:未定义索引:第 95 行 /cake_install/lib/Cake/Core/Configure.php 中的异常 致命错误:类名必须是第 126 行 /cake_install/lib/Cake/Error/ErrorHandler.php 中的有效对象或字符串
(其中 cake_install 是我的蛋糕应用程序所在的文件夹)
现在正在处理这个...
现在我看到升级工具没有升级 core.php 文件 - 在 app/Config 中找到(对于 2.1,app/config 对于 1.3)......升级工具到底做了什么?我已经剪切并粘贴了 2.1 版本(也就是说,从 2.1 代码的 zip 文件中,我将 /app/Config/core.php 移到了我的 /app/Config 目录中),并确保交换了盐值和安全值。而已。
仍然没有运气。所以现在我已经升级了 database.php 文件(也在 app/Config 或 app/config 中)~我改变了
'driver' => 'mysqli',
至
'datasource' => 'Database/Mysqli',
随机配置文件很有趣!
啊,好的,所以升级到核心和数据库改变了错误信息......这很好吗?仍然不确定他们大肆吹嘘的“升级”脚本做了什么......它只是改变了文件名?真的吗?
警告(2):file_put_contents(/cake_install/app/tmp/logs/error.log):无法打开流:权限被拒绝 [CORE/Cake/Log/Engine/FileLog.php,第 69 行]
注意 (1024):请将 app/Config/core.php 中“Security.cipherSeed”的值更改为特定于您的应用程序的数字(仅限数字)种子值 [CORE/Cake/Utility/Debugger.php,第 810 行]
致命错误:在第 31 行的 /cake_install/lib/Cake/View/Helper/HtmlHelper.php 中找不到类“AppHelper”
好的,所以我 777 /cake_install/app/tmp/logs/ 文件夹(chmod 777 -R folderHere)和
...我猜我从未升级过密码种子。好的,编了一个新号码!(你问密码种子有什么作用?嗯,嗯,bing 没有多大帮助 - 我读了代码。似乎用于从 cookie 中加密/解密?好吧,我可以忍受)
引导程序.php
我将 zip 文件中的引导程序移到了我的版本中(感谢一点,升级脚本!)。还没有做任何改变,我想我需要加载插件......我相信这是有据可查的(哈!)
所以这给我留下了这个错误:
致命错误:在第 31 行的 /cake_install/lib/Cake/View/Helper/HtmlHelper.php 中找不到类“AppHelper”
当然,大肆吹嘘的蛋糕升级器未能进行另一次升级。查看此页面:
http ://book.cakephp.org/2.0/en/appendices/2-1-migration-guide.html
好的,所以现在我必须制作文件 - 就像它们在那个页面中一样。唯一的技巧是,是的,它在 app 文件夹中,不,我的 cakePhp 制作的 app/View 文件夹没有“Helper”子文件夹......所以对于 AppHelper.php,我必须制作一个 Helper /app/View/ 下的子文件夹。
...
嘿!现在我得到一个背景和一个标志......还有这些:
注意(8):未定义变量:loggedIn [APP/pages/top_menu.html,第 3 行]
注意(8):未定义变量:html [APP/pages/top_menu.html,第 25 行]
致命错误:在第 25 行的 /cake_install/app/pages/top_menu.html 中的非对象上调用成员函数 link()
伟大的。某种很酷的新蛋糕 2 功能意味着我不能使用 $html?这似乎......奇怪的合适,真的。
难以置信的。现在我需要改变 $this->data 的工作方式???为什么??为什么??为什么这群人不能弄清楚 api 往往是固定的合同,而不是浮动的想法……啊。没关系,我现在最常用的蛋糕生产线是……错了。从现在开始,我正在使用 scala 或 django 进行开发,初级语言很烂。
这是我跑的: find . -type f -exec sed -i 's/$this->data/$this->request->data/g' {} \;
我去了 /app 目录这样做。这个 2.1 ......最好是真的很棒......每个人都必须做的工作量才能让它起来。我想,这是与初级语言一起工作的正常一天吗?
啊太棒了,$html 问题是因为有人不喜欢小写字母造成的?只能想知道:
在 CakePHP 2.0 中使用 Html Helper 时未定义的 var
解决方案是:(感谢 SO 中的另一篇文章)
寻找 。-type f -exec sed -i 's/$html/$this->Html/g' {} \;
$session 自然也有同样的问题——
寻找 。-type f -exec sed -i 's/$session/$this->Session/g' {} \;
...
事情正在发生!现在我有一个难以理解的错误:
找不到控制器类 PagesController。
哦,为了爱......所以我需要移动在这里找到的 PagesController:
lib/Cake/Console/Templates/skel/Controller/PagesController.php
并把它放在这里
应用程序/控制器/
再一次,Cake 安装程序/升级程序似乎在工作中睡着了。
现在我有
找不到帮助程序类 JavascriptHelper。
这还不错 - 您不会找到对“JavascriptHelper”的任何引用,但您会在“$helpers”数组中找到对“Javascript”的引用。后端添加了 Helper 一词以进行额外的混淆。无论如何,我在我的 php 文件中搜索了任何 $helpers 数组,并在 AppController(2.1) 类中找到了一个。
我不喜欢也不理解帮手——反正是javascript——所以我从来没有用过它们。我一定是在某个时候盲目地遵循了一个教程并将它添加到......但我不需要它,所以它出去了!
现在我需要清理我拥有的所有 ctp 文件,在那里我使用了“require”来确保使用了正确的 html。再一次,我将使用上面的 find 命令(将它们指向“视图”而不是“视图”文件夹)叹息。好吧,不,没那么简单,是吗?我以前在哪里:
要求(应用程序/视图/页面/man_front.html)
我现在需要:
要求(/cake_folder/app/View/Pages/man_front.html)
(蛋糕文件夹是我所有蛋糕的地方。不确定为什么会这样,但一个简单的查找修复了它:
find . -type f -exec sed -i 's/app\/View\/Pages/\/cake_folder\/app\/View\/Pages/g' {} \;
(\ 将“削弱”一个 /)
好的,完成所有这些并让您的网站达到某种可接受的水平,下一步是什么?好吧,您现在可能会发现一些数据库问题:
警告 (2): mysqli::mysqli() 期望参数 1 是字符串,数组给定 [CORE/Cake/Model/ConnectionManager.php, line 101]
致命错误:在第 3383 行的 /cake_install/lib/Cake/Model/Model.php 中调用未定义的方法 mysqli::getSchemaName()
当然,不再支持mysqli。编辑 database.php 以使用 mysql 代替(即我刚刚删除了结尾的“i”)
(cakephp 中的窥视有什么问题??? API 的意思是“如果它会破坏现有代码,就永远不要更改所有内容。”而不是“更改!OBAMAAAAA!”〜下一次升级,我会将我所有的代码推送到 django或弹簧或斯卡拉。红润的胡说八道。)
下一个问题是我正在使用的“组件” - 我收到一个蛋糕错误说:
缺少插件
错误:应用程序正在尝试从 Uploader 插件加载文件
错误:确保您的插件 Uploader 位于 app/Plugin 目录中并已加载
<?php
CakePlugin::load('Uploader');
加载所有插件:如果您希望一次加载所有插件,请在 app/Config/bootstrap.php 文件中使用以下行
CakePlugin::loadAll();
所以......不仅我的所有代码都被破坏了,而且所有旧插件也被破坏了?好的。
解决方案是创建一个 app/Plugin 文件夹(是的,魔法升级程序也不这样做),然后查看您拥有的插件。现在!这与您的组件不同!我还不知道怎么做 - 查看我的问题以获得可能的答案:cakephp 2.1 中“组件”和“插件”之间的区别?- 但现在,我们只是查看“PLUGIN”文件夹和一般的插件。看起来,在 cake 1.3 中,插件是这样列出的:
var $components = array('Uploader.Uploader',...);
也就是说,使用点符号。我可以忍受这一点。就我而言,我需要获取最新版本的 Uploader 插件(谢天谢地,它已升级为与 2.x 兼容!)并将其放在 app/Plugin 文件夹中
所以我得到了:
app
Plugin
Uploader
Config
Locale
<the other files here too!>
这似乎现在有效,万岁!
下一个错误是:
警告 (2):为 foreach() 提供的参数无效 [CORE/Cake/Utility/Set.php,第 1048 行]
警告 (2): array_multisort() [ http://php.net/function.array-multisort] : 参数 #1 应该是一个数组或一个排序标志 [CORE/Cake/Utility/Set.php,第 1087 行]
警告 (2):array_unique() 期望参数 1 为数组,给定 null [CORE/Cake/Utility/Set.php,第 1089 行]
警告 (2):为 foreach() 提供的参数无效 [CORE/Cake/Utility/Set.php,第 1091 行]
警告 (2):无法修改标头信息 - 标头已由(输出开始于 /cake_install/lib/Cake/Utility/Debugger.php:761)[CORE/Cake/Network/CakeResponse.php,第 395 行]
啊,那好吧。这很清楚。我很高兴我知道我的代码中的错误是什么。很好的错误信息!
现在我明白了,愚蠢的我认为如果第一个数组为空,实用程序 Set::Sort 将继续工作!确实,cakephp 人不是站在巨人的肩膀上,而是站在他们的额头上。
似乎新的 2.1 升级取消了这种破旧的做法,所以现在我需要在任何 Set:Sort 调用之前进行检查,以避免相关数组为空或 null。美好的。很简单,但是……哎呀。
这解决了这个问题。
现在我收到 FormHelper 错误 - 视图中的 $form 现在看起来变成了 $this->Form,所以我有另一个快速脚本来替换它:
寻找 。-type f -exec sed -i 's/$form/$this->Form/g' {} \;
现在我得到的下一个错误是:
致命错误:第 1804 行的 /cake_install/lib/Cake/View/Helper/FormHelper.php 中不支持的操作数类型
现在他们已经搞砸了 FormHelper 中的“选择”方法 - 所以之前,我有这个:
echo $this->Form->select('treatment_id', $treatments, null, array('empty' => '-- 选择要评分的治疗 -- '));
我现在有这个:
echo $this->Form->select('treatment_id',$treatments, array('empty' => '-- 选择要评分的治疗 -- '));
现在我的一个组件——实际上,You_tube_loader_component——坏了。我需要修改它,以便标题显示:
class YouTubeLoaderComponent extends Component {
function __construct(ComponentCollection $collection, $settings = array()) {
parent::__construct($collection, $settings);
...
}
}
以前我只是默认了 uname 和密码的值 - 现在我把它们放在“...”部分而不是搞乱神秘的“设置”数组!
接下来是:
警告 (2):非法偏移类型 [CORE/Cake/Model/Model.php,第 2689 行]
警告 (2):非法偏移类型 [CORE/Cake/Model/Model.php,第 2665 行]
Soooo 这是一个在 cake 1.3 中没有出现的问题,但在 2.1 中
问题是在被引用的控制器动作中,有一个没有类型参数的“查找”调用。也就是说,我有
$results = $this->User->find(array(...), array(...), null, false);
我应该有的地方:
$results = $this->User->find('first',array(
'conditions' => array("User.id" => ($this->Auth->user("id"))),
'fields' => array("User.confirmed")
)
);
我遇到的另一个问题是,无论出于何种原因,检查:
$this->set('loggedIn', $this->Auth->user('id'));
不工作。显然(虽然我不确定如何/为什么),2.x 中的 cakePHP 身份验证将不再将所有用户的详细信息存储到会话中。我不知道它将哪些详细信息存储到会话中,或者如何修改它们 - 调查一下!- 但我的代码没有保存“id”值,所以上面的检查总是将loggedIn值设置为false。
为了补救,我将调用修改为:
$this->set('loggedIn', $this->Auth->loggedIn());
这对我来说很好。
下一个问题是 thios->auth->user('id') 在登录用户后不会给我任何回报。幸运的是,我遇到了这篇文章,这让事情变得更清楚了:
http://ask.cakephp.org/questions/view/unable_to_access_logged-in_users_data_in_2_0
令人惊讶的是,蛋糕实验室的天才们认为改变登录的工作方式将有助于消除一些困惑。老实说,我唯一感到困惑的是,谁对 auth 组件在登录后拥有所有用户的详细信息这一事实如此困惑。但不要害怕,他们已经消除了混乱并......删除了该功能完全。
那么,你要做什么?上面的链接建议获取所有用户详细信息,然后将其发送到身份验证登录部分。我不是特别喜欢这个(因为这是一个愚蠢的问题,我无法相信需要如此不雅的东西),但这是我必须做的。欢迎提出建议!
所以而不是哦,那么令人困惑:
if ($this->Auth->login($this->request->data)) {
... //argh! I am so confused by that line above!!!1
我现在有:
$user = $this->User->find('first', array(
'conditions' => array('User.email' => $this->request->data['User']['email'])
)
);
// Use the AuthComponent~Rs login action
if ($this->Auth->login($user['User'])) {
... //omg the extra check that the entry is in the db is just brilliant and efficient
这不是更整洁,更不混乱吗?干得好,cakephp 小牛!
下一个错误是
未找到授权适配器“控制器”。
哪个有点模糊...
啊! 此处已在堆栈溢出时回答:
在 cakePHP 中未找到授权适配器
就是这样!可能还有其他问题 - 上帝的速度 - 但我没有遇到它们,所以我不能再帮助你了。