CakePHP的升级,从1.3到2.1(Cakephp Upgrade from 1.3 to 2.

2019-07-28 19:27发布

更新:这个问题我问并不完全覆盖我在做这个升级有多深去! 如果您绊倒在此,我希望我把答案是对你有用

因此,在努力获得了“论坛”插件的工作,我决定把CakePHP升级从1.3到2.1

(这是因为论坛插件使用一种叫做CakeDC utils的,并且他们已经高达2.0的CakePHP和惊奇惊讶的是,2.3版本论坛不清楚哪个utils的它与...)

好了,我已经跑了蛋糕改质神奇的事情,按照这个网址的指示:

http://book.cakephp.org/2.0/en/console-and-shells/upgrade-shell.html#upgrade-shell

,我跑的升级程序,它说,它做了一堆东西,它看起来像它确实做了一堆东西。

现在,当我访问我的网站,它是下跌 - 根本没有反应。

在Apache中读取错误日志:

[周四4月5日2时58分04秒2012] [错误] [客户173.45.125.112] PHP致命错误:无法找到应用程序核心文件。 请创建/cake_install/app/config/core.php,并确保它是可读的PHP。 在上线393 /cake_install/cake/libs/configure.php

该文件不存在,原因是它改为在升级大写字母“C”配置。 我在想什么?

Answer 1:

通过门施给出的答案是不太我所需要的 - 我从来不碰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(是的,这是应用程序/ Webroot公司/ index.php文件),现在我有一个新的错误:

通知:未定义指数:错误/cake_install/lib/Cake/Core/Configure.php上线94通知:未定义指数:异常在/cake_install/lib/Cake/Core/Configure.php上线95致命错误:类名必须在/cake_install/lib/Cake/Error/ErrorHandler.php有效目标或字符串上线126

(其中cake_install是文件夹,我的蛋糕应用坐镇)

现在这方面的工作?

现在我看到升级工具没有升级core.php中的文件 - 在app /配置发现(2.1,应用1.3 /配置)... ...还有什么升级工具真的? 我剪切和粘贴在2.1版本(即从2.1码的zip文件,我把那/app/Config/core.php并移动到我的/应用/ config目录),并确保该盐和安全值交换跨越。 而已。

仍然没有运气。 所以,现在我已经升级为database.php文件中(也应用程序/配置,或应用程序/配置)〜我改变了

'driver' => 'mysqli',

'datasource' => 'Database/Mysqli',

随机配置文件的乐趣!

嗯,好吧,那么升级到核心服务器与数据库更改错误信息......这是很好的? 仍不能确定什么他们大肆吹嘘的“升级版”的剧本没...它只是改变了文件名? 真?

警告(2):file_put_contents(/cake_install/app/tmp/logs/error.log):未能打开流:权限被拒绝[CORE /蛋糕/日志/引擎/ FileLog.php,线69]

通知(1024):请的“Security.cipherSeed”在app /配置/ core.php中的值(仅数字)特定的种子值更改为数字您的应用程序[CORE /蛋糕/实用/ Debugger.php,线810]

致命错误:类“AppHelper”在/cake_install/lib/Cake/View/Helper/HtmlHelper.php未发现行31

好了,我777 / cake_install /应用程序/ TMP /日志/文件夹(搭配chmod 777 -R folderHere)和

...想我从来没有升级的密码种子。 好了,由一个新的号码! (什么是密码种子做的,你问嗯,很好,冰是没有太大的帮助 - 我读的代码似乎被用于加密/从饼干解密好吧,我可以忍受的。?)

bootstrap.php中

我曾在zip文件中的自举到我的版本(感谢小,升级脚本!)。 还没有做出任何更改,我想我会需要到,虽然加载插件...我敢肯定这是有据可查的,但(哈!)

所以这给我留下了这个errror:

致命错误:类“AppHelper”在/cake_install/lib/Cake/View/Helper/HtmlHelper.php未发现行31

,当然,大肆吹嘘蛋糕升级程序没有做到另一个升级。 查看此网页出来: http://book.cakephp.org/2.0/en/appendices/2-1-migration-guide.html

好了,所以我现在做的文件 - 就像他们在该页面。 唯一的问题是,是的,它是在应用程序文件夹中,并没有,我的应用程序/查看CakePHP执行没有一个“助手”子文件夹中的文件夹......所以对于AppHelper.php我不得不做出一个助手在/应用/视图/子文件夹。

...

嘿! 现在我得到一个背景和一个标志......和这些:

通知(8):未定义变量:的loggedIn [APP /页/ top_menu.html,线3]

通知(8):未定义变量:HTML [APP /页/ top_menu.html,线25]

致命错误:调用一个成员函数链路()的一个非对象在/cake_install/app/pages/top_menu.html在线25上

大。 某种很酷的新蛋糕2功能,这意味着我不能使用$ HTML? 这似乎很奇怪......适当的,真的。

难以置信的。 现在我需要怎么改$这个 - >数据工程??? 为什么?? 为什么?? 为什么不能在此聚众制定原料药往往是固定的合同,而不是浮动的想法......哎呀。 没关系,最常用的蛋糕线我有现在...错了。 我在斯卡拉或Django的从现在开始发展,初中语文闹心。

Here is what i ran: find . -type f -exec sed -i 's/$this->data/$this->request->data/g' {} \;

I went to the /app directory to do so. This 2.1... it better be seriously awesome... the amount of work everyone has to do to get it up. Is this, i assume, a normal day working with the junior languages?

Ah fantastic, the $html problem is caused because somebody didn't like lowercase? One can only wonder: Undefined var when using Html Helper in CakePHP 2.0 And the solution is: (thanks to another post in SO)

find . -type f -exec sed -i 's/$html/$this->Html/g' {} \;

And naturally the same problem with $session -

find . -type f -exec sed -i 's/$session/$this->Session/g' {} \;

...

Things are coming along! Now I have the inscrutible error:

Controller class PagesController could not be found.

Oh for the love of... so i need to move the PagesController found here:

lib/Cake/Console/Templates/skel/Controller/PagesController.php

and put it here

app/Controller/

again, the Cake installer/upgrader seems to be asleep on the job.

And now I have

Helper class JavascriptHelper could not be found.

This isn't too bad - you won't find any references to "JavascriptHelper", but you will find references to "Javascript" in your "$helpers" array. The back-end adds in the word Helper for extra obfuscation. Anyway, i searched through my php files for any $helpers arrays, and found one, in the AppController(2.1) class.

I don't like nor understand helpers - javascript ones, anyway - so I never used them. I must have followed a tutorial blindly at some point and added it in... but i don't need it, so out it goes!

And now i need to clean up all the ctp files i had, where i used a "require" to ensure that the right html was used. Once more i will use the find command from above for this (to point them to the "View" and not "views" folder) Sigh. Ok, no, it isn't that simple, is it? Where before I had :

require(app/View/Pages/man_front.html)

i now need:

require(/cake_folder/app/View/Pages/man_front.html)

(where the cake folder is where all my cake stuff is. Unsure why this is, but a simple find fixed it:

find . -type f -exec sed -i 's/app\/View\/Pages/\/cake_folder\/app\/View\/Pages/g' {} \;

(the \ will "depower" a /)

Ok, so having done all that and gotten your site to some sort of acceptable level, what next? Well, you might now find some db issues:

Warning (2): mysqli::mysqli() expects parameter 1 to be string, array given [CORE/Cake/Model/ConnectionManager.php, line 101]

Fatal error: Call to undefined method mysqli::getSchemaName() in /cake_install/lib/Cake/Model/Model.php on line 3383

Of course, no more mysqli support. Edited the database.php to use mysql instead (ie i just removed the ending "i")

(what is wrong with the peeps in cakephp??? API means "don't change everything if it will break existing code, ever." not "change! OBAMAAAAA!" ~ next upgrade, i'll push all my code to django or spring or scala. Ruddy nonsense.)

The next issue is the "Components" that i am using - i get a cake error saying:

Missing Plugin

Error: The application is trying to load a file from the Uploader plugin

Error: Make sure your plugin Uploader is in the app/Plugin directory and was loaded

<?php
CakePlugin::load('Uploader');

Loading all plugins: If you wish to load all plugins at once, use the following line in your app/Config/bootstrap.php file

CakePlugin::loadAll();

So... not only is all my code busted, but all the old plugins too? Nice.

The solution is to create an app/Plugin folder (yes, the magic upgrader doesn't do that, either) and then look at the plugins you had. Now! This is different from your components! I don't know how just yet - check out my question for a possible answer : Difference between a "component" and a "plugin" in cakephp 2.1? - but right now, we are just looking at the "PLUGIN" folder, and plugins in general. Looks like, in cake 1.3, the plugins were listed like this:

var $components = array('Uploader.Uploader',...);

that is, with a dot notation. I can live with that. In my case, I needed to get the latest version of the Uploader plugin (that, thankfully, was upgraded to be 2.x compatible!) and put it in the app/Plugin folder

so i got:

app
    Plugin
        Uploader
            Config
            Locale
            <the other files here too!>

That seems to work right now, hooray!

The next error was:

警告(2):提供的foreach无效的参数()[CORE /蛋糕/效用/ Set.php,线1048]

警告(2):在array_multisort()[ http://php.net/function.array-multisort] :参数#1预计是阵列或一种标志[CORE /蛋糕/效用/ Set.php,线1087 ]

警告(2):array_unique()预计参数1是阵列,空给出[CORE /蛋糕/效用/ Set.php,线1089]

警告(2):提供的foreach无效的参数()[CORE /蛋糕/效用/ Set.php,线1091]

警告(2):无法修改标题信息 - 头已经发出(输出开始/cake_install/lib/Cake/Utility/Debugger.php:761)[CORE /蛋糕/网络/ CakeResponse.php,线395]

嗯,那好吧。 这是显而易见的。 我很高兴我知道错误是在我的代码是什么。 好消息错误!

现在我明白了,我傻,认为该实用程序设置::排序将继续工作,如果第一个数组是空的! 诚然,CakePHP的人都站着,而不是巨人的肩膀上,但在他们的额头很。

这似乎是新的2.1升级废除了这个破旧的做法,所以现在我的任何设置之前需要检查:排序要求,以避免如果有问题的数组为空或空。 精细。 很容易,但是... geeze。

  • 我只是把在

    如果(空($ theArray)!){集::排序($ theArray,...); }

和固定的。

现在我越来越表单助手的错误 - 它看起来像$形式的观点,现在变成这个 - $>的形式,所以我还有一个快速脚本来替换此:

找 。 型的F -exec SED -i的/ $形式/ $这 - >表单/ G'{} \;

而现在的下一个错误我得到的是:

致命错误:在/cake_install/lib/Cake/View/Helper/FormHelper.php不支持的操作类型上线1804

而现在,他们已经做了,转眼搞砸在表单助手“选择”方法 - 此之前,在那里我有这样的:

回声$这 - >形式 - >选择( 'treatment_id',$处理,null,数组( '空'=> ' - 选择处理,速率 - '));

我现在有这样的:

回声$这 - >形式 - >选择( 'treatment_id',$治疗,阵列( '空'=> ' - 选择处理,速率 - '));

现在我的部件之一 - 实际上,在You_tube_loader_component - 被打破。 我需要让头部读取进行修改:

class YouTubeLoaderComponent extends Component {
    function __construct(ComponentCollection $collection, $settings = array()) {
        parent::__construct($collection, $settings);
        ...
    }
}

以前我刚刚拖欠的uname和密码的valeus - 现在我把它们粘的“...”部分中,而不是与神秘的‘设置’阵列周围搞乱的!

接下来是:

警告(2):非法偏移类型[CORE /蛋糕/型号/ Model.php,线2689]

警告(2):非法偏移类型[CORE /蛋糕/型号/ Model.php,线2665]

SOOOO这是不是在蛋糕1.3拿起一个问题,但在2.1

问题是,在所引用的控制器动作,有没有一种放慢参数是“找到”的呼叫。 也就是说,我有

$结果= $这个 - >用户 - >找到(阵列(...),阵列(...),NULL,FALSE);

在那里我应该有:

$results = $this->User->find('first',array(
    'conditions' => array("User.id" => ($this->Auth->user("id"))),
    'fields' => array("User.confirmed") 
)
);

我的另一个问题是,无论出于何种原因,检查:

$这 - >置( '的loggedIn',$这 - > Auth->用户( 'ID'));

不工作。 显然,(虽然我不能确定如何/为什么),CakePHP的2.x的中身份验证将不再存储用户的所有细节到会话中。 我不知道它存储到会话哪些细节,或如何修改它们-寻找到的! - 但我的代码无法保存“ID”的值,所以在支票上面总是的loggedIn值设置为false。

为了弥补,我修改了电话如下:

$这 - >置( '的loggedIn',$这 - > Auth->的loggedIn());

这对我来说工作得很好。

接下来的问题是,thios-> auth->用户(“身份证”)将在用户登录后返回我甜蜜什么。 幸运的是我遇到了这个帖子,这让事情更清晰:

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没有找到授权适配器

那就是它! 可能还有其他的问题 - 他们的神的速度 - 但我没遇到过他们,所以我不能帮你了。



Answer 2:

你可能曾在设置自定义的蛋糕路径app/webroot/index.php 。 用于蛋糕2.0目录结构略有改变,通常这将通过将新代码可自动找到正确的值来处理CAKE_CORE_INCLUDE_PATH 。 此外,确保APP_DIR在同一个正确设置index.php文件。

确保app/webroot/index.php中包含的正确路径蛋糕,这是/path/to/cake/lib

if (!defined('CAKE_CORE_INCLUDE_PATH')) {
  define('CAKE_CORE_INCLUDE_PATH', DS.'path'.DS.'to'.DS.'cake'.DS.'lib');
}

恢复到标准的define('CAKE_CORE_INCLUDE_PATH', ROOT)可能工作为好,如果蛋糕的方式设置不太习惯。



Answer 3:

这是我在迁移从1.3到2.x的博客文章: http://www.forceflow.be/2011/11/12/migrating-from-cakephp-1-3-to-2-0/

对于未来的参考,我已经提供了张贴在这里的内容。 请享用!

入门

有几种方法可以更新,但对于中小型项目,我发现最好只需要解压缩新的CakePHP 2的结构,并在你的控制器和视图手动复制到新的文件夹。 你要知道的是,文件夹结构已显著改变。 例如,控制器地图现在控制器。 注意,你复制文件 - 不要担心自己的文件名,我们会来的后来。

请确保您更新core.php文件和database.php中(现在位于(CakePHP的根)/应用/配置),为您的应用程序的值。 确保在盐和cipherseed值从旧安装复制过,从CakePHP将继续发牢骚,当您使用默认的 - 这是一个安全隐患。 此外,为了获得数据库的连接并再次运行,语法改变:

'driver' => 'mysqli'

'datasource' => 'Database/Mysql'

散装的工作:通过控制台升级

为了您的所有应用程序的文件重命名为新的文件CakePHP的结构,有一个控制台命令。 新来CakePHP的2.0是每个应用程序现在都有自己的控制台。 浏览到您的应用程序的控制台在/ app /控制台,确保控制台命令可执行做在chmod + X上它,并执行(不是控制台在/ lib /饼!):

./cake upgrade all

这将所有文件重命名为新蛋糕的标准,并更新你的PHP代码中的所有引用。

打扫干净

不幸的是,这不是结束。 机会是薄,你的代码将只运行正常了。 看看CakePHP的2.0迁移指南,了解更多信息。 我会总结我已经经历了最为这里的问题:

在您的看法,您现在可以通过在$解决Helper类对象。 没有更多的调用,例如

$html->link( 

, 它的

$this->Html->link( 

现在,先生。

也:

  • JavascriptHelper现在被称为JsHelper。
  • 验证组件已显著改变。 登录()动作不会自动添加当您使用的组件,你必须得手动指定。 检查新的验证组件文档获取更多信息。

AjaxHelper已被删除,与AJAX风格的搜索的方便功能,如observefield一起。 我已经熟使用jQuery我自己observefield -使用您自己的风险。 我连载形式,在这种情况下拥有一个查询输入框,让我做了预订实时搜索和更新。

$this->Js->get('#query')->event('keyup', $this->Js->request(
array('controller' => 'sales','action' => 'searchReservations', $event['Event']['id']),
array(
'update' => '#view',
'async' => true,
'dataExpression' => true,
'method' => 'post',
'data' => $this->Js->serializeForm(array('isForm' => false, 'inline' => true)))


Answer 4:

我用蛋糕壳牌升级工具后出现同样的问题。 虽然我们的web应用程序是大的,我们从来没有定制的index.php文件。

与新下载的CakePHP CakePHP的-2.3.4 /应用/ Webroot公司/更换我们的myapp /应用/ Webroot公司/ index.php的 index.php的解决了这个问题对我来说。

我不知道为什么CakePHP的升级壳牌或它的指令不指定更改index.php文件,但作为@岩羊的冗长和伟大的回答显示,有更多的工作,因为升级shell不会做做任何事。



文章来源: Cakephp Upgrade from 1.3 to 2.1