Ship Logo Ship Logo
2024/12/04

Laravel5, CakePHP2, CakePHP3を保守する際に便利な情報

author picture

Nay

/

エンジニア

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にアクセスしたときの画面はレイアウトやコンポーネントなど、複数のテンプレートファイルから構成されていることが多いです。 そのため、どのファイルを修正すれば良いかを特定するのが難しいことがあります。

私は画面に表示されている要素に一意の数字列を追加して特定しています。 以下はその手順です。

  1. 対象画面にブラウザからアクセス
  2. 変更したい箇所の近辺のテキストをコピー(例: 「情報」)
  3. 以下のコマンドを実行:
# ワーキングツリーの変更を一時的に退避
git stash push -u
# テンプレートファイル内の「情報」に一意の数字列を追加
git ls-files '*.ctp' -z | xargs -0 perl -i -pe 's/情報/"$&" . $./ge'
  1. ブラウザ画面を更新し、追加された数字列とともにgrep検索 (例: 情報20498)
  2. ファイル特定後、以下のコマンドで元に戻す:
# ワーキングツリーの変更を元に戻す
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

以上です。お読みいただきありがとうございました。

SHARE ON ❤️