PHP
laravel

composer dump-autoloadが面倒くさい Laravel

More than 3 years have passed since last update.

composer dump-autoloadが面倒だ!

Laravel以外のものでも使ってるものによっては、
実際に思う方も少なくないのでは?と思いますが、
ちょっとしたことで毎回ではなく必要最低限数実行すれば済むようになります。

Laravel4-Generators使ってない方向けです!

それはとても簡単なことでして、
psr-0 というオートローディング規約を思い出してみましょう。

Laravelはディレクトリ等自由にユーザーが変更することができます。
作者自身が述べているように、
モデルという名前で"データベースのための処理だ!"と
思い込んでいる方もいると思いますが、
そんな概念に捕われず真っ先に削除してしまいましょう。
(モデルという名前が好きであればそのままでもかまいませんよ!)
モデルやコントローラーを既存のままで使用したい場合は、
以下の説明のAcmeを、Models, Controllersとするとイイです。

オートローディング規約は、 
\ベンダー名\名前空間\クラス名 とする必要があり、
トップレベル(最初の部分)は必ずベンダー名で始めます。
この場合はプロジェクト名としておきましょうか。
名前空間の区切りは
ディレクトリ を表現します
最後はクラス名.phpにすれば良いOKです。

それを早速composer.jsonに記述します。

composer.json
    "autoload": {
        "classmap": [
            "app/commands",
            "app/database/migrations",
            "app/database/seeds",
            "app/tests/TestCase.php"
        ],
        "psr-0": {
            "Acme": "app/"
        }
    },

今回はcontrollerもモデルも取っ払って、Acmeというトップレベルの名前にしました
global.phpのクラスローダーも要らないので取っ払います

app/start/global.php
ClassLoader::addDirectories(array(
    app_path().'/commands',
    app_path().'/database/seeds',
));

composer.jsonに記載した様に app/Acme ディレクトリを作成します
作成したら

$ composer dump-autoload

これでもう叩くことはないだろう、と言わんばかりにコマンド叩きます
(ディレクトリ変更したら叩いてください app/Hoge/Acme とか)

あとは規約に沿って作っていくだけです。
そのままで使っている方は、BaseControllerに名前空間つけて、
extends時に忘れずにuse書きましょう。
プロバイダー等も作っていつも通りapp.phpに追記するだけです。

AcmeServiceRepository.php
class AcmeServiceProvider extends ServiceProvider
{

    public function register()
    {
        $this->app->bind(
            'Acme\Repositories\AcmeRepositoryInterface',
            'Acme\Repositories\AcmeRepository'
        );
    }
}

ルーターもいつも通りです

routes.php
\Route::group(['namespace' => 'Acme\Controllers'], function() {
    // 
    \Route::group(['prefix' => 'api', 'namespace' => 'Resource'], function() {
        \Route::resource('v1/activity', 'ActivityController', ['only' => ['show']]);
        \Route::resource('v1/user', 'UserController', ['only' => ['index']]);
    });

    \Route::controller('user', 'UserController');
    \Route::controller('/', 'HomeController');

});

是非どうぞー