libファイルを書き換える最新の方法


21

この問題はよく知られています。libクラスはオートローダーを介して排他的にロードされ、次のもの以外は変更できません。

  • libより前にチェックされるcodePoolにそれらを完全にコピーします。
  • PSR-0オートローダーをインストールし、オートロードクラスマップを指定し、代わりにファイルをそのフォルダー構造に完全にコピーします。[私の現在の解決策]

これらのファイルの多くに潜在的に触れたいので、私は困難な状況にあります-しかし、ストアの健全性と安定性/アップグレード性のために、ライブラリクラス全体をコピーしたくありません。

現在、明らかにこの問題には潜在的な解決策がありますが、それらにはすべて独自の問題があります:

  • 行くAOPのルートをとのようなPHPベースのライブラリを使用してゴー!AOP:最後に確認したのは、Magentoクラスが1つだけではなく、コンポーザーオートローダーによってロードされる必要があることです。Flyingmanaはこの分野でいくつかの作業を行いましたが、本番環境で使用する準備ができていないことは間違いなく、私のニーズはより迅速です。また、拡張機能として出荷したいのですが、これにはより多くの作曲家の設定が必要になります。
  • AOPルートに進み、ネイティブPHP拡張機能を使用します。おそらく現時点で最も有利ですが、HHVMで動作しないことは言うまでもなく、別の拡張機能をインストールする必要があります。
  • PHPのクラスキットおよび/またはrunkitを使用します。これは別のネイティブPHP拡張であるため、上記と同じ問題があります。
  • コールサイトにパッチを適用して、独自の名前空間(\Danslo\Varien_X)バージョンを使用し、元の()バージョンから拡張し\Varien_Xます。パッチを当てるコールサイトが多すぎます。オプションではありません。
  • 自分で転がす:できること:

    1. 独自のオートローダーを作成します。
    2. 元のクラスを別のフォルダー({root_dir}/var/tmp)にコピーし、ラップしnamespace \Magento { < original contents > }ます。
    3. そのファイルを含めます。
    4. 変更したクラスを含める OriginalClass extends Magento\OriginalClass {}

これの欠点は明らかです。動的コード生成、正規表現、書き換えられたクラスをロードするための少しのオーバーヘッド。しかし、この時点で、〜100行をタッチ/追加したいだけで、〜5000行のコードをコピーするのに勝ると確信しています。

私は多くを求めていることを知っていますが、この問題を解決するのに役立つ現代的で比較的きれいなものがありますか?


1
Alansオブザーバーソリューションはもう見つかりましたか?stackoverflow.com/a/4636662/158325
B00MER 14年

回答:



2

AOPルートに進み、Go!のようなPHPベースのライブラリを使用します。AOP:最後に確認したのは、Magentoクラスが利用可能なものだけでなく、コンポーザーオートローダーによって読み込まれることを必要とすることです。Flyingmanaはこの分野でいくつかの作業を行いましたが、本番環境で使用する準備ができていないことは間違いなく、私のニーズはより迅速です。また、拡張機能として出荷したいのですが、これにはより多くの作曲家の設定が必要になります。

そのGo!を追加したいです。AOPフレームワークはコンポーザーなしでも機能します。構成を支援できます(そのためにgithubで問題を作成するだけです)。Composerは、最新のアプリケーションとの透過的な統合にのみ必要です。

ブートストラップ内のinclude $filenameまたはをGo!に置き換えて、Go!のオートローダーを設定するだけです AOP自体。require $filenameinclude FilterInjectorTransformer::rewrite($filename)


1
素敵な。私は間違いなくこれを試してみます。
ダニエル・スルーフ14年

0

オートローダーアプローチを使用します。libの/ all /クラスの名前をプレフィックスで変更します。

find lib -name '*.php' -exec sed -e 's,^class ,class Oldlib_,' {} +

mylibにファイルを追加するたびに、次の「オーバーライドフィクサー」を実行します。

find lib -name '*.php' -print | while read FILE
do
    classname=$(echo ${FILE}|sed -e 's,^lib/,,' -e 's,\.php$,,' -e 's,/,_,g')
    if [ ! -f mylib/${FILE#lib/} ]; then
        # ensure is_a works by providing a stub with correct classname
        echo "class ${classname} extends Oldlib_${classname} {}" > mylib/${classname}.php
    elif [ -f mylib/${classname}.php ]; then
        # we have a new override, but the old file still exists
        rm mylib/${classname}.php
    fi
done

オートローダーmylib/${classname}.phpが存在する場合と存在mylib/full/path/to/class.phpしない場合と存在しない場合に戻るようにオートローダーに指示mylib/full/path/to/class.phpします。

オーバーライドを入れて、mylib/full/path/to/class.phpOldlib_バージョンを拡張します。

アップグレードでは、lib /のプレフィックスをロールバックし、アップグレードして、プレフィックスを再適用し、オーバーライドフィクサーを再実行します。残っているのは、移動しlib/て以前に上書きされたものですが、それは問題とは関係ありません。あなたの問題はmylib /ディレクトリのファイルの数かもしれませんが、私はあなたがそれを解決できると信じています:)。


このアプローチは、特にアップグレードに関して、多くのリスクと物事を導入します。また、「コアに手を触れない」ルールを破ります。また、拡張機能の開発者にとって実行可能なオプションではありません。
beeplogic 14年

当然のことながら、ソリューションは機能しますが... a modernlibファイルを書き換える方法とは見なされません。命令型プログラミングは古い学校です;)
エディB

0

また、カスタムストリームを定義し、自動読み込みパスの上に追加することもできます。任意のオートローダーで動作し、最小限の導入が必要です。例を参照

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.