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で読み取り可能であることを確認してください。/cake_install/cake/libs/configure.phpの393行目

ファイルが存在しない理由は、アップグレード時に大文字の「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]

致命的なエラー:クラス'AppHelper'が/cake_install/lib/Cake/View/Helper/HtmlHelper.phpの31行目に見つかりません

わかりました。/cake_install/app/ tmp / logs /フォルダー(chmod 777 -R folderHere)と777

...暗号シードをアップグレードしたことはないと思います。わかりました、新しい番号を作りました!(暗号シードは何をしますか?ええと、ビングはあまり役に立ちませんでした-私はコードを読みました。Cookieからの暗号化/復号化に使用されているようです?わかりました、私はそれで生きることができます)

Bootstrap.php

zipファイルのブートストラップを自分のバージョンに移動しました(少しありがとう、アップグレードスクリプト!)。まだ変更を加えていませんが、プラグインをロードする必要があると思います...それは十分に文書化されていると確信しています(ハァッ!)

だから、それは私にこの誤りを残します:

致命的なエラー:クラス'AppHelper'が/cake_install/lib/Cake/View/Helper/HtmlHelper.phpの31行目に見つかりません

そしてもちろん、非常に自慢のケーキアップグレーダーは別のアップグレードを行うことができませんでした。このページをチェックしてください:http: //book.cakephp.org/2.0/en/appendices/2-1-migration-guide.html

さて、ファイルを作成する必要があります-そのページにあるのと同じです。唯一のトリックは、はい、それはappフォルダーにあり、いいえ、cakePhpが作成した私のapp / Viewフォルダーには「ヘルパー」サブフォルダーがなかったということでした...したがって、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()を呼び出す

素晴らしい。$ htmlを使用できないことを意味するある種のクールな新しいケーキ2機能?それは...奇妙なことに、本当に適切なようです。

信じられない。今、私は$ this-> dataがどのように機能するかを変更する必要がありますか?どうして??どうして??なぜこの暴徒は、APIが浮動アイデアではなく、固定契約である傾向があることを理解できないのですか...ああ。それは大丈夫です、私が持っている最も使用されているケーキラインは今...間違っています。私はこれからscalaまたはdjangoで開発していますが、ジュニア言語は最悪です。

これが私が実行したものです:find。-type f -exec sed -i's / $ this-> data / $ this-> request-> data / g'{} \;

/appディレクトリに移動しました。この2.1...それは真剣に素晴らしい方が良いです...それを立ち上げるために誰もがしなければならない仕事の量。これは、私が思うに、ジュニア言語で作業する通常の日ですか?

素晴らしい、$ htmlの問題は、誰かが小文字を好まなかったために発生しますか?CakePHP2.0 でHtmlHelperを使用する場合の未定義 の変数そして解決策は次のとおりです:(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

ここに置いて

app / Controller /

繰り返しになりますが、Cakeインストーラー/アップグレード担当者は仕事で眠っているようです。

そして今、私は持っています

ヘルパークラスJavascriptHelperが見つかりませんでした。

これはそれほど悪くはありません。「JavascriptHelper」への参照は見つかりませんが、「$helpers」配列に「Javascript」への参照はあります。バックエンドは、さらに難読化するためにヘルパーという単語を追加します。とにかく、私は自分のphpファイルで$ helpers配列を検索し、AppController(2.1)クラスで見つけました。

私はヘルパー(とにかくjavascriptのもの)が好きでも理解もしていないので、私はそれらを使用したことはありません。ある時点でやみくもにチュートリアルをたどって追加したに違いありません...しかし、私はそれを必要としないので、それは行きます!

そして今、私は持っていたすべてのctpファイルをクリーンアップする必要があります。そこでは、正しいhtmlが使用されていることを確認するために「require」を使用しました。もう一度、上から検索コマンドを使用して(「views」フォルダではなく「View」を指すようにします)ため息をつきます。わかりました、いいえ、それはそれほど単純ではありませんね?私が持っていた前の場所:

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

私は今必要です:

require(/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、行101]であると想定しています。

致命的なエラー:3383行目の/cake_install/lib/Cake/Model/Model.phpにある未定義のメソッドmysqli :: getSchemaName()を呼び出す

もちろん、これ以上mysqliはサポートされません。代わりにmysqlを使用するようにdatabase.phpを編集しました(つまり、末尾の「i」を削除しただけです)

(cakephpの覗き見の何が問題になっていますか?APIは、「既存のコードが壊れても、すべてを変更しないでください」という意味です。「変更!OBAMAAAAA!」ではなく、次のアップグレードで、すべてのコードをdjangoにプッシュします。または春またはスカラ。血色の良いナンセンス。)

次の問題は、私が使用している「コンポーネント」です。次のようなケーキエラーが発生します。

不足しているプラ​​グイン

エラー:アプリケーションがアップローダープラグインからファイルを読み込もうとしています

エラー:プラグインアップローダーがapp / Pluginディレクトリにあり、ロードされていることを確認してください

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

すべてのプラグインをロードする:すべてのプラグインを一度にロードする場合は、app / Config/bootstrap.phpファイルで次の行を使用します

CakePlugin::loadAll();

だから...私のコードはすべて破壊されているだけでなく、古いプラグインもすべて破壊されていますか?良い。

解決策は、アプリ/プラグインフォルダーを作成し(そうです、マジックアップグレーダーもそれを行いません)、次に、持っていたプラグインを確認します。今!これはコンポーネントとは異なります。まだどのようになっているのかわかりません-考えられる答えについては私の質問をチェックしてください: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!>

それは今はうまくいくようです、やったー!

次のエラーは次のとおりです。

警告(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は引き続き機能すると思います。確かに、cakephpの人々は巨人の肩の上ではなく、額の上に立っています。

新しい2.1アップグレードはこのぼろぼろの慣習を廃止しているように思われるので、問題の配列が空かnullかを回避するために、Set:Sort呼び出しの前にチェックする必要があります。罰金。簡単ですが...おやおや。

  • 私はちょうど投げました

    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' =>'-評価する処理を選択-'));

私は今これを持っています:

echo $ this-> Form-> select('treatment_id'、$treatments、array('empty' =>'-評価する処理を選択-'));

そして今、私のコンポーネントの1つ(実際にはYou_tube_loader_component)が壊れていました。ヘッダーが次のようになるように変更する必要があります。

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

以前は、una​​meとパスワードのvaleusをデフォルトに設定していましたが、今では、不思議な「設定」配列をいじくり回す代わりに、「...」セクションに貼り付けています。

次は:

警告(2):不正なオフセットタイプ[CORE / Cake / Model / Model.php、行2689]

警告(2):不正なオフセットタイプ[CORE / Cake / Model / Model.php、2665行目]

すっごくこれはケーキ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") 
)
);

私が抱えていたもう1つの問題は、何らかの理由で、次のチェックを行うことでした。

$ 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

驚くべきことに、ケーキラボの天才たちは、ログインの仕組みを変えることで混乱を解消できると考えていました。正直なところ、私が混乱しているのは、ログイン後に認証コンポーネントがすべてのユーザーの詳細を利用できるという事実について誰が混乱したかということだけです。しかし、恐れることはありません。彼らは混乱を解消し、...削除しました。機能は完全に。

それで、あなたは何をしますか?上記のリンクは、すべてのユーザーの詳細を取得し、それを認証ログインセクションに送信することを提案しています。私はこれが特に好きではありませんが(それは愚かな問題であり、私は何も信じられないので、エレガントでないことが必要です)、それは私がしなければならないことです。提案を歓迎します!

だから、まあまあ混乱する代わりに:

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

おそらく、カスタムのCakeパスがに設定されていapp/webroot/index.phpます。Cake 2.0のディレクトリ構造はわずかに変更されており、通常、これはの正しい値を自動的に見つける新しいコードによって処理されますCAKE_CORE_INCLUDE_PATH。また、同じファイルAPP_DIRに正しく設定されていることを確認してください。index.php

app/webroot/index.phpCakeへの正しいパスが含まれていることを確認してください/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にあります)をアプリケーションの値で更新してください。デフォルトのものを使用するとCakePHPは泣き言を言い続けるので、古いインストールからソルトと暗号シードの値もコピーするようにしてください。これはセキュリティ上のリスクです。また、データベース接続を再び稼働させるために、構文が変更されました。

'driver' => 'mysqli'

になります

'datasource' => 'Database/Mysql'

一括作業:コンソール経由でアップグレード

すべてのアプリファイルの名前を新しいCakePHPファイル構造に変更するために、コンソールコマンドがあります。CakePHP 2.0の新機能は、各アプリケーションに独自のコンソールがあることです。/ app / Consoleでアプリのコンソール(/ lib / Cakeのコンソールではありません!)に移動し、chmod + xを実行してコンソールコマンドが実行可能であることを確認し、次を実行します。

./cake upgrade all

これにより、すべてのファイルの名前が新しいケーキ標準に変更され、PHPコード内のすべての参照が更新されます。

清掃

残念ながら、これで終わりではありません。コードが正常に実行される可能性はほとんどありません。詳細については、CakePHP2.0移行ガイドをご覧ください。私が最も扱った問題をここに要約します:

あなたの見解では、$thisオブジェクトを介してヘルパークラスに対処する必要があります。たとえば、これ以上呼び出す必要はありません

$html->link( 

、 これは

$this->Html->link( 

さて、サー。

また:

  • JavascriptHelperはJsHelperと呼ばれるようになりました。
  • Authコンポーネントが大幅に変更されました。コンポーネントを使用するときにlogin()アクションは自動的に追加されないため、ここで手動で指定する必要があります。詳細については、新しいAuthコンポーネントのドキュメントを確認してください。

AjaxHelperが削除され、 observefieldなどのAJAXスタイルの検索に便利な関数が追加されました。私は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 Upgradeツールを使用した後、これと同じ問題が発生しました。私たちのWebアプリは大きいですが、index.phpファイルをカスタマイズすることはありませんでした。

myapp / app / webroot /index.phpを新しくダウンロードしたCakePHPcakephp-2.3.4/ app / webroot / index.phpに置き換えると、この問題が解決しました。

CakePHPアップグレードシェルまたはその手順でindex.phpファイルを変更するように指定されていない理由はわかりませんが、@ bharalの長くてすばらしい答えが示すように、アップグレードシェルはそうではないため、やるべきことがたくさんあります。すべてを行います。

于 2013-05-07T18:27:06.500 に答える