Laravel5で社内専用サイト(6-2)

前回、テーブルとモデルを作成しましたので、本日は、それらのテーブルにデータを入力してみたいと思います。まず最初にAclコントローラを作成します。

ACLコントローラの作成

AclController.phpを作成するために、コマンドプロンプトに下記のように入力します。

php artisan make:controller Auth\AclController

これで、app/Http/Controllers/Authフォルダ内にAclController.phpが生成されます。

ルーターにAclControllerを登録します。

app/Http/routes.php

Route::controller('acl','Auth\AclController');

それでは、まず最初に、AclControllerで使用するモデルをuse演算子で追加します。

app/Http/Controllers/Auth/AclController.php

<?php namespace App\Http\Controllers\Auth;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;
//以下の3つのモデルを追加します
use App\Models\Role;
use App\Models\Permission;
use App\User;

そして、一覧表示用のgetIndexと、getCreate、postCreateのメソッドを作成します。

class AclController extends Controller
{
 public function __construct()
 {
 $this->middleware('auth');
 }
 
 /**
 * ロールとパーミッションの表示
 *
 * @return Response
 */
 public function getIndex()
 {
 $roles=Role::paginate();
 $roles->setPath('index');
 $permissions=Permission::paginate();
 $permissions->setPath('index');
 return view('role.index',compact('roles','permissions'));
 }
/**
 * ロールおよびパーミッションの作成
 *
 * @return Response
 */
 public function getCreate()
 {
 return view('role.create');
 }
 public function postCreate(Request $request)
 {
 if($request->check == 'role'):
 $val=$this->Validate($request,[
 'name' => 'required|unique:roles'
 ]);
 $role=new Role();
 $role->name=$request->name;
 $role->display_name=$request->display_name ?: null;
 $role->description=$request->description ?: null;
 $role->save();
 else:
 $val=$this->Validate($request,[
 'name' => 'required|unique:permissions'
 ]);
 $permission=new Permission();
 $permission->name=$request->name;
 $permission->display_name=$request->display_name ?: null;
 $permission->description=$request->description ?: null;
 $permission->save();
 endif;
 return redirect()->to('role/index');
 }
}
  • 3-7行目:とりあえず、デフォルトのauthを設定しておきます。これで、アクセスしていない、ユーザーはこのコントローラーの処理を行うことができません。
  • 16行目と18行目:現状は、ビューの$roles->render()や、$permissions->render()で2ページ目以降が、正しく表示されていませんので、これを追加しておきました。
  • 32行目:ビューのラジオボタンでロールの入力か、パーミッションの入力かを選択してデータを入力するように作成しています。それに応じて、バリデーションを変えています。
  • 33行目:$this->validate()メソッドは、ValidateRequestトレイトのvalidate()メソッドを使用しています。このメソッドは、バリデーション不可なら、元のページへエラーと入力値を持ってリダイレクトします。第1引数に、$requestオブジェクト、第2引数にバリデーションルールを指定するだけなので、とても簡単に使用できます。

ビューの作成

app/resources/acl/index.blade.php

@extends('tbs.base')
 @section('navbar')
 @include('acl.navbar')
 @stop
 @section('content')
 <h2>ロールとパーミッション</h2>
 <table class="table table-bordered table-striped">
 <thead>
 <tr>
 <th>ロール名</th>
 <th>表示名</th>
 <th>説明</th>
 </tr>
 </thead>
 <tbody>
 @foreach($roles as $role)
 <tr>
 <td>{{ $role->name }}</td>
 <td>{{ $role->display_name }}</td>
 <td>{{ $role->description }}</td>
 </tr>
 @endforeach
 </tbody>
 </table>
 {!! $roles->render() !!}
<table class="table table-bordered table-striped">
 <thead>
 <tr>
 <th>パーミッション名</th>
 <th>表示名</th>
 <th>説明</th>
 </tr>
 </thead>
 <tbody>
 @foreach($permissions as $permission)
 <tr>
 <td>{{ $permission->name }}</td>
 <td>{{ $permission->display_name }}</td>
 <td>{{ $permission->description }}</td>
 </tr>
 @endforeach
 </tbody>
 </table>
 {!! $permissions->render() !!}
 @stop
  • 25行目:以前は、$roles->links()でしたが、$roles->render()に変更になっています。尚、{{  }}は、デフォルトで全てのデータをエスケープしますので、エスケープせずにそのまま出力するには、{!!  !!}記法を使用するようにしてください。

app/resources/acl/create.blade.php

@extends('tbs.base')
@section('navbar')
 @include('acl.navbar')
@stop
@section('content')
<form method="post" class="form-horizontal">
{!! csrf_field() !!}
 <div class="radio col-sm-10 col-sm-offset-2">
 <label>
 <input type="radio" name="check" value="role" checked>ロールの作成
 </label>
 </div>
 <div class="radio col-sm-10 col-sm-offset-2">
 <label>
 <input type="radio" name="check" value="permission">パーミッションの作成
 </label>
 </div>
 <div class="form-group">
 <label class="control-label col-sm-2">名前</label>
 <div class="col-sm-10">
 <input type="text" name="name" class="form-control">
 @if($errors->first('name'))
 <p class='alert alert-danger'>{{ $errors->first('name') }}</p>
 @endif
 </div>
 </div>
 <div class="form-group">
 <label class="control-label col-sm-2">表示名</label>
 <div class="col-sm-10">
 <input type="text" name="display_name" class="form-control">
 </div>
 </div>
 <div class="form-group">
 <label class="control-label col-sm-2">説明</label>
 <div class="col-sm-10">
 <input type="text" name="description" class="form-control">
 </div>
 </div> 
 <div class="form-group">
 <div class="col-sm-4 col-sm-offset-2">
 <input type="submit" value="新規作成" class="btn btn-primary">
 </div>
 </div> 
</form>
@stop
  • 7行目:csrf_filed()は、csrf_token()データを含んだ、hiddenタイプのinputタグを生成します。必ず、フォームのどこかに入力してください。

それでは、データをいくつか入力してみます。下記のようにいくつかのロールとパーミッションを登録しました。

2015-08-17 15-56-54

  • パーミッション名は、コントローラ名/メソッド名で記述するように作成しました。パーミッション名とURI名を一緒にすることで、わかり易く管理できるのでは、ないかと考えました。

本日は、以上です。

このエントリーを含むはてなブックマーク Buzzurlにブックマーク livedoorクリップ Yahoo!ブックマークに登録

トラックバック&コメント

この投稿のトラックバックURL:

コメントをどうぞ

このページの先頭へ