6

更新:我问的问题并没有完全涵盖我在升级过程中的深度!如果你偶然发现这个,我希望我推送的答案对你有用

因此,为了让“论坛”插件正常工作,我决定将 cakephp 从 1.3 升级到 2.1

(这是因为论坛插件使用了一种叫做 CakeDC utils 的东西,它们已经升级到 cakephp 2.0,令人惊讶的是,论坛的 2.3 版本并不清楚它可以与哪些 utils 一起使用......)

好的,所以我已经按照此处的说明运行了蛋糕升级程序魔法的东西:

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

我运行了升级程序,它说它做了很多事情,看起来它确实做了很多事情。

现在,当我访问我的网站时,它已关闭 - 根本没有响应。

apache中的错误日志如下:

[Thu Apr 05 02:58:04 2012] [error] [client 173.45.125.112] PHP 致命错误:找不到应用程序核心文件。请创建 /cake_install/app/config/core.php,并确保它可以被 PHP 读取。在第 393 行的 /cake_install/cake/libs/configure.php

该文件不存在的原因是它在升级中更改为大写的“C”配置。我错过了什么?

4

4 回答 4

18

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。美好的。很简单,但是……哎呀。

  • 我刚投了一个

    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 中的“选择”方法 - 所以之前,我有这个:

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 中未找到授权适配器

就是这样!可能还有其他问题 - 上帝的速度 - 但我没有遇到它们,所以我不能再帮助你了。

于 2012-04-05T11:22:09.883 回答
3

您可能在app/webroot/index.php. Cake 2.0 的目录结构略有改变,通常这将由新代码处理,该代码会自动为CAKE_CORE_INCLUDE_PATH. 另外,请确保在同一文件APP_DIR中正确设置。index.php

确保app/webroot/index.php包含正确的 Cake 路径,即/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)如果 Cake 的设置方式不是太定制,那么恢复到标准也可能会起作用。

于 2012-04-05T06:30:43.447 回答
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 root)/app/Config)。确保也复制旧安装中的 salt 和 cipherseed 值,因为当您使用默认值时,CakePHP 会继续抱怨——这是一个安全风险。此外,为了使数据库连接重新启动并运行,语法已更改:

'driver' => 'mysqli'

变成

'datasource' => 'Database/Mysql'

批量工作:通过控制台升级

为了将所有应用程序文件重命名为新的 CakePHP 文件结构,有一个控制台命令。CakePHP 2.0 的新功能是现在每个应用程序都有自己的控制台。导航到 /app/Console 中的应用程序控制台(不是 /lib/Cake 中的控制台!),通过对其执行 chmod +x 确保控制台命令是可执行的,然后执行:

./cake upgrade all

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

打扫干净

不幸的是,这还没有结束。您的代码现在运行良好的可能性很小。查看 CakePHP 2.0 迁移指南以获取更多信息。我将在这里总结一下我处理得最多的问题:

在您看来,您现在必须通过$this对象来处理 Helper 类。例如,不再调用

$html->link( 

, 它的

$this->Html->link( 

现在,先生。

还:

  • JavascriptHelper现在称为 JsHelper。
  • Auth组件发生了显着变化。使用组件时不会自动添加login()操作,您现在必须手动指定它。查看新的 Auth 组件文档以获取更多信息。

AjaxHelper以及用于 AJAX 样式搜索的便捷功能(如 observefield )已被删除。我已经使用 jQuery 制作了自己的观察域——使用风险自负。我序列化了一个表单,在这种情况下,它包含一个查询输入框,允许我对预订进行实时搜索和更新。

$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)))
于 2012-07-06T14:32:39.553 回答
1

使用 Cake Shell 升级工具后,我遇到了同样的问题。虽然我们的 Web 应用程序很大,但我们从未自定义 index.php 文件。

用新下载的 CakePHP cakephp-2.3.4/app/webroot/index.php替换我们的myapp/app/webroot/index.php为我解决了这个问题。

我不确定为什么CakePHP 升级外壳或其说明没有指定更改 index.php 文件,但正如@bharal 冗长而出色的答案所示,由于升级外壳没有,还有很多工作要做做任何事。

于 2013-05-07T18:27:06.500 回答