Phalcon開発を加速させる、phalcon-devtoolsの使い方
こんにちは。
開発チームのワイルド担当、まんだいです。
phalconは、PHP自体にphalcon.soを読み込んで使う、フレームワークのコア部分がPHPファイルとして存在しない、なかなか珍しいフレームワークです。
この形態こそが、フレームワーク最速の理由なんですが、オープンソースに慣れ親しんだ者としては、実体がないぶん、最初とっつきにくい印象を受けました。
そんなphalconに、CakePHPでいうところのbake、FuelPHPでいうところのoilのようなコマンドを提供するのが、今回紹介するphalcon-devtoolsになります。
phalcon-devtoolsのインストール
phalcon-devtoolsのインストールは非常に簡単です。
以前のブログに、phalcon-devtoolsのインストール方法はまとめてありますので、こちらをご確認ください。
今回検証したdevtoolsのバージョンは、Phalcon DevTools (3.0.4) となります。
phalconコマンドでできる事
phalconコマンドでは、以下の文字列を第一引数に据えることで様々な事ができます。
- info (alias of: i)
- commands (alias of: list, enumerate)
- controller (alias of: create-controller)
- module (alias of: create-module)
- model (alias of: create-model)
- all-models (alias of: create-all-models)
- project (alias of: create-project)
- scaffold (alias of: create-scaffold)
- migration (alias of: create-migration)
- webtools (alias of: create-webtools)
ひとつずつ見ていきましょう!
phalcon info コマンド
このコマンドは、phalconの実行環境情報を表示します。
私の手元で実行した時の結果は以下のようになりました。
Environment:: OS: Linux localhost.localdomain 3.10.0-514.6.1.el7.x86_64 #1 SMP Wed Jan 18 13:06:36 UTC 2017 x86_64 PHP Version: 7.0.15 PHP SAPI: cli PHP Bin: /usr/bin/php PHP Extension Dir: /usr/lib64/php/modules PHP Bin Dir: /usr/bin Loaded PHP config: /etc/php.ini Versions:: Phalcon DevTools Version: 3.0.4 Phalcon Version: 3.0.3 AdminLTE Version: 2.3.6
phalcon project コマンド
新しいプロジェクトを作成します。
新しいシステムを作る場合は、まずこのコマンドから始める事になります。
--name | プロジェクト名 |
---|---|
--enable-webtools | webtoolを利用可能な状態にするかどうか。webtoolsについては後ほど。 |
--directory=s | 指定したパスに --name で指定したディレクトリを作成してプロジェクトを展開する (default ./) |
--type=s | phalconのアプリケーションタイプを選択
|
--template-path=s | オプションなしの場合は、phalcon-devtools付属のテンプレートを使って初期ファイル群を構築
オリジナルのテンプレートを作る際は、付属のものを土台にして作るといい様子 |
--use-config-ini | 付けると app/config/config.php が config.ini になる |
--trace | 不明 |
--help | オプションリストの表示 |
--type=modulesの場合、デフォルトでフロント + cliという組み合わせのモジュール構成で作成されます。
phalcon project以外のコマンドは、phalconプロジェクト外(正確には、--directoryで書き換えられた後のパス)で実行すると、以下のエラーが発生します。
Error: This command should be invoked inside a Phalcon project directory.
この判定に使うため、「phalcon project」コマンドで作成されたプロジェクトには「.phalcon」というディレクトリが含まれています。
phalcon module コマンド
こちらのコマンドは phalcon project のように、ベースになるディレクトリパスなどの設定がないため、phalconのプロジェクトディレクトリ内で実行する必要があります。
--name | 新たに追加するモジュール名 |
---|---|
--namespace=s | Module.phpのネームスペースを追加します |
--output=s | modulesディレクトリのパスを指定します。オプション扱いになっていますが、指定しないとエラーになるので必須と考えていいと思います
phalcon module --name module1 --output=./app/modules |
--config-type=s | コンフィグファイルのファイルタイプの設定です。デフォルトはphpですが、その他の形式も選択可能です
|
--template-path=s | モジュール作成時のテンプレートファイルを収めたディレクトリパスを指定します。基本のテンプレはdevtoolsのmoduleディレクトリにあります |
--help | オプションリストの表示 |
phalcon controller コマンド
プロジェクトディレクトリ直下でこのコマンドを実行しても、「Error: This command should be invoked inside a Phalcon project directory.」というエラーが発生するので、--outputオプションは必須のような気がします。
--name=s | コントローラー名を指定します。プロジェクトをtype=simple(もしくは指定なし)で作った場合は、こちらのオプションのみでコントローラーを作成できます |
---|---|
--namespace=s | コントローラーのネームスペースを指定します |
--directory=s | コントローラーが含まれるプロジェクトへのパスを入力します。最後のスラッシュを忘れると上手く動かない模様 |
--output=s | コントローラーを置くディレクトリパスを指定します。モジュール構成の場合は必須です |
--base-class=s | 継承元クラスを設定します。use演算子を使用したりしないので、名前空間も含めて記載する必要があります |
--force | 指定したコントローラーが既にあっても上書きして作成します |
--help | オプションリストの表示 |
phalcon model コマンド
各種モデルにまつわる機能が収められたコマンドです。
このコマンドを実行する前に、config/config.php内のDBアクセス設定を済ませておく必要があります。
ハイフン入りのフィールドを持つテーブルのモデルを作成すると、作成自体はできますが、PHP側のルールとして、クラスプロパティにハイフンを名前として使えないというエラーが発生します。
PHP Parse error: syntax error, unexpected '-', expecting ',' or ';' in /path/to/project/app/models/users.php on line 34
DB設計時には要注意です。
--name=s | モデルを作成するテーブル名を指定します |
---|---|
--schema=s | モデル作成に必要なテーブル情報を取得するスキーマを指定します。config.phpに書かれているスキーマ以外から取得する際に必要です |
--namespace=s | 作成するモデルのネームスペースを設定します |
--get-set | 通常、テーブル内のカラムはクラスのパブリックプロパティとして作成されますが、これをprotectedなプロパティとし、getter/setterを用意します |
--extends=s | ここで指定したクラスを継承してモデルクラスを作成します |
--excludefields=l | プロパティを作成しないフィールドをコンマ区切り指定できます。 |
--doc | PHPDoc形式のコメントを付けた状態で作成します |
--directory=s | モデルを作成したいモデルへのパスを入力します。モジュール構成だとこのオプションはうまく動きません(間にモジュールディレクトリが挟まっているので当然っちゃ当然) |
--output=s | 出力先のディレクトリを指定します。モジュール構成の場合は必須です |
--force | 既にあるモデルを上書きして作成する場合に付けるオプションです |
--camelize | カラム名がスネークケースの場合、キャメル記法でプロパティを作成します。デフォルトはそのままです |
--trace | Shows the trace of the framework in case of exception [optional] |
--mapcolumn | コード内でテーブル内フィールド名の一覧が取得できるcolumnMapメソッドを追加します |
--abstract | 対象テーブルのモデルを作るための抽象クラスを作成します。これを継承したクラスは生成されないので別途「phalcon model」コマンドで作成する必要があります |
--annotate | アノテーションを付けるオプションのようですが、デフォルトでついているのでdiffを取っても変化はありませんでした |
--help | オプションリストの表示 |
phalcon all-models コマンド
これから作成するアプリケーションのDB設計が終わっていて、テーブルがDB上に構築されているなら、引数なしで「phalcon all-models」コマンドを打てば、存在するすべてのテーブル分のモデルがざっと作成できます。
基本的には「phalcon model」コマンドと同じです。
これが終わってから、個別に設定が必要なモデルは「phalcon model」コマンドで--forceオプションを付けて再作成するというスタンスもいいかも知れません。
--config=s | Configuration file [optional] |
---|---|
--models=s | Models directory [optional] |
--schema=s | モデル作成対象のスキーマを切り替えます。デフォルトではconfig.phpに記載された通りに動きますが、その向き先を上書きします
こちらで指定していても、config.phpにスキーマが設定されていない場合は、「ERROR: SQLSTATE[3D000]: Invalid catalog name: 1046 No database selected」のエラーになります。 |
--namespace=s | 作成するモデルにnamespaceを設定します |
--extends=s | 継承元クラスを設定します。use演算子を使用したりしないので、名前空間も含めて記載する必要があります |
--force | 既に同名ファイルが存在している場合でも上書きします |
--get-set | 通常、テーブル内のカラムはクラスのパブリックプロパティとして作成されますが、これをprotectedなプロパティとし、getter/setterを用意します |
--doc | PHPDoc形式のコメントを付けた状態で作成します |
--relations | 対象のテーブルに外部キー制約が付いている場合は、リレーションの設定が追加されます |
--fk | 対象のテーブルに外部キー制約が付いている場合は、リレーションの設定が追加されます |
--validations | Define possible domain validation according to conventions |
--directory=s | プロジェクトルートのパスを設定します。この設定が有効なのは、プロジェクトのタイプがsimpleの場合のみです |
--mapcolumn | コード内でテーブル内フィールド名の一覧が取得できるcolumnMapメソッドを追加します |
--abstract | モデルを抽象クラスとして作成します。全テーブルの抽象クラスを作るので、設計思想によっては有用なオプションかも知れません |
--help | オプションリストの表示 |
phalcon migration コマンド
DBのマイグレーションに関する処理ができるコマンドです。
バージョンダウンなどで、カラムが減る場合もテーブルの作り直しではなく、ALTER TABLEによるカラムの削除を行うので、テーブルが空になる事はなさそうです。
引数なしで「phalcon migration generate」を実行した場合は、バージョン番号によるバージョン管理を行います。
generateの場合に --descrオプションを用いた場合は、タイムスタンプベースのバージョン管理に切り替わります。
ややこしいのが、両方式のマイグレーションを混在させる事ができるという点。
色々試してみると、通常のマイグレーションは、バージョン番号管理のもので済ませ、特定のタイミングの特別なマイグレーションファイルを作りたい場合に、--descrオプションを付けたマイグレーションを行うような運用が良いようです。
例えば、バージョン1.0.0で作ったマイグレーションAを作成し、同じ内容で--descrオプションを付けたマイグレーションBを作成します。
マイグレーションAが適用されている状態でマイグレーションBを実行しても、「Info: Version 1.0.0 was already applied」という形になりますので、内部的にマイグレーションAとマイグレーションBが同一のものであるという確認がされているようです。
--action=s | generateで作成、runで実行、listで全マイグレーションのリスト表示になります。
バージョン指定をしない場合は、全てのマイグレーションを実行します。phalcon migration [generate | run] でも実行可能です |
---|---|
--config=s | config.phpのパスを指定します |
--migrations=s | migrationsディレクトリのパスを指定します。project=modulesの場合だけ必要になるようです |
--directory=s | プロジェクトルートまでのパスを設定します。 |
--table=s | マイグレーション処理の対象となるテーブル名を設定します |
--version=s | 変更したいマイグレーションのバージョンを指定します |
--descr=s | マイグレーションの説明をマイグレーションに追加します。このオプションが有効なのは、generateの時だけで、このオプションを付けた場合のみ、マイグレーションファイルはタイムスタンプベースになります |
--data=s | データをエクスポートし、datファイル(中身はCSVの模様)に保存します。always、oncreateの2種類を選び、up時にインサートされるよう、マイグレーションファイルが作成されます。 |
--force | マイグレーションファイルが存在しても上書きして作成します。このオプションが有効なのは、--versionオプションでバージョン指定した場合だけで、指定しなかった場合は、一番大きいバージョン番号が付けられます |
--ts-based | タイムスタンプベースでバージョン管理されたマイグレーションを作業対象にします。このオプションが有効なのは、--actionオプションがrun、listの場合だけで、generateの場合は無視されます |
--log-in-db | 通常、現在のマイグレーションのバージョンは、「./.phalcon/migration-version」に書かれていますが、このオプションを追加する事で、DB内でバージョン管理するように変更できます |
--no-auto-increment | インクリメントの現在値を保存しないようにします |
--help | オプションリストの表示 |
phalcon scaffold コマンド
このコマンドを実行すると、モデル / ビュー / コントローラーを一括で作成します。
また、検索・新規作成・更新機能を持った画面も合わせて作成します。
各機能自体もコントローラー上に実装してある状態で作成されるので、単純なCRUDを行うだけのページを作成する場合は、scaffoldで作成したものを修正する方が圧倒的に実装が速くなります。
--table-name=sscaffoldを作成するテーブルの指定 | |
---|---|
--schema=s | 作成するテーブルが存在するスキーマの設定 |
--get-set | 通常、モデルにおいてテーブル内のカラムはクラスのパブリックプロパティとして作成されますが、これをprotectedなプロパティとし、getter/setterを用意します |
--directory=s | プロジェクトルートを設定します |
--template-path=s | scaffoldのベースになるテンプレートファイルを別途指定する場合はこちらのオプションでパスを設定します |
--template-engine=s | 利用するテンプレートエンジンを指定します。デフォルトはPHPで、その他にvoltが選択可能です |
--force | scaffolで作成する一連のファイルで、既にファイルが存在しても上書きして再作成します |
--trace | Shows the trace of the framework in case of exception [optional] |
--ns-models=s | モデルのネームスペースを指定するオプションです |
--ns-controllers=s | コントローラーのネームスペースを指定するオプションです |
--help | オプションリストの表示 |
phalcon webtools コマンド
Twiiter Bootstrapでレイアウトされた、ブラウザ上でPhalconコマンドを簡単に利用できるモジュールをプロジェクトに組み込みます。
後から利用不可にする事ができるので、開発中は利用可能な状態にし、リリース時に利用不可にするという事が可能です。
Phalconコマンドは機能が多いので、GUIで手軽に設定できるのは、ありがたいですね。
--action=s | 引数は[enable|disable]の二種類で、ブラウザ上から各種Phalconコマンドを実行するGUIを利用可能にします |
---|---|
--help | オプションリストの表示 |
同梱品
phalcon-devtoolsのディレクトリ直下にideというディレクトリがあります。
主にIDEでPhalconの実装がしやすいためのツールが収められています。
スタブを作るためのスクリプトです。
プログラムの最初に出てくる、CPHALCON_DIR定数を、Phalcon.soがインストールされているパスに書き換えて使います。
// サンプル define('CPHALCON_DIR' , '/usr/lib64/php/modules/');
書き換え後、実行すると、Phalconのバージョンが名前になっているディレクトリが作られ、現在のPhalcon環境のスタブが生成されます。
とはいえ、最新版のスタブは同梱されているので自分で実行する必要はあまりありません。
中には、phpstormのコンソールからphalconコマンドが実行するためのコマンドラインツールがあります。
中身は、インストールチェックをしないphalcon.shという感じですが、登録しておくと便利かもしれません。
最新バージョンのPhalconに実装されている関数のスタブが置かれています。
最新版を使う場合は、gen-stubs.phpを実行せず、こちらを使ったほうがお手軽です。
テンプレートの改変
phalconコマンドでプロジェクトやモデル、コントローラーを自動生成する事はわかりましたが、幾つかのプロジェクトを作っていると、毎回同じように修正する箇所が出て来るんじゃないでしょうか。
Phalconコマンドは各種自動生成時にテンプレートを利用しているので、テンプレートを書き換えてしまえば、そんな煩雑な作業から開放されます!
テンプレートを利用しているのは、プロジェクト、モジュール、scaffoldで、「@@」で囲まれた部分が置換されるようになっていますので、ベースになる部分はどんどん改造して使いやすくしてしまうのがよいと思います。
phalcon-devtoolsのインストールが完了していたら、以下のコマンドでテンプレートのコピーを~/Documents以下にコピーできます。
lang=bash cp -a $PTOOLSPATH/templates ~/Documents
以上です。