WinRoadのLaravel4初心者講座

次世代PHPフレームワークのLaravel4を初心者向けに解説して参ります。

Winroad徒然草の管理人がお届けします
開発メモ1_Setupコントローラ

開発メモ1_Setupコントローラ

このエントリーをはてなブックマークに追加

社内サイトの開発メモを記述しておきます。本来なら、Github等に作成するのでしょうが、こちらの方が細かいメモ書きや考え方の変遷とかも書き殴れるので、ここに記述しておきたいと思います。

まず、同じようなアプリケーションを何度も作るのは面倒ですので、Setupコントローラを作成しておきます。Artisanコマンドとして登録しておく方法もあるのですが、コマンドが使えない環境でも、データベーステーブルが作成できるように、Setupコントローラとして、スキーマクラスで作成しておきます。

尚、以下は私の社内サイトの設計段階のメモですので、テストは行っていませんし、何度も勝手に修正しますので、悪しからず。(^0^)

SetupControllerの作成

app/controllers/SetupController.php
<?php
class SetupController extends BaseController{
//セットアップビューの表示
public function getIndex(){
 return View::make('setup/index');
}
//usersテーブルの作成
public function getUsers(){
 //usersテーブルの存在確認
 if(Schema::hasTable('users')){
 $data['warning']='usersテーブルが存在しますので、処理を中止します。';
 return View::make('setup/index',$data);
 }
 //usersテーブルの作成
 Schema::create('users',function($table){
 $table->increments('id');
 $table->string('name',32);
 $table->string('email',100);
 $table->string('password',64);
 $table->string('onepass');
 $table->tinyinteger('activate')->default(0);
 $table->integer('role_id')->nullable();
 $table->integer('group_id')->nullable();
 //created_atとupdated_atの同時作成
 $table->timestamps();
 //deleted_atカラムを追加
 $table->timestamp('deleted_at')->nullable();
 });
 //初期Adminの作成
 User::create(array(
 'name'=>'Admin',
 'email'=>'admin@winroad.jp',
 'password'=>'admin',
 'onepass'=>md5('admin'.time()),
 'activate'=>1,
 'role_id'=>1,
 'group_id'=>1,
 ));
 $data['warning']='usersテーブルを作成しました。';
 return View::make('setup/index',$data);
 }
/*
|---------------------------------------------
| profilesテーブルの作成
|---------------------------------------------
*/
public function getProfiles(){
 //usersテーブルの存在確認
 if(Schema::hasTable('profiles')){
 $data['warning']='profilesテーブルが存在しますので、処理を中止します。';
 return View::make('setup/index',$data);
 }
 //usersテーブルの作成
 Schema::create('profiles',function($table){
 $table->increments('id');
 //usersテーブルへのリレーション用
 $table->integer('user_id')->nullable();
 //address関連情報(シリアライズ)
 $table->text('address')->nullable();
 //身体関連情報(シリアライズ)
 $table->text('body')->nullable();
 //資格関連情報(シリアライズ)
 $table->text('license')->nullable();
 //労務関連情報(シリアライズ)
 $table->text('labor')->nullable();
 //家族関連情報(シリアライズ)
 $table->text('family')->nullable();
 //その他(シリアライズ)
 $table->text('note')->nullable();
 //created_atとupdated_atの同時作成
 $table->timestamps();
 //deleted_atカラムを追加
 $table->timestamp('deleted_at')->nullable();
 });
 $data['warning']='profilesテーブルを作成しました。';
 return View::make('setup/index',$data);
 }
/*
|---------------------------------------------
| rolesテーブルの作成
|---------------------------------------------
*/
public function getRoles(){
 //rolesテーブルの存在確認
 if(Schema::hasTable('roles')){
 $data['warning']='rolesテーブルが存在しますので、処理を中止します。';
 return View::make('setup/index',$data);
 }
 //rolesテーブルの作成
 Schema::create('roles',function($table){
 $table->increments('id');
 $table->string('name',32);
 $table->integer('level')->nullable();
 //created_atとupdated_atの同時作成
 $table->timestamps();
 //deleted_atカラムを追加
 $table->timestamp('deleted_at')->nullable(); 
 });
 //新規Roleの作成
 Role::create(array(
 'name'=>'Admin',
 'level'=>100,
 ));
 Role::create(array(
 'name'=>'Manager',
 'level'=>70,
 ));
 Role::create(array(
 'name'=>'Moderator',
 'level'=>50,
 ));
 Role::create(array(
 'name'=>'Staff',
 'level'=>30,
 ));
 Role::create(array(
 'name'=>'User',
 'level'=>1,
 ));
 Role::create(array(
 'name'=>'Banned',
 'level'=>0,
 ));
 $data['warning']='rolesテーブルを作成しました。';
 return View::make('setup/index',$data);
 }
/*
|---------------------------------------------
| groupsテーブルの作成
|---------------------------------------------
*/
public function getGroups(){
 //groupsテーブルの存在確認
 if(Schema::hasTable('groups')){
 $data['warning']='groupsテーブルが存在しますので、処理を中止します。';
 return View::make('setup/index',$data);
 }
 //groupsテーブルの作成
 Schema::create('groups',function($table){
 $table->increments('id');
 //グループ略称
 $table->string('abbreviation',100);
 //グループ名(会社名・所属先)
 $table->string('name',100);
 $table->integer('level')->nullable();
 //created_atとupdated_atの同時作成
 $table->timestamps();
 //deleted_atカラムを追加
 $table->timestamp('deleted_at')->nullable(); 
 });
 //新規Groupの作成
 Group::create(array(
 'abbreviation'=>'Builwing',
 'name'=>'株式会社ビルウイング',
 'level'=>100,
 ));
 $data['warning']='groupsテーブルを作成しました。';
 return View::make('setup/index',$data);
 }
/*
|---------------------------------------------
| belongs(部署・所属先)テーブルの作成
|---------------------------------------------
*/
public function getBelongs(){
 //belongsテーブルの存在確認
 if(Schema::hasTable('belongs')){
 $data['warning']='belongsテーブルが存在しますので、処理を中止します。';
 return View::make('setup/index',$data);
 }
 //belongsテーブルの作成
 Schema::create('belongs',function($table){
 $table->increments('id');
 //部署名
 $table->string('name',100)->nullable();
 $table->integer('group_id')->nullable();
 //address関連情報(シリアライズ)
 $table->text('address')->nullable();
 //取引関連情報(シリアライズ)
 $table->text('business')->nullable();
 //内部関連情報(シリアライズ)
 $table->text('inside')->nullable();
 //備考情報(シリアライズ)
 $table->text('note')->nullable();
 //created_atとupdated_atの同時作成
 $table->timestamps();
 //deleted_atカラムを追加
 $table->timestamp('deleted_at')->nullable(); 
 });
 $data['warning']='belongsテーブルを作成しました。';
 return View::make('setup/index',$data);
 }
/*
|---------------------------------------------
| users関連テーブルの一括作成
|---------------------------------------------
| 1.usersテーブルの作成
| 2.profileテーブルの作成
| 3.rolesテーブル及び基本Roleの作成
| 4.groups(会社、所属先)テーブルの作成
| 5.belong(部署)テーブルの作成
|
*/
//usersテーブルの作成
public function getAll(){
 //usersテーブルの存在確認
 if(Schema::hasTable('users')){
 $data['warning']='usersテーブルが存在しますので、処理を中止します。';
 return View::make('setup/index',$data);
 }
 //usersテーブルの作成
 Schema::create('users',function($table){
 $table->increments('id');
 $table->string('name',32);
 $table->string('email',100);
 $table->string('password',64);
 $table->string('onepass');
 $table->tinyinteger('activate')->default(0);
 $table->integer('role_id')->nullable();
 $table->integer('group_id')->nullable();
 //created_atとupdated_atの同時作成
 $table->timestamps();
 //deleted_atカラムを追加
 $table->timestamp('deleted_at')->nullable();
 });
 //初期Adminの作成
 User::create(array(
 'name'=>'Admin',
 'email'=>'admin@winroad.jp',
 'password'=>'admin',
 'onepass'=>md5('admin'.time()),
 'activate'=>1,
 'role_id'=>1,
 'group_id'=>1,
 ));
/*
|---------------------------------------------
| profilesテーブルの作成
|---------------------------------------------
*/
 //usersテーブルの存在確認
 if(Schema::hasTable('profiles')){
 $data['warning']='profilesテーブルが存在しますので、処理を中止します。';
 return View::make('setup/index',$data);
 }
 //profilesテーブルの作成
 Schema::create('profiles',function($table){
 //usersテーブルへのリレーション用
 $table->integer('user_id')->nullable();
 $table->increments('id');
 //address関連情報(シリアライズ)
 $table->text('address')->nullable();
 //身体関連情報(シリアライズ)
 $table->text('body')->nullable();
 //資格関連情報(シリアライズ)
 $table->text('license')->nullable();
 //労務関連情報(シリアライズ)
 $table->text('labor')->nullable();
 //家族関連情報(シリアライズ)
 $table->text('family')->nullable();
 //その他(シリアライズ)
 $table->text('note')->nullable();
 //$table->integer('group_id')->nullable();
 $table->text('profile')->nullable();
 //created_atとupdated_atの同時作成
 $table->timestamps();
 //deleted_atカラムを追加
 $table->timestamp('deleted_at')->nullable();
 });
/*
|---------------------------------------------
| rolesテーブルの作成
|---------------------------------------------
*/
 //rolesテーブルの存在確認
 if(Schema::hasTable('roles')){
 $data['warning']='rolesテーブルが存在しますので、処理を中止します。';
 return View::make('setup/index',$data);
 }
 //rolesテーブルの作成
 Schema::create('roles',function($table){
 $table->increments('id');
 $table->string('name',32);
 $table->integer('level')->nullable();
 //created_atとupdated_atの同時作成
 $table->timestamps();
 //deleted_atカラムを追加
 $table->timestamp('deleted_at')->nullable(); 
 });
 //新規Roleの作成
 Role::create(array(
 'name'=>'Admin',
 'level'=>100,
 ));
 Role::create(array(
 'name'=>'Manager',
 'level'=>70,
 ));
 Role::create(array(
 'name'=>'Moderator',
 'level'=>50,
 ));
 Role::create(array(
 'name'=>'Staff',
 'level'=>30,
 ));
 Role::create(array(
 'name'=>'User',
 'level'=>1,
 ));
 Role::create(array(
 'name'=>'Banned',
 'level'=>0,
 ));
/*
|---------------------------------------------
| groupsテーブルの作成
|---------------------------------------------
*/
 //groupsテーブルの存在確認
 if(Schema::hasTable('groups')){
 $data['warning']='groupsテーブルが存在しますので、処理を中止します。';
 return View::make('setup/index',$data);
 }
 //groupsテーブルの作成
 Schema::create('groups',function($table){
 $table->increments('id');
 //グループ略称
 $table->string('abbreviation',100);
 //グループ名(会社名・所属先)
 $table->string('name',100);
 $table->integer('level')->nullable();
 //created_atとupdated_atの同時作成
 $table->timestamps();
 //deleted_atカラムを追加
 $table->timestamp('deleted_at')->nullable(); 
 });
 //新規Groupの作成
 Group::create(array(
 'abbreviation'=>'Builwing',
 'name'=>'株式会社ビルウイング',
 'level'=>100,
 ));
/*
|---------------------------------------------
| belongs(部署・所属先)テーブルの作成
|---------------------------------------------
*/
 //belongsテーブルの存在確認
 if(Schema::hasTable('belongs')){
 $data['warning']='belongsテーブルが存在しますので、処理を中止します。';
 return View::make('setup/index',$data);
 }
 //belongsテーブルの作成
 Schema::create('belongs',function($table){
 $table->increments('id');
 //部署名
 $table->string('name',100)->nullable();
 $table->integer('group_id')->nullable();
 //address関連情報(シリアライズ)
 $table->text('address')->nullable();
 //取引関連情報(シリアライズ)
 $table->text('business')->nullable();
 //内部関連情報(シリアライズ)
 $table->text('inside')->nullable();
 //備考情報(シリアライズ)
 $table->text('note')->nullable();
 //created_atとupdated_atの同時作成
 $table->timestamps();
 //deleted_atカラムを追加
 $table->timestamp('deleted_at')->nullable(); 
 });
 $data['warning']='全users関連の一括作成が完了しました。';
 return View::make('setup/index',$data);
 }
}
  • ユーザー関連情報として、users、profiles、roles、groups、belongsの5つのテーブルを作成する。
  • usersテーブルは、認証用の基本的情報にとどめる。
  • 当初、profilesテーブルは、usersテーブルと1対1の関係にする予定だったが、過去のプロフィールも残しておきたいので、1対多(pfofiles)に修正。
  • profiles情報は、情報項目が増えてもいいように、分類項目を作成して、中身をシリアライズで配列情報として保存しておく予定。
  • rolesテーブルは、usersの権限を制御するために使用する予定。
  • groupsテーブルは、usersの会社の基本情報を保存しておく予定。groupsにもusers同様にレベルを設定して権限の制御ができるようにする予定。
  • belongsテーブルで、各ユーザー所属先の詳細情報を保存する予定。profiles同様に、ほとんどの分類項目をシリアライズで配列情報として保存する予定。

Userモデルの修正

ユーザーモデルに下記のコードを追加

app/models/User.php
/*
|---------------------------------------------
| パスワードセッター
|---------------------------------------------
*/
public function setPasswordAttribute($value){
$this->attributes['password']=Hash::make($value);
}
/*
|--------------------------------------------
| 複数代入禁止フィールドの指定
|--------------------------------------------
*/
protected $guarded=array('id');

/*
|--------------------------------------------
| リレーションの指定
|--------------------------------------------
*/
public function role(){
return $this->belongsTo('Role');
}
public function group(){
return $this->belongsTo('Group');
}
/*
|--------------------------------------------
| ソフトデリートの設定
|--------------------------------------------
*/
protected $softDelete = true;

各モデルの追加

グループモデルの追加

app/models/Group.php
<?php
class Role extends Eloquent{
 protected $softDelete=true;
 protected $guarded=array('id');
}

ロールモデルの追加

app/models/Role.php
<?php
class Role extends Eloquent{
 protected $softDelete=true;
 protected $guarded=array('id');
}

プロフィールモデルの追加

app/models/Profile.php
<?php
class Profile extends Eloquent{
 protected $softDelete=true;
 protected $guarded=array('id');
/*
|--------------------------------------------
| リレーションの指定
|--------------------------------------------
*/
 public function user(){
 return $this->belongsTo('User');
}
}
  • usersテーブルとprofilesテーブルを1対多のリレーションに設定。過去のプロフィールデータも残しておくため。

所属先(Belongs)モデルの作成

app/models/Belong.php
<?php
class Belong extends Eloquent{
 protected $softDelete=true;
 protected $guarded=array('id');
/*
|--------------------------------------------
| リレーションの指定
|--------------------------------------------
*/
 public function group(){
 return $this->belongsTo('Group');
}
}

Setupビューの作成

setupビューを下記のように作成します。レイアウトはFoundation4で作成することにします。いずれは(レイアウトがある程度決まってきたら)、リスト形式に変更すると思うが、とりあえずはテーブル形式で作成。

app/views/setup/index.blade.php
@extends('layouts.f4.base')
@section('content')
@if(isset($warning))
<h4 style="color:red;text-align:center">{{ $warning }}</h4>
<p><br>
@endif</p>
<table width="100%" border="0">
 <tr>
 <td>1</td>
 <td>{{ HTML::link('setup/users','ユーザーテーブルの作成') }}</td>
 </tr>
 <tr>
 <td>2</td>
 <td>{{ HTML::link('setup/profiles','プロフィールテーブルの作成') }}</td>
 </tr>
 <tr>
 <td>3</td>
 <td>{{ HTML::link('setup/roles','ロールテーブルの作成') }}</td>
 </tr>
 <tr>
 <td>4</td>
 <td>{{ HTML::link('setup/groups','グループテーブルの作成') }}</td>
 </tr>
 <tr>
 <td>5</td>
 <td>{{ HTML::link('setup/belongs','所属先テーブルの作成') }}</td>
 </tr>
 <tr>
 <td>6</td>
 <td>{{ HTML::link('setup/all','上記全テーブルの一括作成') }}</td>
 </tr>
</table>
@stop

ルーターの作成

SetupControllerをRESTフルコントローラとしてルーターに登録。

app/routes.php
Route::controller('setup','SetupController');

« »

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です