2015-12-13

phalconあれこれ

phalconの細かすぎず、伝わりやすい話。2系の話です(1系でもそうかもしれないけど未検証)。

apacheでauthorizationヘッダが認識されない

phalconではContent-TypeとContent-Length以外では、$_SERVER内 の HTTP_*** 形式の変数をヘッダとして認識する仕様。apacheではAuthorizationヘッダはHTTP_AUTHORIZATIONに変換してくれないので、.htaccess等に以下のような記載をして環境変数に適切にセットしてあげる必要があります。
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]

ちなみに、getHeaderの呼び出しは、HTTP_を付けても付けなくてもどちらでも呼び出し可能です。

$this->request->getHeader('HTTP_AUTHORIZATION');
$this->request->getHeader('AUTHORIZATION');

参考URL

WHERE句のINの書き方

以下の書き方をすると怒られる。
$hoge = \Hoge::findFirst([
    'fuga IN :foo:',
    'bind' => [
        'foo' => ['bar1', 'bar2']
    ]
]);

正しくはこう書く↓

$hoge = \Hoge::findFirst([
    'fuga IN ({foo:array})',
    'bind' => [
        'foo' => ['bar1', 'bar2']
    ]
]);

参考URL→https://forum.phalconphp.com/discussion/2159/phql-binding-array-with-the-in-operator

metadataのcacheディレクトリ

phpの実行ユーザが読み書きするので、適切なパーミッションを与える必要があります。例えば単体テストを走らせた結果出力されたファイルは、単体テストを実行したユーザがオーナーとなり、大抵の場合、webからのアクセス時の実行ユーザとは異なる。そうすると、webからアクセスがあったときにcache内のビューファイルを読み込もうとするもパーミッションでエラーになったりするので注意が必要。

validatorの:field

Validatorのメッセージに":field"という文字列を入れると、フィールド名で自動的に置換してくれます。
$this->add(
    'name',
    new \Phalcon\Validation\Validator\PresenceOf([
        'message' => ':field is required'
    ])
);

こうすると:fieldがnameに置換されて"name is required"が出力される。汎用的なバリデーション処理を作りたい場合は便利。

Phalcon\Securityの仕様

phalconのPhalcon\Securityクラスを使うと、良い感じなソルト付きハッシュを作れます。
$hash = $this->security->hash('input your password');

ハッシュアルゴリズムはbcryptで行われます。 内部でやってる処理はソースコードを読むと、crypt関数を呼んでいるのがわかります。

コントローラ内でexitするとテストコード止まる

phalconに限らずだと思いますが、returnしましょう。beforeExceptionのExceptionハンドリング内ではreturn falseをするとディスパッチループが止まる(はず)。 バッチ処理はエラーのリターンコード返すために適切にexitした方が良いですが、なるべくテストしやすい形にすると良いかと思われます。

コントローラ内でのDIへのアクセス

$this->getDI()->get('hoge') でもアクセスできるけど、以下でもアクセスできる。
$hoge = $this->hoge;

これはPhalcon\Mvc\ControllerPhalcon\Di\Injectableクラスを検証しておりInjectableクラスがマジックメソッド__getを使って存在しないプロパティに対するアクセスで、DIコンテナに対象のプロパティ名で格納されていたらDIコンテナ内のインスタンスを返すようになっているためです。

PDOのトランザクション開放

phalcon関係ないですが、PDOを使ってるときは$this->db->begin()でトランザクションを開始したまま処理を終える(明示的にコミット、ロールバックをせずにPDOが開放される)場合は自動的にロールバックされます。

参考URL→http://php.net/manual/ja/pdo.transactions.php

devtoolsでモデルを作成するときの命名規則

devtoolsを使うと、以下のコマンドでテーブルからモデルクラスを作成できる。
$ phalcon all-models --schema=public--doc \
> --models=app/models --namespace=HOGE

hoge_ab__cd___efというテーブルだと、HogeAbCdEf という感じで、キャメルケースで生成される。

 

この投稿はPhalcon Advent Calendar 2015の 13日目の記事です。

このエントリーをはてなブックマークに追加