比較的規模の大きなサービスなど、モジュールに分ると便利な場合があります。
マイクロフレームワークといわれるlaravelでやるには
ややコンセプトから外れるかもしれませんが出来るみたいなので試してみました。
creolab/laravel-modules
https://github.com/creolab/laravel-modules
インストール
composer.json
の require
に追記
{
"require": {
"creolab/laravel-modules": "dev-master"
}
}
php composer.phar update
次に app/config/app.php
の providers
に追記
'providers' => array(
'Creolab\LaravelModules\ServiceProvider',
'Way\Generators\GeneratorsServiceProvider'
)
composer.json
の autoload
の classmap
に追記
{
"autoload": {
"classmap": [
"app/modules"
]
}
}
次に今指定したディレクトリを作成します。
mkdir app/modules
次に下記コマンドを実行して設定ファイルを publish
します。
php artisan config:publish creolab/laravel-modules
すると以下のファイルが生成されます。
この時modeを manifest
にしておくことをオススメします。
autoだと都度スキャンをしてマニフェストファイルを作成し直すので、開発時は便利ですが
ファイルオーナーが変わってしまって表示ができなくなったり artisan routes
の結果がおかしくなる罠があるので
常にマニフェストファイルから読み込むモードにしておくのが無難だと思います。
そのかわり構成変更時に手動で artisan modules:scan
を忘れずに。
return array(
'mode' => 'manifest',
);
これで準備完了です。
次にモジュールを作成してみます
モジュールの作成
php artisan modules:create blog
これでさっき作った app/modules
の中にblogディレクトリが作成されて
その中にappと同じ構成のディレクトリとファイルが生成されます。
app/modules/blog
|-- assets
|-- config
|-- controllers
|-- lang
|-- migrations
|-- models
|-- module.json
|-- routes.php
`-- views
#使い方
とりあえず routes.php
に記述するだけですぐ使えます
Route::get('blog', function() {
return 'blogページ';
});
## generatorコマンドで楽をする
もうすでに入れてる人も多いと思いますが
まだ入れていない場合はこれも自動でインストールされ連携することができます。
php artisan modules:generate blog controller MainController
これを実行すると、今回作成したblogモジュールのcontrollerディレクトリにファイルが作成されます
<?php
class MainController extends BaseController {
/**
* Display a listing of the resource.
*
* @return Response
*/
public function index()
{
return View::make('mains.index');
}
//......
View::make
も記述されていますがviewファイルは作成されないので自分でつくらなきゃいけません。
しかも 'mains.index' とかなっています。
このままだと app/views/mains/index.blade.php
を参照してしまうので修正する必要があります。
内部でgeneratorコマンドを打っているだけなのでしょうがないのかもしれません。
このように::で区切ってモジュール名を指定する必要があります。
View::make('blog::index');
次にビューファイルを作成します
php artisan modules:generate blog view index
すると以下のようなファイルが作成されます。
index.blade
Route::resource('blog','MainController')
これで無事 /blog
にアクセスするとテンプレートが表示されます。
##名前空間の設定
ただこのままだと他のモジュールとクラス名がかぶってしまう可能性があります。
さっきのコントローラクラスを名前空間の管理下に入れます
<?php namespace App\Modules\Blog\Controllers;
use BaseController, View;
class MainController extends BaseController {
//....
Route::resource('blog','App\Modules\Blog\Controllers\MainController')
コントローラやモデルのクラスにnamespaceをつけると
コード量が増えるのでやっぱりlaravelには向いていない気がします。
仕様を変更する可能性があることを示唆しているので
しばらくはまだ様子見かもしれません。