bha*_*ral 6 cakephp cakephp-1.3 cakephp-2.0
更新:我提出的问题并没有完全涵盖我进行此次升级的深度!如果你偶然发现这个,我希望我推出的答案对你有用
所以,为了让"论坛"插件正常工作,我决定将cakephp从1.3升级到2.1
(这是因为论坛插件使用了一个名为CakeDC的程序,并且它们已经达到了cakephp 2.0,并且出人意料的是,2.3版本的论坛并不清楚哪个工具适用于...)
好的,所以我按照此处的说明运行了蛋糕升级魔术的事情:
http://book.cakephp.org/2.0/en/console-and-shells/upgrade-shell.html#upgrade-shell
我运行升级程序,它说它做了很多事情,看起来确实做了很多事情.
现在当我访问我的网站时,它已经关闭 - 根本没有回复.
apache中的错误日志读取:
[Thu Apr 05 02:58:04 2012] [错误] [客户端173.45.125.112] PHP致命错误:找不到应用程序核心文件.请创建/cake_install/app/config/core.php,并确保它可由PHP读取.在第393行的/cake_install/cake/libs/configure.php中
文件不存在的原因是它在升级中被更改为大写"C"Config.我错过了什么?
bha*_*ral 19
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
Run Code Online (Sandbox Code Playgroud)
对我来说没有意义...你能指定文件的文件夹吗?文件中的任何特定位置添加行?等...我会尝试并特别关注我所做的!)
首先,我注意到我的蛋糕使用的index.php不是cake2.1代码附带的index.php.不确定为什么会这样,但我复制了"new"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',
Run Code Online (Sandbox Code Playgroud)
至
'datasource' => 'Database/Mysqli',
Run Code Online (Sandbox Code Playgroud)
随机配置文件很有趣!
啊,好吧,所以升级到核心和数据库改变了错误信息......那很好吗?仍然不确定他们大肆吹嘘的"升级"脚本做了什么......它只是改变了文件名?真?
警告(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?好吧,我可以忍受这个)
bootstrap.php中
我将zip文件中的bootstrap移动到我的版本(感谢一点,升级脚本!).还没有做任何改动,我想我需要加载插件虽然...我确信这有很好的记录(哈!)
所以这让我错了:
致命错误:第31行的/cake_install/lib/Cake/View/Helper/HtmlHelper.php中找不到类'AppHelper'
当然,备受吹嘘的蛋糕升级版未能进行另一次升级.查看此页面:http: //book.cakephp.org/2.0/en/appendices/2-1-migration-guide.html
好的,现在我必须制作文件 - 就像它们在那个页面中一样.唯一的技巧是,是的,它在app文件夹中,不,我的appPhp制作的app/View文件夹没有"Helper"子文件夹...所以对于AppHelper.php我必须做一个帮手子文件夹在/ 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的工作方式??? 为什么??为什么??为什么这个暴徒不能解决apis往往是固定合同,而不是浮动的想法......唉.没关系,我用过的最常用的蛋糕线现在......错了.我从现在开始用scala或django开发,初级语言很糟糕.
这是我跑的:找到.-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 /蛋糕/控制台/模板/ skel中/控制器/ PagesController.php
并把它放在这里
应用程序/控制器/
再次,Cake安装程序/升级程序似乎在工作中睡着了.
现在我有
无法找到帮助程序类JavascriptHelper.
这不是太糟糕 - 您将找不到对"JavascriptHelper"的任何引用,但您会在"$ helpers"数组中找到对"Javascript"的引用.后端添加了Helper这个词,用于额外的混淆.无论如何,我在我的php文件中搜索了任何$ helpers数组,并在AppController(2.1)类中找到了一个.
我不喜欢也不理解助手 - 无论如何都是javascript - 所以我从未使用过它们.我必须在某个时候盲目地遵循一个教程并将其添加到...但我不需要它,所以它出来了!
现在我需要清理所有的ctp文件,我使用"require"来确保使用正确的html.我将再次使用上面的find命令(将它们指向"View"而不是"views"文件夹)叹气.好吧,不,它不是那么简单,是吗?在我之前的地方:
需要(应用程序/视图/页/ 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' {} \;
Run Code Online (Sandbox Code Playgroud)
(\将"降低"a /)
好的,所以做了所有这些并让你的网站达到某种可接受的水平,下一步是什么?好吧,您现在可能会发现一些数据库问题:
警告(2):mysqli :: mysqli()期望参数1为字符串,给定数组为[CORE/Cake/Model/ConnectionManager.php,第101行]
致命错误:在第3383行的/cake_install/lib/Cake/Model/Model.php中调用未定义的方法mysqli :: getSchemaName()
当然,没有更多的mysqli支持.编辑database.php代替使用mysql(即我刚刚删除了结尾"i")
(cakephp中的peeps出了什么问题?API意味着"如果它会破坏现有代码,不要改变所有内容."不要"改变!OBAMAAAAA!"〜下次升级,我会将所有代码推送到django或春天或斯卡拉.红润的废话.)
下一个问题是我正在使用的"组件" - 我得到一个蛋糕错误说:
缺少插件
错误:应用程序正在尝试从Uploader插件加载文件
错误:确保您的插件上传器位于app/Plugin目录中并已加载
<?php
CakePlugin::load('Uploader');
Run Code Online (Sandbox Code Playgroud)
加载所有插件:如果您希望一次加载所有插件,请在app/Config/bootstrap.php文件中使用以下行
CakePlugin::loadAll();
Run Code Online (Sandbox Code Playgroud)
所以...不仅我的所有代码都被破坏了,而且所有旧的插件也被破坏了?尼斯.
解决方案是创建一个app/Plugin文件夹(是的,魔术升级程序也不会这样做),然后查看你拥有的插件.现在!这与您的组件不同!我不知道怎么回事 - 看看我的问题是否有可能的答案:cakephp 2.1中"组件"和"插件"的区别? - 但是现在,我们只是查看"PLUGIN"文件夹和插件.看起来,在蛋糕1.3中,插件列出如下:
var $ components = array('Uploader.Uploader',...);
也就是说,带点符号.我可以忍受这一点.在我的情况下,我需要获取最新版本的Uploader插件(幸运的是,升级为2.x兼容!)并将其放在app/Plugin文件夹中
所以我得到了:
app
Plugin
Uploader
Config
Locale
<the other files here too!>
Run Code Online (Sandbox Code Playgroud)
这似乎现在很有用,万岁!
下一个错误是:
警告(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为数组,给定[CORE/Cake/Utility/Set.php,第1089行]为null
警告(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将继续工作!确实,蛋糕上的人们站在那里,不是站在巨人的肩膀上,而是站在额头上.
似乎新的2.1升级消除了这种破旧的做法,所以现在我需要在任何Set之前进行检查:排序调用以避免相关数组为空或为空.精细.很容易,但是... geeze.
我只是扔了一个
if(!empty($ theArray)){Set :: sort($ theArray,...); }
并修复了那个问题.
现在我收到了FormHelper错误 - 看起来现在视图中的$ form变成$ this-> Form,所以我有另一个快速脚本来替换它:
找 .-type f -exec sed -i's/$ form/$ this-> Form/g'{} \;
现在我得到的下一个错误是:
致命错误:1804行/cake_install/lib/Cake/View/Helper/FormHelper.php中不支持的操作数类型
而现在他们已经搞砸了FormHelper中的"select"方法 - 所以之前,我有这个:
echo $ this-> Form-> select('treatment_id',$ treatments,null,array('empty'=>' - select treatment to rate - '));
我现在有这个:
echo $ this-> Form-> select('treatment_id',$ treatments,array('empty'=>' - select treatment to rate - '));
现在我的一个组件 - 实际上是You_tube_loader_component - 被打破了.我需要修改它,以便标题读取:
class YouTubeLoaderComponent extends Component {
function __construct(ComponentCollection $collection, $settings = array()) {
parent::__construct($collection, $settings);
...
}
}
Run Code Online (Sandbox Code Playgroud)
以前我刚刚默认了uname和密码的价值 - 现在我把它们粘在"..."部分,而不是搞乱神秘的"设置"阵列!
接下来是:
警告(2):非法偏移类型[CORE/Cake/Model/Model.php,第2689行]
警告(2):非法偏移类型[CORE/Cake/Model/Model.php,第2665行]
Soooo这是一个问题,在蛋糕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")
)
);
Run Code Online (Sandbox Code Playgroud)
我遇到的另一个问题是,无论出于何种原因,检查:
$ this-> set('loggedIn',$ this-> Auth-> user('id'));
不工作.显然(虽然我不确定如何/为什么),2.x中的cakePHP auth将不再将所有用户的详细信息存储到会话中.我不知道它存储在会话中的哪些细节,或者如何修改它们 - 看着它! - 但我的代码没有保存"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
Run Code Online (Sandbox Code Playgroud)
我现在有:
$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
Run Code Online (Sandbox Code Playgroud)
是不是那么整洁,不那么混乱?干得好,cakephp mavericks!
下一个错误是
未找到授权适配器"controller".
哪个有点模糊......
啊! 这里已经回答了堆栈溢出: 在cakePHP中找不到授权适配器
就是这样!可能还有其他问题 - 上帝对他们的速度 - 但我没有碰到他们,所以我不能再帮助你了.