以前、PhpStormでSilexのコード補完(2)に続き、3回めの記事です。
前回、前々回で、
- $appのキー補完
- FormTypeやQueryBuilderの補完
が出来るようになりました。
今回は、PhpStormのAdvanced Metadata という補完の仕組みを使って、EC-CUBEのフックポイントで引数として渡ってくる$event
を補完してみようと思います。
環境
PhpStorm 2016.3 を使ってます。
Advanced Metadataとは
いわゆるサービスロケータなメソッドに対し、引数の文字列に応じて返却する型を指定できる仕組みです。これにより、/** @var XXX $var */
としなくてもコード補完が効くようになります。
設定を書いてみる
プロジェクトのルートディレクトリに、.phpstorm.meta.php
というファイルを作成します。
ここでは、$event->getArgument('Product');
が呼び出されたときに, 戻り値の方がEccube\Entity\Product
になるように指定しています。
<?php
namespace PHPSTORM_META {
// \Eccube\Event\EventArgs::getArgument()メソッドを指定
override(\Eccube\Event\EventArgs::getArgument(0), // (0)は固定
map([
// getArgumentの引数が`Product`のときはProductのエンティティである、と指定
'Product' => \Eccube\Entity\Product::class,
]));
}
.phpstorm.meta.php
を作成すると、以下のようなコードで、コード補完が行われるようになります。
.phpstorm.meta.phpのサンプル
フックポイントでよく出てくる引数をまとめてみました。よければ使ってみて下さい。
<?php
namespace PHPSTORM_META {
override(\Eccube\Event\EventArgs::getArgument(0),
map([
'Product' => \Eccube\Entity\Product::class,
'ProductClass' => \Eccube\Entity\ProductClass::class,
'Parent' => \Eccube\Entity\Category::class,
'TargetCategory' => \Eccube\Entity\Category::class,
'Order' => Eccube\Entity\Order::class,
'OriginOrder' => \Eccube\Entity\Order::class,
'TargetOrder' => \Eccube\Entity\Order::class,
'Shipping' => \Eccube\Entity\Shipping::class,
'Customer' => \Eccube\Entity\Customer::class,
'CustomerAddress' => \Eccube\Entity\CustomerAddress::class,
'form' => \Symfony\Component\Form\FormInterface::class,
'builder' => \Symfony\Component\Form\FormBuilderInterface::class,
'qb' => \Doctrine\ORM\QueryBuilder::class
]));
}