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を有効にする方法はほかにもあるようなので、そのうち調べてみたい。