PHPでWebシステムを開発する際、使い回す部分は別ファイルとして定義し、都度呼び出すようにすれば、冗長化をなくすことができて便利。
ただ、通常のPHPと違い、フレームワーク化されたLaravelではrequire(もしくはrequire_once)をviewの中で使用することができず、エラーになる。
ではどうするかと言うと、Composerの機能であるautoloadを使用する。
※ 本記事は全くの個人的なメモですので、内容は参考程度にお願いします。
Composer autoloadの使い方
修正するファイル
- composer.json (Laravelプロジェクトディレクトリ直下にある)
- 部品化した.phpファイル(今回はプロジェクト直下にtestを作り、そこに置く)
- 呼び出し元の.php(もしくは.blade.php)
手順
① composer.jsonの編集
composer.jsonの”autoload”の下、”par-4″にディレクトリの場所を追加。
“Test\\”は名前空間の意味(PHPのnamaspaceで指定するところ)。
以下のように修正。
"autoload": {
"psr-4": {
"App\\": "app/",
"Test\\": "test/"
},
"classmap": [
"database/seeds",
"database/factories"
]
},
② 部品の.phpファイルを作成
①で指定したディレクトリに部品化したPHPファイルを作成。
(今回の場合は、Laravelプロジェクトディレクトリ配下のtest)
注意点としては、PHPのクラスとして定義しないといけないこと。
(それと呼び出すためのファンクション)
今回は、静的なメソッドを定義しています。
以下のように書いてみました。
<?php
namespace Test;
Class Test{
function __construct() { }
public static function get_message() {
$head = <<< EOM
<p>Test Message</p>
EOM;
return $head;
}
}
?>
③ composer dump-autoloadを実行
Laravelプロジェクトディレクトリ直下で以下のコマンドを実行。
composer dump-autoload
うまくできると、以下のメッセージが出ます。
Package manifest generated successfully.
④ 呼び出す側の.phpを作る
今回は静的メソッドを呼び出し、文字列としてただ出力するだけです。
<?php
var_dump(Test\Test::get_message());
?>
エントリポイントであるindex.phpで、vendor/autoload.phpが実行されているため、各々のページでわざわざrequire…を記述する必要はありません。
以上です。
参考:
・Basic usage – Autoloading (Composer公式)
・Autoloader Optimization (同上)