Laravelで実装する際のプロジェクト構成例を1つ挙げます。
今回は一般的なMVCに加え、Serviceを使ってモデルとロジックを分離します。
あくまで私が使っている1例ですので、ご了承ください。
#Model
まずはテーブルを作成します。
# php artisan make:migration create_hoges_table
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateHogesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('hoges', function (Blueprint $table) {
$table->increments('id');
$table->string('hoge');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('hoges');
}
}
migrateしてテーブルを作ります。
# php artisan migrate
そしてモデルを作ります。
# php artisan make:model Hoge
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Hoge extends Model
{
protected $fillable = [
'hoge'
];
}
#Service
続いてサービスを作ります。
laravel/app/Servicesを作成し、
laravel/app/Services/HogeService.phpを作成します。
<?php
namespace App\Services;
use App\Hoge;
class HogeService{
public function getHoge(){
return Hoge::all();
}
}
laravel/app/Providers/AppServiceProvider.phpのregisterに追加します。
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
//
}
/**
* Register any application services.
*
* @return void
*/
public function register()
{
$this->app->bind('App\Services\HogeService');
}
}
#Route
Laravel5.4の基本構築は済んでいるものとします。
http://qiita.com/minechan1234/items/7e0cbe04bf5f3f405938
laravel/routes/web.phpに以下を追加します。
Route::resource('hoge', 'HogeController');
+--------+-----------+------------------------+------------------+------------------------------------------------------------------------+--------------+
| Domain | Method | URI | Name | Action | Middleware |
+--------+-----------+------------------------+------------------+------------------------------------------------------------------------+--------------+
| | GET|HEAD | / | | Closure | web |
| | GET|HEAD | api/user | | Closure | api,auth:api |
| | POST | hoge | hoge.store | App\Http\Controllers\HogeController@store | web |
| | GET|HEAD | hoge | hoge.index | App\Http\Controllers\HogeController@index | web |
| | GET|HEAD | hoge/create | hoge.create | App\Http\Controllers\HogeController@create | web |
| | DELETE | hoge/{hoge} | hoge.destroy | App\Http\Controllers\HogeController@destroy | web |
| | PUT|PATCH | hoge/{hoge} | hoge.update | App\Http\Controllers\HogeController@update | web |
| | GET|HEAD | hoge/{hoge} | hoge.show | App\Http\Controllers\HogeController@show | web |
| | GET|HEAD | hoge/{hoge}/edit | hoge.edit | App\Http\Controllers\HogeController@edit | web |
| | GET|HEAD | home | home | App\Http\Controllers\HomeController@index | web,auth |
| | POST | login | | App\Http\Controllers\Auth\LoginController@login | web,guest |
| | GET|HEAD | login | login | App\Http\Controllers\Auth\LoginController@showLoginForm | web,guest |
| | POST | logout | logout | App\Http\Controllers\Auth\LoginController@logout | web |
| | POST | password/email | password.email | App\Http\Controllers\Auth\ForgotPasswordController@sendResetLinkEmail | web,guest |
| | POST | password/reset | | App\Http\Controllers\Auth\ResetPasswordController@reset | web,guest |
| | GET|HEAD | password/reset | password.request | App\Http\Controllers\Auth\ForgotPasswordController@showLinkRequestForm | web,guest |
| | GET|HEAD | password/reset/{token} | password.reset | App\Http\Controllers\Auth\ResetPasswordController@showResetForm | web,guest |
| | POST | register | | App\Http\Controllers\Auth\RegisterController@register | web,guest |
| | GET|HEAD | register | register | App\Http\Controllers\Auth\RegisterController@showRegistrationForm | web,guest |
+--------+-----------+------------------------+------------------+------------------------------------------------------------------------+--------------+
この1行をrouteに追加することで、決められたアクションを登録出来ます。
以下のコマンドで登録されているrouteの一覧を取得出来ます。
※Controller等が無い場合はエラーになるので、作成してから実行してください。
# php artisan route:list
#Controller
コマンドで作れます。
# php artisan make:controller HogeController
laravel/app/Http/Controllers/HogeController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Services\HogeService;
class HogeController extends Controller
{
protected $hogeService;
public function __construct(HogeService $hoge_service)
{
$this->hogeService = $hoge_service;
}
public function index(Request $request)
{
$hoges = $this->hogeService->getHoge();
return view('hoge.index', compact('hoges'));
}
public function show($id){}
public function create(){}
public function store(Request $request){}
public function edit($id){}
public function update(Request $request, $id){}
public function destroy($id){}
}
#view
Bladeを使いますが、サンプルなので適当です。
laravel/resources/views/hogeというディレクトリを作成し、
laravel/resources/views/hoge/index.blade.phpを作成します。
<!DOCTYPE html>
<html>
<head></head>
<body>
<h1>Hello World!</h1>
@foreach($hoges as $hoge)
<p>{{$hoge->hoge}}</p>
@endforeach
</body>
</html>
以上です。
ザックリとした雰囲気ですが、このようなプロジェクト構成になります。
AppServiceProviderのregisterを変えるだけでテスト用のServiceに切り替えることが出来ます。
もっと細かい実装については後の記事で説明していきます。