laravelでmodule  laravel-modules

比較的規模の大きなサービスなど、モジュールに分ると便利な場合があります。
マイクロフレームワークといわれるlaravelでやるには
ややコンセプトから外れるかもしれませんが出来るみたいなので試してみました。

**creolab/laravel-modules**
https://github.com/creolab/laravel-modules

# インストール

`composer.json` の `require` に追記

```json:composer.json
{
  "require": {
    "creolab/laravel-modules": "dev-master"
  }
}
```

```bash
php composer.phar update
```

次に `app/config/app.php` の `providers` に追記

```php:app/config/app.php
'providers' => array(
	'Creolab\LaravelModules\ServiceProvider',
	'Way\Generators\GeneratorsServiceProvider'
)
```

`composer.json` の `autoload` の `classmap` に追記

```json:composer.json
{
	"autoload": {
		"classmap": [
			"app/modules"
		]
	}
}
```

次に今指定したディレクトリを作成します。

```bash
mkdir app/modules
```

次に下記コマンドを実行して設定ファイルを `publish` します。

```bash
php artisan config:publish creolab/laravel-modules
```

すると以下のファイルが生成されます。
この時modeを `manifest` にしておくことをオススメします。
autoだと都度スキャンをしてマニフェストファイルを作成し直すので、開発時は便利ですが
ファイルオーナーが変わってしまって表示ができなくなったり `artisan routes` の結果がおかしくなる罠があるので
常にマニフェストファイルから読み込むモードにしておくのが無難だと思います。
そのかわり構成変更時に手動で `artisan modules:scan` を忘れずに。

```php:app/config/packages/creolab/laravel-modules/config.php
return array(

	'mode' => 'manifest',

);
```

これで準備完了です。
次にモジュールを作成してみます

# モジュールの作成

```bash
php artisan modules:create blog
```

これでさっき作った `app/modules` の中にblogディレクトリが作成されて
その中にappと同じ構成のディレクトリとファイルが生成されます。

```bash
app/modules/blog
|-- assets
|-- config
|-- controllers
|-- lang
|-- migrations
|-- models
|-- module.json
|-- routes.php
`-- views
```

#使い方

とりあえず `routes.php` に記述するだけですぐ使えます

```php:app/modules/blog/routes.php
Route::get('blog', function() {
	return 'blogページ';
});
```

##　generatorコマンドで楽をする

https://github.com/JeffreyWay/Laravel-Generator

もうすでに入れてる人も多いと思いますが
まだ入れていない場合はこれも自動でインストールされ連携することができます。

```bash
php artisan modules:generate blog controller MainController
```

これを実行すると、今回作成したblogモジュールのcontrollerディレクトリにファイルが作成されます

```php:app/modules/contoller/MainController.php
<?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コマンドを打っているだけなのでしょうがないのかもしれません。
このように::で区切ってモジュール名を指定する必要があります。

```app/modules/contoller/MainController.php
View::make('blog::index');
```

次にビューファイルを作成します

```bash
php artisan modules:generate blog view index
```

すると以下のようなファイルが作成されます。

```php:app/modules/blog/views/index.blade.php
index.blade
```

```php:app/modules/blog/routes.php
Route::resource('blog','MainController')
```

これで無事 `/blog` にアクセスするとテンプレートが表示されます。

##名前空間の設定
ただこのままだと他のモジュールとクラス名がかぶってしまう可能性があります。
さっきのコントローラクラスを名前空間の管理下に入れます

```php:app/modules/contoller/MainController.php
<?php namespace App\Modules\Blog\Controllers;

use BaseController, View;

class MainController extends BaseController {

	//....
```

```php:app/modules/blog/routes.php
Route::resource('blog','App\Modules\Blog\Controllers\MainController')
```

コントローラやモデルのクラスにnamespaceをつけると
コード量が増えるのでやっぱりlaravelには向いていない気がします。

仕様を変更する可能性があることを示唆しているので
しばらくはまだ様子見かもしれません。