Laravelでクラスをnewする

今回はLaravelでのクラスのnewの仕方です。
正確には、Laravelでの他ファイルで作成したClassの読み込み方です。
通常phpではrequireを利用しますが、たぶんLaravelではそれは美しくないと思われている(と僕が勝手に思っている)。

どうやらautoloadという仕組みがあるらしく、それによってrequireを宣言せずにクラスを自動で使えるようにしてくれるみたいです。

composer.jsonに追記する

今回私は/app/models/viewmodelsというフォルダを新規に作成して、その中に新しいクラスを作成しました。
そしてこのクラスをコントローラでnewしたいのですが、上手くできません。

そこでautoloadでのload対象設定を記述してあるcomposer.jsonを修正します。
今回は以下のように修正します。

"autoload": {  
        "classmap": [  
        "app/commands",  
        "app/controllers",  
        "app/models",  
        "app/models/viewmodels",  
        "app/database/migrations",  
        "app/database/seeds",  
        "app/tests/TestCase.php"  
    ]  
}  

app/models/viewmodelsが追加されています。

またjsonを更新したら以下のコマンドを/app直下で実行しましょう。
/app直下というよりは、composer.jsonがある場所ですね。

$ composer dump-autoload  

これでautoloadが更新され、viewmodels内のクラスも利用することができるようになりました。

ちなみにこのとき/app/vendor/composer/autoload_classmap.phpが更新されています。

global.phpの編集

もし上記だけで動かなかったら、こちらも修正してみてください。

/app/start/global.php

ClassLoader::addDirectories(array(  
    app_path().'/commands',  
    app_path().'/controllers',  
    app_path().'/models',  
    app_path().'/models/viewmodels',  
    app_path().'/database/seeds',  
));  

これでできるかと思います。
基本的にはこっちはlaravelそのもので設定する方法になります。

composerではautoloadというモジュールを利用しているという感じでしょう。