21
24

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

FuelPHP + PhpStorm でプロパティー(メンバ変数?)も含めてコード補完を(強引かも)出来るようにする

Last updated at Posted at 2014-08-08

FuelPHP + PhpStorm で code completion したい。自作したクラス(モデルとか)のプロパティーも含めて!

また、間違いや、もっと良い方法がある気もします。もし、何かあればツッコミを頂けると嬉しいです!

FuelPHP 自体のクラスをコード補完

bulblubさんの PhpStormでFuelPHPのクラス補完を有効にする方法 や、kenjisさんの Eclipse で FuelPHP のコード補完を行わせる冴えたやり方 などで、 FuelPHP 自体の各種クライスはコード補完が効くようになります。

便利!

それっぽい単語を打つと、自動補完してくれるので、学習コストが低くて済みますね。IDE 使う意味の一つですね。

FuelPHP + PhpStorm でプロパティーも含めたコード補完がしたい!

例えば、以下の様なモデルを作ったとします。

$ oil g model user email:varchar[255] password:varchar[255] salt:varchar[255] screen_name:varchar[255] status:integer --soft-delete --mysql-timestamp

そうすると、以下の様なファイルが出来上がるはず。

./fuel/app/model/user.php
<?php

class Model_User extends \Orm\Model_Soft
{
	protected static $_properties = array(
		'id',
		'email',
		'password',
		'salt',
		'screen_name',
		'status',
		'deleted_at',
		'created_at',
		'updated_at',
	);
// (略)
}

この Model_User は PhpStorm でちゃんとコード補完されます。

こんなふうに。

Model_User がちゃんとコード補完されている

これだけでも嬉しいのですが、出来れば、プロパティもコード補完して欲しい。

たとえば、以下の様な状態($user_ore->sc まで打った状態)で、コード補完に"screen_name"が出てきて欲しいわけです。

./fuel/app/classes/controller/user.php
$user_ore = Model_User::find('first', array(
	'where' => array(
		'screen_name' => 'ore',
	),
));
$user_ore->sc

実際にこのコード補完を(強引にですが)行う方法は後述として、先に結果を載せると、以下の画像のような事を実現したいわけです!

ちゃんと補完されてる!

これで、 View 内とか、 Controller 内とか、 Model 内で他のモデル参照する時とか、なんだったらリレーションも含めて、ガシガシ書いていくのが捗りそう!

な、気がします。

また、 Git へのコミット時なども PhpStorm がコードレビューする時に、ちゃんと検査が通っているかを(ある程度)示してくれるので、 PhpStrom の Review 機能がちゃんと役立つようになります!これは嬉しい!!

で、それを(強引に)実現する方法を検討してみました。

FuelPHP + PhpStorm で自作クラス(モデルなど)のプロパティーもコード補完する方法

結論から書くと、"コード補完専用のファイルを用意してアノテーションを使いましょう!"です。

例えば、以下の様なファイル(ファイル名はお好きに)を用意します。

./__auto_completion.php
<?php
/**
 * Class Model_User
 */
class Model_User {
	/** @var string Screen Name */
	public $screen_name;
}

これだけ。

これで、 (先ほどと同じ)以下の画像の様な自動補完が効くようになります。

ちゃんと補完されてる!

プロパティーに対するアノテーションの書き方

/** @var (ココに型を書きます) (ここに説明文を書きます) */

で、あってるはず。。

型の部分が大切です。

string, int, array, boolean, double, float, などなど。

例えば、 has_many なリレーションのプロパティーの場合のアノテーションの書き方

Model_User は、 has_many Model_Thread だったとします。

$some_user->threads という状況です。

これも自動補完して欲しい。

そんな場合は、以下のように書いておきます。

※ oil コマンドで生成したその他のプロパティーも同様に書いておくと良いですが、とりあえず参考までに記載していません。

./__auto_completion.php
/**
 * Class Model_User
 */
Class Model_User {

	/** @var string Screen Name */
	public $screen_name;

	/** @var Model_Thread[] Thread */
	public $threads;
}

大切なのは、"[]"部分です。

これで、$user_ore->thrまで書けば、threadsが正しくModel_Thread[]としてコード補完されます。

ちゃんと補完されてる!

※複数の型を保持する可能性がある時は、/** @var Model_Hoge|array Model_Hogeの配列かnullを返します */の様に書きます。

同様に、./__auto_completion.php に Model_Thread のアノテーションも書いておけば、それもちゃんと補完されます。(当然ですが。)

例えば以下のようにします。

./__auto_completion.php
<?php
/**
 * Class Model_User
 */
class Model_User {

	/** @var string Screen Name */
	public $screen_name;

	/** @var Model_Thread[] Thread */
	public $threads;
}

class Model_Thread {

	/** @var Model_User User */
	public $user;

	/** @var string Thread Title */
	public $title;
}

すると、以下の図のようにコード補完されます。

補完されてる!

__auto_completion.php に追記したように、 title も user もありますね。

で、 ./__auto_completion.php の Model_Thread 側に、 $user の型が Model_User であることをアノテーションで示しているため、以下の図ように、$thread->user->もちゃんと、 Model_User のアノテーションが効いて補完されます。

ちゃんと補完されてる!

これで、ずいぶんと書くのが楽になりそうです。

View 内でもコード補完されるようにしたい!

ただ、このままだと、 views 内では、コード補完されません。

以下の図のように、コード補完が効きません。

$user が黄色いし、 $item->e まで打っても何も出ない。。

コード補完されてない

これは、パスの設定とかの解決もありそうですが、手っ取り早く、アノテーションで解決してしまおうと思います。

で、どうするかというと、以下の様なアノテーションを追記します。

<?php /** @var Model_User[] $users */ ?>
<h2>Listing <span class='muted'>Users</span></h2>

これを追記すると以下の図のように、ちゃんとコード補完されるようになります。

ちゃんと補完されてる!

便利!

この1行を書くだけで、 View 内でもガシガシ書けそうな気がします!

また、__auto_completion.phpの中で、ちゃんとプロパティーの型を指定しておくと、表示が妥当かとか、その関数やメソッドへの引数には型が一致せんで!とか、諸々も PhpStorm が教えてくれます!

便利!

$item->email が補完されているのは、__auto_completion.php に書いておいたからですが、今までの説明では省略しています。

プロパティーのアノテーションとの違いに注意しましょう

/** @var (ココに型を書きます) (ここに変数名を書きます) */

"変数名"を書きましょう。

説明文ではないです。

書いてみるとあわかりますが、変数名部分の背景色がハイライトされます。

アノテーションで強引に実現している副作用

少しだけ気になる副作用が出てしまいます。

先ほどの View 内のアノテーション上にカーソルを持って行くとMultiple definitions exist for class...と出ますね。

Multiple definitions exist for class...

複数箇所で定義されとるよ?というアナウンスです。

出来ることならば、この辺りも出ないようにちゃんとコード補完されるのが望ましですが、それは Plug-in を開発すれば解決するんやろうなーとか思ってます。

とりあえず、害はないしいいや。という感じなのが"強引に実現"なん気がしてます。

アノテーション自体を書くときも PhpStorm に楽をさせてもらう方法

上記のように、アノテーションを使うと便利です。

で、アノテーション自体を書くときも PhpStorm は便利です。

例えば、プロパティーのアノテーションを書く時は以下の順番で書くようにすると良さげです。

  1. まず、プロパティーである public $hoge; を書く
  2. 次に、上の行に移動して、/**まで書いてから、半角スペースを押す
  3. すると、自動的に/** @var (この位置にカーソルが居る) */という状態で、アノテーションの書き始め状態となる

※複数行のアノテーションがお好きなら、上記の 2. にて、半角スペースではなく、改行すると自動的に複数行のアノテーションになります。

その他・まとめきれてないもの

なんで、 Model_User 自体に書かないのかの説明は省略。(まぁいいよね。)

Model のプロパティーに Observer_Typing 用の data_type が指定されていれば、 Task とか作って、型を判断して、アノテーションを詰め込んだ __auto_completion.phpを自動生成も可能だなーとか思ってます。

なんだったら、 oil を拡張するほうが楽かもなーとか。(※他にも oil コマンダの特に generate には少し足りない感があるし。)

なんか、他にも書くべきことがある気がするんですが、とりあえず、今はココまで。

21
24
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
24

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?