2016-09-05 4 views
6

私はパラレル、WordpressのとCakePHPの中で実行している2つのPHPフレームワークを利用してサイト上で働いている問題再宣言された関数のために2つのフレームワークが競合するのを避けるにはどうすればよいですか?

。両方とも__()と呼ばれるコア関数を含んでいます。

は、私は関数が宣言されているかどうかを確認するためにどちらかのフレームワークのコアファイルを変更することができます知っているし、それを宣言しない:

if (!function_exists('__')) { 
    function __() { 
     // ... 
    } 
} 

しかし、問題は、両方のフレームワークが自動的に時間から更新する必要があるということですこれが発生すると、コアファイルが書き換えられ、機能が復帰し、致命的なエラーが発生します。

Wordpressは私達のコントロール下にありません。 CMSを使用している編集者は、Wordpressの管理パネルからフレームワークとプラグインを自動的に更新できるようにしたいと考えています。これは、問題を解決するためにWordpressのコアを実際に変更することはできません。更新するたびに変更を上書きするだけです。

CakePHPは、開発者によってComposerを介して更新されます。もちろん、基本的な解決策の1つは、すべての開発者がComposerの更新を実行するときに、関数を宣言するコアファイルを修正して致命的なエラーを修正する必要があることを確認することです。これはまだかなり悪い解決策です。


質問

私はこれへの恒久的な解決策は存在しない99%確信しているが、任意のPHPの達人が汚い/やや型破りとはいえ、本当に賢いと考えることができますのであれば、私は思ったんだけどCakePHP内のカスタムアプリケーションでいくつかのコードでこれを解決する方法。私がPHPで知らないことができることがあれば。サイトの

アプリケーションが

  • のしくみ基本的なマーケティングのページは、純粋なWordpressのです。 CakePHPはそれらのページにロードされません。

  • 複雑な機能を必要とするサイトの一部では、CakePHPがの最初にに読み込まれます。ページがレンダリングされる前に、CakePHPはWordpressフレームワークを読み込み、Wordpressを通してページをレンダリングします。 これらは、同じ関数上で両方のフレームワークが衝突し、2回宣言されるページです。

私の思考

  1. CakePHPのは、ページ上のブートストラップされている場合、ビューがレンダリングされる予定であるまで、それはアップし実行してみましょう。この時点では、CakePHPだけがその関数を宣言しています。

  2. Wordpressが読み込まれる前に機能が存在するかどうかを確認してください。

  3. Wordpressがあらかじめ関数の再宣言をしないようにしてください。開発者によって完全に制御され、Gitリポジトリにコミットされているアプリケーションコードに記述します。

私は、これは不可能ですが、これを解決するのは本当に巧妙な方法があれば、それはとても有用であろうと確信しているように私は、この質問ばかげ投稿を感じます。

+2

フォークCakePHP、変更を適用し、定期的にダウンストリームから更新してください。 – ceejayoz

+0

このようなことはどうですか?cakephpのインストールまたはアップデート後にパッチを適用してください:https://github.com/netresearch/composer-patches-plugin。理想的にはcakephpまたはWordPressは完全に名前空間になり、グローバル関数を宣言しません。 – jedifans

+2

@jedifans *「理想的なcakephpまたはWordPressは完全に名前空間になり、グローバル関数を宣言しません」*それについて教えてください... – BadHorsie

答えて

0

ceejayozが言ったように、CakePHPをフォークし、あなたのプロジェクトをそのフォークで維持します。

プロジェクトに役立つコミットを行い、ケーキチームに提出することができます。あなたが提案したように、__の宣言はまだ存在していないとし、@deprecatedをphpdocで宣言し、すべてを変換する名前空間のバージョンを作成します。それをPRとしてケーキに送ってください。

フォークを更新する必要がある場合は、アップストリームブランチを自分のものにマージします。 __ファンクションの使用のために入ってくるケーキの変更を多く見て、それに応じて変更します。 Gitはこれをキャッチしません。

関連する問題