Pimpleの内容物にプロパティとしてアクセス&PhpStormの入力補完を効かせる
Posted: Updated:
Pimpleで配列アクセスするのだるい
すごくだるい。PhpStormの入力補完をアテにしていて、それが効かない構文だからなおのことだるい。
// 入力補完がカケラも効かない $app['autoloader']->registerNamespace($ns, $pathTo);
enキーボードでチョロまかしてるから幾らかマシですが、jpキーボードだったら更にタイプしづらいんじゃないでしょうか。泣ける。
下のようにやれば部分的には補完効くけどありえない。
/* @var \Symfony\Component\ClassLoader\UniversalClassLoader $autoloader */ $loader = $app['autoloader']; $app->registerNamespace($in, $pathTo);
鳴かぬなら・・・
改造してしまおう
題材はSilex\Applicationです。
Pimpleの$this->valuesを上書きして、ArrayAccessの実装メソッド類もすべて自前のものとしてオーバーライドします。実装の中身はコピペ。
そして、__get
をoffsetGet
のエイリアスにしてやれば、内容物にプロパティとしてアクセスできます。
// ぬるいほうがいいんだ!! $app->autoloder->registerNamespace($ns, $pathTo);
コメントには、@property
を加えてやることで内容物の型も指定できるので、バッチリ入力補完が効くようになります。(PhpStorm 3.03で確認)あとは都度、ServiceProviderも突っ込んでいけばいいですね。
サンプル
<?php namespace Acme; /** * @property \Symfony\Component\ClassLoader\UniversalClassLoader$autoloader * @property \Symfony\Component\Routing\RouteCollection $routes * @property \Silex\ControllerCollection $controllers * @property \Silex\ExceptionHandler $exception_handler * @property \Symfony\Component\EventDispatcher\EventDispatcher $dispatcher * @property \Silex\RedirectableUrlMatcher $url_matcher * @property \Silex\ControllerResolver $resolver * @property \Symfony\Component\HttpKernel\HttpKernel $kernel * @property \Symfony\Component\Routing\RequestContext $request_context */ class Application extends \Silex\Application { /* * Override Pimple's ArrayAccess implementation */ protected $values = array(); public function __get($id) { return $this[$id]; } public function offsetSet($id, $value) { $this->values[$id] = $value; } public function offsetGet($id) { if (!array_key_exists($id, $this->values)) { throw new \InvalidArgumentException(sprintf('Identifier "%s" is not defined.', $id)); } return $this->values[$id] instanceof \Closure ? $this->values[$id]($this) : $this->values[$id]; } public function offsetUnset($id) { unset($this->values[$id]); } public function offsetExists($id) { return isset($this->values[$id]); } } ?>
色々アレ
彼方からお叱りの声が聞こえてきそうですが、まあ、満足。