12
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

LaravelAdvent Calendar 2013

Day 18

laravelでmodule laravel-modules

Last updated at Posted at 2013-12-18

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

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

インストール

composer.jsonrequire に追記

composer.json
{
  "require": {
    "creolab/laravel-modules": "dev-master"
  }
}
php composer.phar update

次に app/config/app.phpproviders に追記

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

composer.jsonautoloadclassmap に追記

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

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

mkdir app/modules

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

php artisan config:publish creolab/laravel-modules

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

app/config/packages/creolab/laravel-modules/config.php
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 に記述するだけですぐ使えます

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

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

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

php artisan modules:generate blog controller MainController

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

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');

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

php artisan modules:generate blog view index

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

app/modules/blog/views/index.blade.php
index.blade
app/modules/blog/routes.php
Route::resource('blog','MainController')

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

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

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

use BaseController, View;

class MainController extends BaseController {

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

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

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

12
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?