PhpStormでautocompleteを有効にする方法(CodeIgniter3利用時)
PHP FrameworkにCodeIgniter3を採用したプロジェクトをPhpStorm(ver.9.0.2)で編集している。PhpStormのメソッド・プロパティ補完機能(autocomplete機能)はとても便利で、コード記述を強力にサポートしてくれる。また、定義にジャンプする機能もコードの実装を追うのにとても有益だ。
参考:
しかしCodeIgniterの機能を使ったソースコードは思うように補完機能が働かない。
CodeIgniterではModelやContorollerでクラスを利用する時にローダーを利用するが、$this->load
するとインスタンスは$this->xxx
にセットされ、$this->xxx->func
のように利用する。
このとき「$this->xxx
」が何者なのかPhpStormは分からないのだろう。
PhpStormでCodeIgniterのautocompleteを有効にする方法がないか調べてみた。
ClassのPHPDocコメントを追加する
幸いPhpStormはソースコード中のPHPDocコメントから変数の型を取得する機能がある。 ClassのPHPDocコメントに@property
でメンバの型を追加すればよい。
以下の例ではPhpStormは $this->blog_model
をClass 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');
}
}
参考:
PHPDocを追加した後であれば、定義にジャンプ( Go To | Declaration )可能だ。COMMAND(CTRL)+Bが便利になる。
局所的な変数に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();
$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->db
は CI_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-> // ココで補完ができる。
}
ちゃんと候補が表示された。
プロジェクト全体の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 )可能。
すべて完ぺきというわけではないけど、かなり便利になった!
未調査だが、PhpStorm以外のIDEでも有効な気がする。
Autocompleteを有効にする方法はほかにもあるようなので、そのうち調べてみたい。