PHPStan-CakePHP2 ドキュメント
pieceofcake2/phpstan-cakephp2 は、pieceofcake2/cakephp で動作する CakePHP 2 のアプリケーションとプラグインのための PHPStan 拡張です。プロパティとして読み込まれる モデル、コンポーネント、タスク、モデルに対して呼び出されるビヘイビアのメソッド、ClassRegistry::init() といった CakePHP 2 のマジックを PHPStan に教えます。sidz/phpstan-cakephp2 のフォークです。
インストール
Composer で、開発用の依存パッケージとして拡張をインストールします。
composer require --dev pieceofcake2/phpstan-cakephp2PHPStan の設定で拡張を読み込みます。
# phpstan.neon
includes:
- vendor/pieceofcake2/phpstan-cakephp2/extension.neonphpstan/extension-installer を使っている場合は、拡張が 自動的に読み込まれるので、この設定は必要ありません。
pieceofcake2/app スケルトンには、この拡張がすでに設定されています。
ビヘイビアとスキーマの場所
ビヘイビアとスキーマファイルは、PHPStan を実行するディレクトリ (通常はプロジェクトルート) を基準にした glob パターンで 探されます。extension.neon のデフォルトは次の場所を対象にしています:
- pieceofcake2/cakephp のコアのビヘイビア (
vendor/pieceofcake2/cakephp/src/Cake/Model/Behaviorと、 古いリリースや CakePHP 自体を解析するときに使われるlib/Cakeとsrc/Cakeのパス) - pieceofcake2/app のモダン構成:
src/Model/Behavior、plugins/*/Model/Behaviorとconfig/Schema - CakePHP 2 のレガシー構成:
app/Model/Behavior、app/Plugin/*/Model/Behaviorとapp/Config/Schema
ビヘイビアのクラスやスキーマファイルが他の場所 (たとえば vendor ディレクトリ) にある場合は、その場所を設定に追加してください。 追加した場所はデフォルトとマージされます。例:
# phpstan.neon
parameters:
ModelBehaviorsExtension:
behaviorPaths:
- vendor/my-vendor/my-plugin/src/Model/Behavior/*.php
SchemaService:
schemaPaths:
- vendor/my-vendor/my-plugin/config/Schema/*.php機能
PHPStan に次の機能が追加されます:
- ビヘイビアのメソッドを、すべてのモデルの追加のメソッドとして扱います (
$model->behaviorMethod())。 - モデルクラスの名前を持つコントローラー、モデル、シェルのプロパティを、それらのクラスのインスタンスとして扱います (
$controller->Model)。 $componentsに列挙されたコンポーネントの名前を持つコントローラーとコンポーネントのプロパティを、それらのクラスの インスタンスとして扱います ($controller->Component、$component->Component)。- タスククラスの名前を持つシェルのプロパティを、それらのクラスのインスタンスとして扱います (
$shell->Task)。 シェルやタスクの$tasksに列挙されたタスクは、同じ名前のモデル (たとえば bake のModelタスク) より優先されます。 @propertyタグで宣言されたプロパティは PHPStan に任せ、この拡張が追加するプロパティよりタグが優先されるようにします。ClassRegistry::init($className)の戻り値を、可能であれば$classNameのインスタンスとして、スキーマファイルに テーブルだけが定義されている場合はModelとして扱います。クラス名はプラグイン記法 ('Plugin.Model') でも、classキーを持つ配列 (['class' => 'Plugin.Model', 'alias' => 'Alias']) でも指定できます。その他のクラス名 (たとえばstring型の変数) はobjectになります。$strictなしで 1 つのクラスを指定した場合、init()が false を 返すことはないからです (クラスが存在しなければAppModelを作成します)。$strict = trueの場合、init()はクラスが 存在しないかモデルでなければ false を返すので、そのクラスのインスタンスになるのはモデルクラスだけで、それ以外はobject|falseになります。設定のリストと、そうしたリストである可能性のある値 (たとえばmixed) は、宣言どおりのbool|objectのままです。$this->Components->load('Name')の戻り値をNameComponentのインスタンスとして扱います。
たとえば PHPStan は、次のすべてのプロパティと呼び出しの型を把握します。
class PostsController extends AppController
{
public $components = ['Paginator'];
public function index()
{
// Post (a model class), PaginatorComponent (listed in $components)
$this->set('posts', $this->Paginator->paginate($this->Post));
// TreeBehavior::generateTreeList(), called on the model
$this->set('categories', $this->Post->Category->generateTreeList());
// Tag
$Tag = ClassRegistry::init('Tag');
$this->set('tags', $Tag->find('list'));
}
}スタブ
この拡張には、Model、Router、ClassRegistry のより正確な型と、basics.php のグローバルな翻訳関数 (__()、__n()、...) の宣言を含む PHPStan のスタブも同梱されています。これらは extension.neon が読み込みます。
開発
composer install
# Run the tests
vendor/bin/phpunit
# Run static analysis
vendor/bin/phpstan
# Check the coding standard (cakephp/cakephp-codesniffer), and fix what can be fixed automatically
vendor/bin/phpcs
vendor/bin/phpcbf同じチェックは Composer スクリプトとしても使えます: composer phpunit、composer phpstan、composer cs-check、 composer cs-fix、そしてテスト、静的解析、コーディング規約のチェックを一度に実行する composer test です。
由来
このパッケージは sidz/phpstan-cakephp2 (Packagist では sidz/phpstan-cakephp2、アップストリームの最終バージョンは 0.2.0) のメンテナンスされたフォークで、 元の作者は Oleg Zhulnev です。 pieceofcake2 が、モダンな PHP で動く CakePHP 2 向けに メンテナンスしています。オリジナルからの変更点は フォーク以降のコミット履歴 で確認できます。
