PhpStormと僕

日々周りを巻き込むことをモットーに。気まぐれでJetBrains製のIDEネタとか書いてます。

「PhpStormで始める快適なWebアプリケーション開発」について話してきた #phpcon2013

先日のPHP Conference 2013でPhpStormの便利な機能とか、フレームワーク開発での小ネタとかについて話してきました。 限られた時間だったので矢継ぎ早になってしまって、こちらで詳細書いてみます。

PhpStorm × Framework

Symfony2

Symfony2 Plugin

強力なコード補完をサポートしてくれるSymfony2用のプラグインです。 xml/yamlファイル内でのジャンプとかもサポートしてくれます。

f:id:rinrin900:20130918123508p:plain

こんな感じで、サービスコンテナから取得したクラスに対してもコード補完してくれたりします。

詳しい設定や使い方はこちらが参考になります。

PhpStromのSymfony2 Pluginによる入力補完が便利すぎる

CakePHP

CakeStorm

私が個人的に作っているCakePHP用のプラグインです。1.3系、2系共に動きます。

Controller⇔View、View⇔Element、Model/Controller⇔TestCaseなどのファイル間ジャンプや$this->render()しているテンプレートファイルへのジャンプをサポートします。

f:id:rinrin900:20130918123636p:plain

f:id:rinrin900:20130918123642p:plain

詳細の使い方はこちらを参照してください。

PhpStormのCakePHPプラグイン、CakeStormを作ってみました

Laravel

Laravel IDE Helper Generator

一手間掛かりますが、上のHelperを設定しておくと各種クラスでのコード補完をしてくれます。

f:id:rinrin900:20130918123755p:plain

その他フレームワークなど

専用プラグインがないフレームワークでも、PhpDocをしっかり書けば特殊な呼び出し方をしているクラスからもコード補完してくれます。

例えば、CodeIgniterとかでは

f:id:rinrin900:20130918124108p:plain

@property Search_model $Search_model

のような形で、@propertyアノテーションを指定しておくと、

f:id:rinrin900:20130918124234p:plain

このように、$this->Search_modelのような呼び出しの形でもコード補完してくれます。

PhpStormで便利な機能

便利機能はめちゃくちゃ多いんですが、「高機能すぎて把握しきれない・・・」というような方は多いと思います。 そこで、個人的によく使うコマンドや、 マイナーだけど便利だなーって思う機能を幾つか紹介します。

また、機能は全てアクションの正式名称のまま表記しているので、 気になったショートカットなどは[Preferences]-[Keymap]から検索するとすぐ見つかると思います。

機能名の横の()はWindows環境でのデフォルトショートカットを表しています。

Find Action (Ctrl+Shift+A)

PHPエンジニア養成読本でいうところの「最強コマンド」です。 PhpStorm内で実行したいアクションをここで入力すると、それにマッチする or 近しいアクションを一覧で表示してくれます。 なので、各機能ごとのショートカットを覚えきれなくても、このコマンドのショートカットさえ覚えておけば一通りのことが可能になります。

例えば、GitにPUSHしたいときはCtrl+Shift+A → "push"と入力すると

f:id:rinrin900:20130918124641p:plain

このようになり、置換や一括置換を行いたいときはCtrl+Shift+A → "replace"と入力すると

f:id:rinrin900:20130918125204p:plain

このような形で、実行可能なアクションを一覧で表示してくれます。

Jump to Class (Ctrl+N) / Jump to File (Ctrl+Shift+N)

それぞれクラス名やファイル名を指定して直にファイルにジャンプ出来る機能です。 1文字入力毎にファイル一覧を高速でサジェストしてくれます。 個人的にはJetBrains系IDEの醍醐味と言っても過言ではないくらいの超有用機能だと思います。 ちなみにPhpStorm7からファイルのサジェストが超高速になってます。

f:id:rinrin900:20130918124727p:plain

f:id:rinrin900:20130918125247p:plain

それぞれ"Account"という単語を、上がJump to Class、下がJump to Fileで絞り込んだ状態です。 機能の名前の通り、Jump to Classはクラス名にAccountが含まれるファイル、 Jump to Fileはファイル名にAccountが含まれるファイルを一覧で表示してくれます。

Go to Decralation (Ctrl+B)

変数やクラス、メソッドの定義元にジャンプする機能です。Vim界でいうところの"gf"コマンドに相当します。

例えば、CakeEventクラス上のCtrl+Bを押すことにより、CakeEventクラスの定義箇所までジャンプすることが出来ます。 同様にメソッドや変数も、参照可能な範囲であればジャンプ出来ます。

f:id:rinrin900:20130918125848p:plain

f:id:rinrin900:20130918125521p:plain

Recent Files (Ctrl+E)

PhpStorm上で直近に開いたファイル履歴を表示してくれます。 普段開発をしていると同じようなファイルを何回も行き来することは多いので、使用頻度はかなり高めです。

類似コマンドでRecent Changed Filesというものもあり、こちらは「直近に編集したファイル」履歴を表示してくれるので、用途を分けて使い分けるといいです。

f:id:rinrin900:20130918130142p:plain

自動アップロード

f:id:rinrin900:20130918130608p:plain

私は「ローカルのMac上でPhpStormを立ちあげて開発」、「開発用のサーバにコードを置いて実行」のようなスタイルで開発していますが、 ファイルを編集する度に手動でアップロードしなければならないのは死ぬほど苦痛です。

PhpStorm上では、"ファイルに差分が発生したら自動的にアップロード"してくれる機能があるので、そちらを設定しておくと便利です。

f:id:rinrin900:20130918131024p:plain

上記なように、サーバに合わせた形でDeployment Serverを設定しておき、 [Tools]-[Deployment]-[Automatic Upload(always)]にチェックを入れておけばokです。

また、Git上でブランチを移動した際に、ブランチの差分ファイルのみを自動アップロードしてくれる機能もあります。 その際は、以下のように[Tools]-[Deployment]-[Options]から[Upload external changes]にチェックを入れておけば有効になります。

f:id:rinrin900:20130918131436p:plain

Local History

PhpStorm上で編集したファイルを、ファイル毎に時系列で編集履歴を閲覧することが出来ます。 「Gitにコミットしてなかったけど、今朝の時点に戻したい・・・」みたいなときにも便利です。 また、こういう機能があることを知っておくだけでもいざというときの保険になりますので是非押さえておきましょう。

f:id:rinrin900:20130918131728p:plain

リモートデバッグ

EclipseNetbeansなどのIDEと同様、PhpStormでもリモートデバッグが可能です。 面倒な設定がほぼ不要なのと、コードの動的実行が可能な点が他より優れています。

f:id:rinrin900:20130918132216p:plain

リモートデバッグの設定についてはこちらが参考になります。

Zero-configuration Web Application Debugging with Xdebug and PhpStorm

コードの動的実行は、「ブレイクポイントで停止した箇所で任意のPHPコードを実行出来る」機能です。 どんな形式で返ってくるのか試したい関数や、複雑なコードでどういう途中結果が帰ってきてるのか知りたいような場合に便利です。 もちろん、停止箇所で保持している変数を参照して実行することも可能です。

例えば、CakePHPではfind()メソッドでDatabaseから任意のデータを取得出来ますが、「取得条件を変えた時にどんな値が返ってくるのか試したい」みたいなことは多々あります。 そのようなときは、任意の箇所をブレークポイントを貼って止めておき、実行中のプラグラムで

$this->Search->find('all', array(
        'contain'    => false,
        'conditions' => array(
          'Search.created <' => $today
        )
      ));

のような箇所を選択し、[Evaluate Expression]のコマンドを実行すると

f:id:rinrin900:20130918133042p:plain

このような形で実行結果が見れます。