PhpStormでautocompleteを有効にする方法(CodeIgniter3利用時)

PHP FrameworkにCodeIgniter3を採用したプロジェクトをPhpStorm(ver.9.0.2)で編集している。PhpStormのメソッド・プロパティ補完機能(autocomplete機能)はとても便利で、コード記述を強力にサポートしてくれる。また、定義にジャンプする機能もコードの実装を追うのにとても有益だ。

参考:

Code Completion - Help | PhpStorm

しかしCodeIgniterの機能を使ったソースコードは思うように補完機能が働かない。
CodeIgniterではModelやContorollerでクラスを利用する時にローダーを利用するが、$this->loadするとインスタンスは$this->xxxにセットされ、$this->xxx->funcのように利用する。
このとき「$this->xxx」が何者なのかPhpStormは分からないのだろう。

autocomplete not working no suggestions

PhpStormでCodeIgniterのautocompleteを有効にする方法がないか調べてみた。

ClassのPHPDocコメントを追加する

幸いPhpStormはソースコード中のPHPDocコメントから変数の型を取得する機能がある。 ClassのPHPDocコメントに@propertyでメンバの型を追加すればよい。
以下の例ではPhpStormは $this->blog_modelClass Blog_modelと認識してくれる。

/** * Class Welcome * * <strong>@property Blog_model $blog_model</strong> */ class Welcome extends CI_Controller { public function __construct() { parent::__construct(); $this->load->model('blog_model'); } public function index() { $this->blog_model-> // ココで補完ができる。 $this->load->view('welcome_message'); } }
add phpdoc comment @property Blog_model $blog_model

参考:

PHPDoc Comments - Help | PhpStorm

PHPDocを追加した後であれば、定義にジャンプ( Go To | Declaration )可能だ。COMMAND(CTRL)+Bが便利になる。

Go to Declaration - Help | dotPeek

局所的な変数にPHPDocコメントを付与する

次のような書き方でも補完することができた。局所的で良ければ、これもありかも知れない。

public function index() { /** * @var Blog_model $blog_model */ $blog_model =& $this->blog_model; $blog_model-> // ココで補完ができる。 $this->load->view('welcome_message'); }

$this->db の型

CodeIgniterでは$this->load->database(); で$this->dbがセットされるが、このdbの型は何だろう?
CodeIgniterのソースコードを追ってみたが、動的にCI_DBが宣言されていたりして分かりにくい。 なので飛び道具的だが、PhpStormのデバッグセッションでステップ実行し、CodeIgniterのSingletonの中身を見てみた。

$ci =& get_instance();
db_class_debug_inspection
$ci = {Welcome} [15]
 *CI_Controller*instance = null
 benchmark    = {CI_Benchmark} [1]
 blog_model   = {Blog_model} [3]
 config       = {CI_Config} [3]
 db           = {CI_DB_mysqli_driver} [73]
 hooks        = {CI_Hooks} [4]
 input        = {CI_Input} [10]
 lang         = {CI_Lang} [2]
 load         = {CI_Loader} [10]
 log          = {CI_Log} [8]
 output       = {CI_Output} [10]
 router       = {CI_Router} [9]
 security     = {CI_Security} [9]
 uri          = {CI_URI} [6]
 utf8         = {CI_Utf8} [0]

すると、どうやら、$this->dbCI_DB_mysqli_driver のようだ。ただし、application/conf/database.phpのdbdriverの設定に依存するだろう。 CI_DB_mysqli_driver の継承はこんな感じだ。

CI_DB_driver CI_DB_query_builder CI_DB CI_DB_mysqli_driver

というわけで、これもPHPDocに追加。

/** * Class Blog_model * * @property CI_DB_mysqli_driver $db */ class Blog_model extends CI_Model { public $title; public $content; public $date; public function __construct() { // Call the CI_Model constructor parent::__construct(); $this->load->database(); } public function get_last_ten_entries() { $query = $this->db-> // ココで補完ができる。 }

PhpStorm CodeIgniter3 $this->db  autocomplete
ちゃんと候補が表示された。

プロジェクト全体のcontroller、modelで有効にする

Controller、Modelに毎回PHPDocコメントを追加するのは手間である。 調べてみると、autocomplete.php を配置して全体に有効にする方法があった。

Stunt/Codeigniter-autocomplete

ここのconfig/autocomplete.php を自分のプロジェクトに入れると、プロジェクト全体のControllerやModelで$this->xxxが解決されている。
ただし、いくつか注意点が必要だ。

  • 自分で作成したModelやLibraryは@property Your_lib $your_lib に追記必要

  • CodeIngter3用に少し書き直しが必要。

参考:Upgrading from 2.2.x to 3.0.x

  • codeigniter3.0
<?php // help IDE(s) support Codeigniter 2.0 /** * <del>@property CI_DB_active_record $db</del> * @property CI_DB_mysqli_driver $db * ・ * ・ * ・ */

というわけで、使っているのはこちら。

  • 追記 2015.10.26)もっとたくさん網羅しているのはこちらへ。

  • 追記 2015.10.26)dbがwhereなどを候補表示してくれない。CI_DB_mysqli_driverの派生関係を追加。

CodeIgniter Autocomplete v1.0.0 bj1024/Codeigniter-autocomplete: Autocomplete support for Codeigniter within your IDE

  • codeigniter3.0用 application/config/autocomplete.php
<?php // help IDE(s) support Codeigniter 3.0 /** * @property CI_DB_mysqli_driver $db * @property CI_DB_forge $dbforge * @property CI_Benchmark $benchmark * @property CI_Calendar $calendar * @property CI_Config $config * @property CI_Controller $controller * @property CI_Email $email * @property CI_Encrypt $encrypt * @property CI_Exceptions $exceptions * @property CI_Ftp $ftp * @property CI_Hooks $hooks * @property CI_Image_lib $image_lib * @property CI_Input $input * @property CI_Lang $lang * @property CI_Loader $load * @property CI_Log $log * @property CI_Model $model * @property CI_Output $output * @property CI_Pagination $pagination * @property CI_Parser $parser * @property CI_Profiler $profiler * @property CI_Router $router * @property CI_Session $session * @property CI_Table $table * @property CI_Typography $typography * @property CI_Unit_test $unit_test * @property CI_Upload $upload * @property CI_URI $uri * @property CI_User_agent $user_agent * @property CI_Form_validation $form_validation * @property CI_Zip $zip * * @property Your_lib $your_lib */ class CI_Controller{}; class MY_Controller extends CI_Controller{}; class CI_DB extends CI_DB_query_builder{}; /** * @property CI_DB_mysqli_driver $db * @property CI_DB_forge $dbforge * @property CI_Config $config * @property CI_Loader $load * @property CI_Session $session * * @property Your_lib $your_lib */ class CI_Model{}; /* End of file autocomplete.php */ /* Location: ./application/config/autocomplete.php */

その他

PhpStormではコメント中の@property クラス名 $変数 でもクラス定義にジャンプ( Go To | Declaration )可能。

classjump

すべて完ぺきというわけではないけど、かなり便利になった!

未調査だが、PhpStorm以外のIDEでも有効な気がする。

Autocompleteを有効にする方法はほかにもあるようなので、そのうち調べてみたい。