WinRoadのLaravel4初心者講座

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

Winroad徒然草の管理人がお届けします
開発メモ5_CategoryControllerの作成

開発メモ5_CategoryControllerの作成

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

ProfileControllerで考察したとおり、各個人で、項目名を作成するのは、統制がとれないので、Adminが作成した項目名に対して各個人が内容を入力するように変更したいと思います。

作成手順

  1. SetupControllerによる(items、categories)テーブルの作成
  2. CategoryControllerの作成
  3. ItemControllerの作成
  4. 各コントローラのルーターへの登録(結構忘れがち)
  5. Categoryモデル、Itemモデルの作成及びリレーションの設定
  6. category/createビューの作成
  7. item/createビューの作成

categoriesテーブルの追加作成

app/controller/SetupController.php
/*
|---------------------------------------------
| category(分類)テーブルの作成
|---------------------------------------------
| 1. 分類項目管理用のテーブル
| 2. profilesやbelongsで使用予定
*/
 public function getCategories(){
 //categoriesテーブルの存在確認
 if(Schema::hasTable('categories')){
 $data['warning']='categoriesテーブルが存在しますので、処理を中止します。';
 return View::make('setup/index',$data);
 }
 //categoriesテーブルの作成
 Schema::create('categories',function($table){
 $table->increments('id');
 //categorye名
 $table->string('name',50);
 //categoryの説明
 $table->text('description')->nullable();
 //created_atとupdated_atの同時作成
 $table->timestamps();
 //deleted_atカラムを追加
 $table->timestamp('deleted_at')->nullable(); 
 });
 $data['warning']='categoriesテーブルを作成しました。';
 return View::make('setup/index',$data);
 }

itemsテーブルの追加作成

app/controller/SetupController.php
/*
|---------------------------------------------
| items(項目)テーブルの作成
|---------------------------------------------
| 1. 項目管理用のテーブル
| 2. profilesやbelongsで使用予定
*/
 public function getItems(){
 //itemsテーブルの存在確認
 if(Schema::hasTable('items')){
 $data['warning']='itemsテーブルが存在しますので、処理を中止します。';
 return View::make('setup/index',$data);
 }
 //itemsテーブルの作成
 Schema::create('items',function($table){
 $table->increments('id');
 //iteme名
 $table->string('name',100);
 //分類コード
 $table->integer('category_id')->nullable();
 //created_atとupdated_atの同時作成
 $table->timestamps();
 //deleted_atカラムを追加
 $table->timestamp('deleted_at')->nullable(); 
 });
 $data['warning']='itemsテーブルを作成しました。';
 return View::make('setup/index',$data);
 }

CategoryControllerの作成

app/controllers/CategoryControllers.php
<?php
class CategoryController extends BaseController{
/*
|----------------------------------------
| コンストラクター
|----------------------------------------
*/
 public function __construct(){
 //adminフィルター
 $this->beforeFilter('admin');
 //全POSTにcsrfフィルターの適用
 $this->beforeFilter('csrf',array('on'=>'post'));
 }

 public function getIndex(){
 echo 'getIndexです。';
 }
 //新規分類項目の作成
 public function getCreate(){
 $data['categories']=Item::all();
 return View::make('category/create',$data);
 }
 public function postCreate(){
 //受信データ
 $inputs=Input::only('name','description');
 //バリルール
 $rules=array(
 'name'=>'required|alpha',
 'description'=>'required',
 );
 //バリチェック
 $val=Validator::make($inputs,$rules);
 if($val->fails()){
 return Redirect::back()
 ->withInput()
 ->withErrors($val);
 }
 //分類項目の登録
 Category::create($inputs);
 return Redirect::intended('admin');
 }
}

ItemControllerの作成

app/controllers/ItemController.php
<?php
class ItemController extends BaseController{
/*
|----------------------------------------
| コンストラクター
|----------------------------------------
*/
 public function __construct(){
 //adminフィルター
 $this->beforeFilter('admin');
 //全POSTにcsrfフィルターの適用
 $this->beforeFilter('csrf',array('on'=>'post'));
 }

 public function getIndex(){
 echo 'getIndexです。';
 }
 //新規項目の作成
 public function getCreate(){
 $data['categories']=Category::all()->lists('name','id');
 return View::make('item/create',$data);
 }
 public function postCreate(){
 //受信データ
 $inputs=Input::only('name','category_id');
 //バリルール
 $rules=array(
 'name'=>'required',
 );
 //バリチェック
 $val=Validator::make($inputs,$rules);
 if($val->fails()){
 return Redirect::back()
 ->withInput()
 ->withErrors($val);
 }
 //Itemの新規作成
 Item::create($inputs);
 return Redirect::intended('admin');
 }
}
  • 20行目:listsメソッドは、カラム値のリストを取得するメソッドです。第1引数にカラム名を指定します。第2引数は、オプションで、キーを指定することができます。

ルーターに各コントローラを追加

結構、このルーターにコントローラを追加する作業を忘れて、エラーになる。気を付けよう。

app/controllers/routes.php
Route::controller('category','CategoryController');
Route::controller('item','ItemController');

Categoryモデルの作成

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

/*
|------------------------------------
| 1対多関係のリレーション
|------------------------------------
| CategoryはたくさんのItemを持つ
| Category::find(1)->items;
| でCategoryのItemへアクセスできます。
|
*/
 //1対多関係のリレーション
 public function items(){
 return $this->hasMany('Item');
 }
}

Itemモデルの作成

app/models/Item.php
<?php
class Item extends Eloquent{

 protected $softDelete=true;
 protected $guarded=array('id');

/*
|------------------------------------
| 1対多関係のリレーション
|------------------------------------
| ItemはCategoryに属している
| Item::find(1)->categories;
| でItemのcategoryへアクセスできます。
|
*/
 public function categories(){
 return $this->belongsTo('Category');
 }
}

カテゴリ作成用ビュー

app/view/category/create.blade.php
@extends('layouts.f4.admin.base')
@section('content')
@if(isset($message))
<div data-alert class="alert-box alert radius">
 {{ $message }}
 <a href="#" class="close">&times;</a>
</div>
@endif
 {{ Form::open(array('url'=>'category/create')) }}
 {{ Form::label('カテゴリ名') }}
 {{ Form::text('name','',array('style'=>'ime-mode:disabled')) }}
 @if($errors->has('name'))
 <h5 style="color:red;text-align:center">
 {{ $errors->first('name') }}
 </h5>
 @endif
 {{ Form::label('説明') }}
 {{ Form::text('description','',array('style'=>'ime-mode:active')) }}
 @if($errors->has('description'))
 <h5 style="color:red;text-align:center">
 {{ $errors->first('description') }}
 </h5>
 @endif
 {{ Form::submit('送信',array('class'=>'button')) }}
 {{ Form::close() }}
@stop

Item作成用ビュー

app/views/item/create.blade.php
@extends('layouts.f4.admin.base')
@section('content')
@if(isset($message))
<div data-alert class="alert-box alert radius">
 {{ $message }}
 <a href="#" class="close">&times;</a>
</div>
@endif
 {{ Form::open(array('url'=>'item/create')) }}
 {{ Form::label('項目名') }}
 {{ Form::text('name','',array('style'=>'ime-mode:active')) }}
 @if($errors->has('name'))
 <h5 style="color:red;text-align:center">
 {{ $errors->first('name') }}
 </h5>
 @endif
 {{ Form::label('カテゴリ') }}
 {{ Form::select('category_id',$categories) }}
 {{ Form::submit('送信',array('class'=>'button')) }}
 {{ Form::close() }}
@stop

次回の予定

今回、項目名の作成は、Adminが行うように変更したのに伴い、ProfileControllerの修正を行う必要あり。次回は、ProfileControllerの修正をします。

« »

コメントを残す

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