PHP Composer用のプラグインを作成する

Magento Composerを使用して Magentoアプリケーションをデプロイする場合、同じアプリケーション(開発、テストなど)の異なるインスタンスが異なるローカル設定(データベース接続設定など)を使用する必要があるという問題がありました。 それ以前は、別のプロジェクトで、アプリケーション(バージョン管理下)にプレースホルダーとプレースホルダーをローカル値で置き換えて結果を適切な場所にコピーするスクリプトを含む構成ファイルテンプレートが含まれる場合にアプローチが使用されました。 ローカル値は、デプロイの場所でインスタンスごとに個別に保存されました。 新しい展開方法については、使い慣れたアプローチを維持したかったのです。 packagist.orgでの適切なプラグインの検索は、そのようなプラグインを独自作成するアイデア見つけることできずに終了しました。 プラグインを作成するとき、さまざまなソースから情報をプルする必要がありました-プラグインのComposerサイトからの情報では不十分でした。 それがこの記事の執筆につながりました。



composer.json



プラグインパッケージのメインファイルは次のようになります。

{ "name": "praxigento/composer_plugin_templates", "type": "composer-plugin", "require": { "composer-plugin-api": "1.0.0" }, "autoload": { "psr-4": { "\\Praxigento\\Composer\\Plugin\\Templates\\": "src/" } }, "extra": { "class": "\\Praxigento\\Composer\\Plugin\\Templates\\" }, "scripts": { "test": "phpunit" } }
      
      







nameパラメータはあなたの好みに合わせて設定されています。praxigento / composer_plugin_templatesを取得しました



タイプ必要なパラメーターを使用すると、すべてが非常に明確なります。



autoload.psr-4パラメーターは、 PSR-4に従ってプラグインクラスの自動ロード構成を決定します( PSR-0は 2014年10月21日廃止されたため、この標準を使用することをお勧めします)。 この設定に従って、ソースは./src/サブディレクトリにあります。



extra.classパラメーターは、 Composer(またはパラメーター値が配列の場合はクラスのセット)によってロードされるプラグインのメインクラスを定義します。



scripts.testパラメーターを使用すると、コマンドライン「 $ composer test 」からプラグインテストを実行できます



エントリーポイント



extra.classで指定されたクラスは、Composerのプラグインへのエントリポイントです。 Composerの要件に従って、このクラスはComposer \ Plugin \ PluginInterfaceインターフェイスを実装する必要があります。



 namespace Praxigento\Composer\Plugin\Templates; use Composer\Composer; use Composer\IO\IOInterface; use Composer\Plugin\PluginInterface; class Main implements PluginInterface { protected $composer; protected $io; public function activate(Composer $composer, IOInterface $io) { $this->composer = $composer; $this->io = $io; } }
      
      







パラメータアクセス



プラグイン操作パラメーターは、プラグインが使用されるメインパッケージのcomposer.jsonの 追加セクションを介して構成されます。

 { "name": "vendor/package", "type": "project", "repositories": [ { "type": "vcs", "url": "https://github.com/praxigento/composer_plugin_templates" } ], "require": { "praxigento/composer_plugin_templates": "*" }, "extra": { "praxigento_templates_config": "./instance_cfg.json" } }
      
      







プラグインは、 プロジェクト構成ファイル( composer.json )のextra.praxigento_templates_configパラメーターを介して設定されるファイルから、その作業の設定を取得する必要があります。 プラグインが初期化されたときにこれを行います:

 class Main implements PluginInterface, EventSubscriberInterface { public function activate(Composer $composer, IOInterface $io) { $this->composer = $composer; $this->io = $io; $extra = $composer->getPackage()->getExtra(); $configFile = $extra['praxigento_templates_config']; } }
      
      







イベント処理



プラグインの実装では、 イベントに応答する必要がありました





このため、エントリポイントはEventSubscriberInterfaceインターフェイスも実装し、対応するイベントをサブスクライブし、ハンドラーを登録する必要があります。

 class Main implements PluginInterface, EventSubscriberInterface { public static function getSubscribedEvents() { $result = array( ScriptEvents::POST_INSTALL_CMD => array( array( 'onPostInstallCmd', 0 ) ), ScriptEvents::POST_UPDATE_CMD => array( array( 'onPostUpdateCmd', 0 ) ), ); return $result; } public function onPostInstallCmd(CommandEvent $event) { } public function onPostUpdateCmd(CommandEvent $event) { } }
      
      







テストを実行する



PhpUnitはcomposer.jsonで接続されています:

 { "require-dev": { "phpunit/phpunit": "4.4.*" } }
      
      







単体テストの設定-phpunit.xml.distファイル内:

 <?xml version="1.0" encoding="UTF-8"?> <phpunit backupGlobals="false" backupStaticAttributes="false" colors="true" convertErrorsToExceptions="true" convertNoticesToExceptions="true" convertWarningsToExceptions="true" processIsolation="false" stopOnFailure="false" syntaxCheck="false" bootstrap="phpunit.bootstrap.php" > <testsuites> <testsuite name="Plugin Test Suite"> <directory suffix="_Test.php">./src/</directory> </testsuite> </testsuites> </phpunit>
      
      







phpunit.bootstrap.phpスクリプトで、PSR-4と互換性のあるオートローダーをダウンロードします(それなしではテストはPhpStorm IDEから起動されません)。

 require __DIR__.'/vendor/autoload.php';
      
      







composerを介したテストの実行:

 $ composer test
      
      







おわりに



この情報は、Composer用の独自のプラグインを作成するのに十分なはずです。 最後まで読んでくれたみんなに感謝します。



All Articles