Laravel 4 documentationの「Creating a Package」の手順に従ってパッケージを作成しました。パッケージを作成した後、「コントローラー」フォルダーとルート ファイルを作成しました。新しいファイル構造は次のとおりです。
/src
/Vendor
/Package
PackageServiceProvider.php
/config
/controllers
/lang
/migrations
/views
routes.php
/tests
/public
パッケージ サービス プロバイダーのブート部分にルート ファイルを追加しました。
public function boot()
{
$this->package('vendor/package');
include __DIR__ . '/../../routes.php';
}
次に、ルート ファイルに基本的なルートを追加します。
Route::get('/package', function() {
return "Package route test";
});
指定されたルート (app.dev/package) でアプリケーションにアクセスすると、次のような結果が返されます。
Package route test
次に、基本的なコントローラー呼び出しをルートに追加します (デフォルトの Laravel コントローラーである "HomeController" を使用) が機能します。
Route::get('/package', 'HomeController@showWelcome');
次に、パッケージのコントローラーをセットアップするために、この SO の回答に従いました。src/controllers フォルダーを composer クラスマップに追加し、オートローダーをダンプして vendor/composer/autoload_classmap.php を確認したところ、composer によってクラスが正常に読み込まれていることがわかりました。
<?php
// autoload_classmap.php generated by Composer
$vendorDir = dirname(__DIR__);
$baseDir = dirname($vendorDir);
return array(
'HomeController' => $baseDir . '/src/controllers/HomeController.php',
);
ここで、名前空間を使用して新しいパッケージ コントローラーをルートに追加しました。
Route::get('/package', 'Vendor\Package\Controllers\HomeController@showWelcome');
しかし、これはクラスが見つからないというエラーを生成します:
ReflectionException: Class Vendor\Package\Controllers\HomeController does not exist
また、パッケージ名を使用して呼び出してみました:
Route::get('/package', 'Package::HomeController@showWelcome');
同じエラーが発生します:
ReflectionException: Class Vendor\Package\Controllers\HomeController does not exist
何を試しても、パッケージは独自のコントローラーにアクセスできず、コンポーザーはロードされていることを確認します (vendor/package/autoload_classmap.php を表示して)。
何か案は?問題が作曲家がクラスをロードしていないかどうかはわかりません。問題のデバッグをどこから始めればよいかわかりません。別のパッケージを作成し、ここで手順を繰り返しましたが、同じ問題が発生しました。
パッケージとアプリの両方からパッケージ ビューにアクセスできます。
View::make('package::view');
問題は、コンポーザーがコントローラーをロードしてから、Laravel がコントローラーにアクセスできるようになるまでの間にあるようです。