Laravel5, CakePHP2, CakePHP3を保守する際に便利な情報をまとめました。
私は主にLaravel5, CakePHP2, CakePHP3を使用したプロジェクトの保守を担当しています。 その際に似たような機能をそれぞれのフレームワークで実装することがあります。 このような業務を通して得た情報をまとめて記事にしてみました。
読者は限られるかもしれませんが、役に立つ情報があれば幸いです。
目次
よく使う情報の対応表
項目 | Laravel5 | CakePHP2 | CakePHP3 |
---|---|---|---|
フレームワークのバージョン確認 | composer.json |
composer.json |
composer.json |
CLI | php artisan |
app/Console/cake |
bin/cake |
REPL | php artisan tinker |
app/Console/cake console (厳密にはREPLではありません) |
bin/cake console |
ルーティング一覧 | php artisan route:list |
app/Console/cake console > Routes show |
bin/cake routes |
ルーティング定義の確認 | routes/web.php |
app/Config/routes.php |
config/routes.php |
テンプレート内のコメント | {{-- comment --}} |
<?php /* comment */ ?> |
<?php /* comment */ ?> |
ログの出力 | Log::debug('message') |
$this->log('message', 'debug') CakeLog::write('debug', 'message') |
$this->log('message', 'debug') Log::write('debug', 'message') |
ViewでのPage Pathの確認 | @if(request()->is('path/to/page/*')) |
$this->request->here |
$this->request->getRequestTarget() |
対応表補足: REPL
REPLはロジックの確認を行うときに便利です。 少し複雑な処理の一部分を書き換える際は何度もテストするのが面倒です。 (例えば何度もフォーム入力をして登録処理を実行する必要があったりします。)
こういう場合はREPLで動作確認後、コードを実装して全体の動作確認という手順を踏むことがあります。
以下はユーザー情報を取得する例です。
(CakePHP2の app/Console/cake console
は厳密にはREPLではありません。
使用できる機能にかなり制限があり、活用できる場面は少ないかもしれません。)
# Laravel5
php artisan tinker
> $user = App\User::find(1);
# CakePHP2
app/Console/cake console
> User->findById(1);
# CakePHP3
bin/cake console
> use Cake\ORM\TableRegistry;
> $users = TableRegistry::getTableLocator()->get('Users');
> $user = $users->get(1);
対応表補足: ViewでのPage Pathの確認
テンプレート内で特定のページにアクセスしているかを確認する際に使用しています。
Laravel5
{{-- http://localhost/path/to/page/?test=1 にアクセスした場合はtrueです --}}
@if(request()->is('path/to/page/*'))
@if(Request::is('path/to/page/*'))
ヘルパー( request()->is
)を使用するかファサード( Request::is
)を使用するかはプロジェクトに合わせています。
また、下記のようにページパスの取得も可能です。
<?php
// http://localhost/path/to/page?test=1 にアクセスした場合
request()->path()
// -> path/to/page
request()->query('test')
// -> 1
?>
CakePHP2
<?php
// http://localhost/path/to/page/?test=1 にアクセスした場合
$this->request->here
// -> /path/to/page/
$this->request->query
// -> ['test' => 1]
?>
CakePHP3
<?php
// http://localhost/path/to/page/?test=1 にアクセスした場合
$this->request->getRequestTarget()
// -> /path/to/page/?test=1
$this->request->getQueryParams();
// -> ['test' => 1]
?>
その他保守で便利な情報
URLから変更箇所を特定する方法
保守をする際は要望をURLで指定されることが多いです。 URLから対象のコントローラーやテンプレートを特定したい場合は、私は以下の方法を使用しています。
URLからコントローラーの特定
ルーティング一覧確認コマンドはありますが、私はあまり利用していません。 代わりにログ出力を追加して特定しています。
Laravel5
Laravelはルーティングが柔軟なため、URLからコントローラーを特定することが難しいです。
routes/web.php
を確認しても良いですが、複雑な設定をしている場合は特定が面倒です。
そのような場合には RouteServiceProvider::boot
にログ出力を追加して、アクセスされたコントローラーを特定しています。
// RouteServiceProvider::boot
Route::matched(function ($event) {
$action = $event->route->getActionName();
$request = $event->request;
\Illuminate\Support\Facades\Log::debug('Route accessed:', [
'action' => $action,
'url' => $request->fullUrl(),
'method' => $request->method(),
]);
});
上記のコードを RouteServiceProvider::boot
メソッドに追加して特定のURLにアクセスすると、
ログ (大抵は storage/logs/laravel.log
) に以下のようなログが出力されます。
Route accessed: {"action":"App\\Http\\Controllers\\FooController@bar","url":"http://localhost/bar/test","method":"GET"}
CakePHP
CakePHP系はルーティングが規約に従っているため、URLからコントローラーを特定することができます。
基本的には /controller/action/
は controllerController::action
にルーティングされます。
しかし、規約に従っていないパターンもあります。
この場合は routes.php
を確認しても良いですが、複雑な設定をしている場合は特定が面倒です。
そのような場合には AppController::beforeFilter
にログ出力を追加して、アクセスされたコントローラーを特定しています。
(以下のコードはある程度テンプレートの情報も取得できますが、おまけ程度です。十分な情報が得られないことが多いです。)
// CakePHP2
$this->log('action: ' . $this->name . 'Controller::' . $this->action, 'debug');
$this->log('layout: ' . $this->layout, 'debug');
// CakePHP3
$this->log('action: ' . $this->name . 'Controller::' . $this->request->getParam('action'), 'debug');
$this->log('layout: ' . $this->viewBuilder()->getLayout(), 'debug');
$this->log('template: ' . $this->viewBuilder()->getTemplate(), 'debug');
上記のコードを AppController::beforeFilter
メソッドに追加して特定のURLにアクセスすると、
ログ (大抵は logs/debug.log
) に以下のようなログが出力されます。
action: FooController::bar
// おまけ部分は省略
URLからテンプレートの特定
URLにアクセスしたときの画面はレイアウトやコンポーネントなど、複数のテンプレートファイルから構成されていることが多いです。 そのため、どのファイルを修正すれば良いかを特定するのが難しいことがあります。
私は画面に表示されている要素に一意の数字列を追加して特定しています。 以下はその手順です。
- 対象画面にブラウザからアクセス
- 変更したい箇所の近辺のテキストをコピー(例: 「情報」)
- 以下のコマンドを実行:
# ワーキングツリーの変更を一時的に退避
git stash push -u
# テンプレートファイル内の「情報」に一意の数字列を追加
git ls-files '*.ctp' -z | xargs -0 perl -i -pe 's/情報/"$&" . $./ge'
- ブラウザ画面を更新し、追加された数字列とともにgrep検索 (例:
情報20498
) - ファイル特定後、以下のコマンドで元に戻す:
# ワーキングツリーの変更を元に戻す
git restore .
# 一時的に退避した変更を戻す
git stash pop --index
その他 CakePHP2 と CakePHP3 の相違点
項目 | CakePHP2 | CakePHP3 |
---|---|---|
モデル名 | User |
Table class: UsersTable Entity class: User |
モデル構造 | 1つのテーブルに対して1つのModelクラス | 1つのテーブルをTableクラスとEntityクラスに分割 |
action名(メソッド名) | action_name (actionName ) |
actionName |
テンプレートファイル | action_name.ctp |
action_name.php |
推奨URL形式 | action_name |
action-name |
詳細は以下の公式ドキュメントにまとめられています。
モデル構造について
ORMの変更点については以下の公式ドキュメントにまとめられています。
action名について
コントローラーのメソッド名はCakePHP2, 3ともに camelCase
が使用されています。
しかし、CakePHP2の場合、actionとして使用する場合のメソッド名は snake_case
が推奨されているようです。
CakePHP3ではaction名も camelCase
が推奨されています。
また、URLは推奨形式が指定されていますが、CakePHP2, 3ともに
camelCase
, snake_case
, kebab-case
のいずれも使用可能です。
以下のURLはすべて同じコントローラーの同じアクションにマッピングされます。
http://localhost/controllerName/actionName/
http://localhost/controller_name/action_name/
http://localhost/controller-name/action-name/
-> ControllerNameController::actionName
以上です。お読みいただきありがとうございました。