Laravel5で私のコレクション管理用のアプリケーションを下記のような仕様で作成したいと思います。
- テーブルは、gathersとcategories
- アクセスできるのは、メンバーのみ
まず最初に、Laravel5のスキーマビルダーでデータベーステーブルを作成したいと思います。migrationで管理するのが基本だと思いますが、ブラウザでデータベーステーブルを作成する仕様でアプリケーションを設計します。
SetupControllerの作成
それでは、データベーステーブルを作成するためのコントローラ名をSetupControllerとして作成するために、コマンドプロンプトから下記を入力します。
cd C:\xampp\htdocs\laravel php artisan make:controller SetupController
これで、app/Http/Controllers/SetupController.phpが生成されます。作成されたSetupControllerをルーターに登録するために、下記を追加します。
app/Http/routes.php
Route::controller('setup','SetupController');
SetupControllerのindexアクションをgetIndexに修正して、下記のように入力します。
app/Http/Controllers/SetupController.php
public function getIndex(){ return view('setup.index'); }
ビューファイルを作成します。
app/resources/views/setup/index.blade.php
@extends('app') @section('content') <div class="container"> <h2>テーブルの作成</h2> @if(Session::has('message')) <p class="{{Session::get('alert')}}"> {{ Session::get('message') }} </p> @endif <a href="{{ url('setup/create/gathers') }}" type="button" class="btn btn-primary btn-lg btn-block">gathersテーブルの作成</a> <a href="{{ url('setup/create/categories') }}" type="button" class="btn btn-primary btn-lg btn-block">categoriesテーブルの作成</a> </div> @endsection
そしてCreateアクションを作成します。
app/Html/Controllers/SetupController.php
<?php namespace App\Http\Controllers; use App\Http\Requests; use App\Http\Controllers\Controller; use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Http\Request; class SetupController extends Controller { public function getCreate($db_table){ //テーブルの存在確認 if(Schema::hasTable($db_table)){ return redirect() ->back() ->withMessage("{$db_table}テーブルが存在しますので、処理を中止します") ->withAlert("alert alert-danger"); } if($db_table == 'gathers'): Schema::create($db_table, function(Blueprint $table){ $table->increments('id'); $table->string('name',100); $table->integer('category_id')->index(); $table->string('code',100)->index(); $table->text('description')->nullable(); $table->timestamps(); $table->timestamp('deleted_at',null)->nullable(); }); return redirect() ->back() ->withMessage("{$db_table}テーブルを作成しました") ->withAlert('alert alert-success'); elseif($db_table == 'categories'): Schema::create($db_table, function(Blueprint $table) { $table->increments('id'); $table->string('name',100); $table->text('description')->nullable(); }); return redirect() ->back() ->withMessage("{$db_table}テーブルを作成しました") ->withAlert("alert alert-success"); else: Schema::create($db_table, function(Blueprint $table) { $table->increments('id'); $table->string('name'); $table->text('description')->nullable(); $table->timestamps(); $table->timestamp('deleted_at',null)->nullable(); }); return redirect() ->back() ->withMessage("{$db_table}テーブルを作成しました") ->withAlert('alert alert-success'); endif; } }
2-6行目:必要なクラスをインポートしています。Laravel5からは、名前空間が必須となり、それぞれのクラスは事前にインポートするか、名前空間付きのクラス名を指定する必要があります。尚、Schemaクラスに関しては、ファサードでProviderを登録していますので、\Schema::create()でも使用することができます。
10-16行目:データベース内に指定したテーブルが存在するかどうかを確認します。テーブルが存在した場合は、テーブルの生成を中止します。尚、ここで、既存のテーブルを削除するかどうかの確認をしながら先に進める方法もあると思います。
14-15行目:フラッシュデータを付与してリダイレクトします。フラッシュデータはSession::get()で取得することができます。
17-30行目:URLのパラメータにgathersを渡されたときの処理(gathersテーブルの作成)を記述しています。
31-41行目:URLのパラメータにcategoriesを渡されたときの処理(categoriesテーブルの作成)を記述しています。
42-54行目:URLのパラメータに上記以外を渡されたときの処理を記述しています。ここでは、単にブラウザにパラメータを入力するだけで簡単に入力したパラメータ名のデータベーステーブルを作成することができます。只、これに関しては、誰でも勝手にデータベーステーブルを作成することができますので、後で修正します。
アクセス制限
このままでは、誰でもSetupControllerにアクセスできますので、登録されたメンバーのみがアクセスできるようにアクセス制限をかけます。
SetupControllerのコンストラクターにAuthを指定します。最初の方に、下記を追加します。
app/Http/Controllers/SetupController.php
public function __construct(){ $this->middleware('auth'); }
本日は、ブラウザから、データベーステーブルを生成する方法をご紹介しました。
本日のポイント
- Controllerの生成は、Aritisanコマンドで生成する方が楽
- php artisan make:controller コントローラ名
- これで、自動的に名前空間を記述してくれるし、標準で使用するクラスをインポートしてくれる
- 生成されたControllerはresourceフルコントローラなので、そのまま使用するには、routes.phpに
- Route::resource('URI','コントローラ名'); で登録する
- HTTP動詞によるアクション(メソッド)の使い分けをするには、routes.phpに
- Route::controller('URI','コントローラ名'); で登録する
- この場合、アクション(メソッド)名の前に、必ず下記のようにHTTP動詞を付与する
- getIndex()、postIndex()、anyIndex() 等
- 尚、Route::controllers(['URI'=>'コントローラ名'])で、複数のコントローラを同時に登録することもできる。
- リダイレクト時に、フラッシュデータを付与することができる。
- ->withMessage('これはメッセージです')
- ->with('message','これはメッセージです')
- フラッシュデータはSession::get()で取得することができる
- Session::get('message')
- 存在確認は、Session::has('message')
- タイプヒントで指定することで、インスタンス化されたオブジェクトにアクセスすることができる
- function(Blueprint $table) と指定することで
- $table->string()のメソッドが使用できる
- middlewareは、Laravel4のルートフィルターと基本的には同じです。
- middlewareはデフォルトでapp/Http/Middlewareフォルダに生成されています。
- 全HTTPリクエストで実行するmiddlewareはapp/Http/Kernel.phpクラスの$middlewareプロパティに登録する
- 個別に使用するmiddlewareは、$routeMiddlewareプロパティに登録する
次回は、新規データを作成します。