11

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 がコントローラーにアクセスできるようになるまでの間にあるようです。

4

3 に答える 3

17

間違いは、ルートにコントローラーのパスを含めていたことです。私は以下を持っていました:

Route::get('/package', 'Vendor\Package\Controllers\HomeController@showWelcome');

正しい使い方は次のとおりです。

Route::get('/package', 'Vendor\Package\HomeController@showWelcome');

コントローラーに名前空間が含まれている場合:

namespace Vendor\Package;

コントローラが点灯する必要があります:

\Illuminate\Routing\Controllers\Controller

パッケージ名 (例: Package::HomeController@showWelcome) はまだ使用できませんが、名前空間は使用できます。わーい。

問題が解決しました。

于 2013-02-19T03:03:21.207 に答える
6

Vendor/Package/composer.json を編集して、コントローラーのディレクトリを autoload/classmap に挿入してみてください。

....
"autoload": {
    "classmap": [
        "src/migrations",
        "src/controllers",
        "src/models"
    ],
    "psr-0": {
        "Package\\Controller": "src/"
    }
}
....

その後、ターミナルを開き、パッケージのルート ディレクトリからcomposer dump-autoload を実行します。

私のために働く...

于 2013-02-20T12:46:58.887 に答える