【大阪 / 横浜】インフラ / サーバーサイドエンジニア募集中!

【大阪 / 横浜】インフラ / サーバーサイドエンジニア募集中!

【25卒向け】AI×バーチャル面接の募集を開始いたしました!

【25卒向け】AI×バーチャル面接の募集を開始いたしました!

【導入実績 500社以上】AWS 構築・運用保守・監視サービス

【導入実績 500社以上】AWS 構築・運用保守・監視サービス

【CentOS 後継】AlmaLinux OS サーバー構築・移行サービス

【CentOS 後継】AlmaLinux OS サーバー構築・移行サービス

【WordPress 専用】クラウドサーバー『ウェブスピード』

【WordPress 専用】クラウドサーバー『ウェブスピード』

【格安】Webサイト セキュリティ自動診断「クイックスキャナー」

【格安】Webサイト セキュリティ自動診断「クイックスキャナー」

【低コスト】Wasabi オブジェクトストレージ 構築・運用サービス

【低コスト】Wasabi オブジェクトストレージ 構築・運用サービス

【予約システム開発】EDISONE カスタマイズ開発サービス

【予約システム開発】EDISONE カスタマイズ開発サービス

【100URLの登録が0円】Webサイト監視サービス『Appmill』

【100URLの登録が0円】Webサイト監視サービス『Appmill』

【中国現地企業に対応】中国クラウド / サーバー構築・運用保守

【中国現地企業に対応】中国クラウド / サーバー構築・運用保守

【YouTube】ビヨンド公式チャンネル「びよまるチャンネル」

【YouTube】ビヨンド公式チャンネル「びよまるチャンネル」

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コマンドでは、以下の文字列を第一引数に据えることで様々な事ができます。

ひとつずつ見ていきましょう!

 

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のアプリケーションタイプを選択

  • cli
  • micro
  • modules
  • simple (default)
--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ですが、その他の形式も選択可能です

  • ini
  • json
  • php
  • yaml
--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

 

以上です。

この記事がお役に立てば【 いいね 】のご協力をお願いいたします!
0
読み込み中...
0 票, 平均: 0.00 / 10
2,810
X facebook はてなブックマーク pocket
【2024.6.30 CentOS サポート終了】CentOS サーバー移行ソリューション

【2024.6.30 CentOS サポート終了】CentOS サーバー移行ソリューション

【25卒向け】AI×バーチャル面接の募集を開始いたしました!

【25卒向け】AI×バーチャル面接の募集を開始いたしました!

【大阪 / 横浜】インフラエンジニア・サーバーサイドエンジニア 積極採用中!

【大阪 / 横浜】インフラエンジニア・サーバーサイドエンジニア 積極採用中!

この記事をかいた人

About the author

萬代陽一

ソーシャルゲームのウェブ API などの開発がメイン業務ですが、ありがたいことにマーケティングなどいろんな仕事をさせてもらえています。
なおビヨンド内での私の肖像権は CC0 扱いになっています。