fuelphpのmodelに補完用のphpdocをつける

昔、fuelphpのoil自動生成でphpdocを自動で書くようにするという記事を書きましたが、これでもだんだん不満に思ってきて、より便利な物を作りました。 補完ができるのとできないのでは開発効率も違いますし、何よりストレスがかからなくなるので重要です。

前作ったものの不満点

ちょっとだけ作った経緯を書いておきます。 昔作ったものは自分でもいいなと思って作ったわけですが、

  • 既存のソースを変更する必要がある
  • modelを作成するときにしか使えない

と、案外不満点がありました。 しかし、FuelPHP、コード補完用コード生成コードの記事を見て、taskで作ればいいのかと思い、新たに作成しました。

補完するもの

作成したtaskは単純にmodelのクラス宣言の直前にphpdocをつけるだけのものです。 モデルフォルダのファイル一覧を撮ってきて、それぞれのファイルにphpdocを強制的につけます。 phpdocの中身としては、

  • モデルの持つpropertyの定義
  • forgeでの返り値の型がそのモデルになるようにforgeのメソッド定義

の2種類です。 おもに自分の環境(netbeans用)として作ってますが、phpdocは共通のはずなので phpdocをベースに補完してくれるどのエディタでも使えるはずです。

ソースコード

まえがきが長くなりましたが、こちらが作ったtaskです。 app/tasksの下にmodelproperty.phpで作ってください。

1
<?php namespace Fuel\\Tasks; class ModelProperty{ public static function run(){ $modelFiles = \\File::read_dir(APPPATH . "classes/model", 0, array( '\\.php$' => 'file', )); foreach($modelFiles as $filename){ if(is_string($filename)){ self::addProperty(APPPATH . "classes/model/",$filename); } } } public static function addProperty($dir,$filename){ $fileString = \\File::read($dir . $filename,true); $className = self::getClassName($fileString); if(!$className)return; $output = "<?php" . PHP_EOL; $output .= "/**" . PHP_EOL; $properties = $className::properties(); foreach($properties as $name => $detail){ $output.= ' * @property '; if(isset($detail['type'])){ $output .= $detail['type'] . " "; } $output .= '$' . $name . PHP_EOL; } $output .= " *" . PHP_EOL; $output .= ' * @method '.$className.' forge($data = array(), $new = true, $view = null)' . PHP_EOL; $output .= " **/" . PHP_EOL; $output .= "class"; $replacedString = preg_replace("/<\\\?php(.|\\n)*class/mi",$output, $fileString); \\File::update($dir,$filename,$replacedString); } private static function getClassName($string){ $matches = array(); preg_match("/class\\\s(\\\S+)\\\sextends/", $string, $matches); return isset($matches[1]) ? $matches[1] : NULL; } }

実行は単純に呼ぶだけで、引数等もありません。

1
php oil r modelproperty

注意点として、phpdocがすでに書かれていた場合上書きします。 phpdoc以外に<?phpとclass Model_xxxの間に何か書かれてた場合にはそれは消されます。 netbeansでfuelphpを使ってて補完ができない!といらいらする方、ご活用ください