WinRoadのLaravel4初心者講座

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

Winroad徒然草の管理人がお届けします
Generatorsのテンプレート作成

Generatorsのテンプレート作成

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

さて、今日は、Generatorsのテンプレート機能について調べてみたいと思います。簡単に、model、View、controller、migration、table seeder、databaseを生成してくれるリソースとスキャフォールドですが、テンプレート機能を使うとさらに便利になります。

テンプレートの生成

コマンドプロンプトから、下記のコマンドを入力します。

php artisan generate:publish-templates

すると、appフォルダの直下にtemplatesフォルダが生成されます。その中には、scaffoldingフォルダと、controller.txt、migration.txt、model.txt、schema.txt、seed.txt、view.txtファイル、さらにscaffoldingフォルダ内には、cotroller.txt、model.txtファイルが生成されています。

その中の、templates/controller.txtとtemplates/scafolding/controller.txtファイルを見比べてみましょう。

app/templates/controller.txt

<?php
class $NAME$ extends \BaseController {
/**
 * Display a listing of the resource.
 *
 * @return Response
 */
 public function index()
 {
 //
 }
/**
 * Show the form for creating a new resource.
 *
 * @return Response
 */
 public function create()
 {
 //
 }
/**
 * Store a newly created resource in storage.
 *
 * @return Response
 */
 public function store()
 {
 //
 }
/**
 * Display the specified resource.
 *
 * @param int $id
 * @return Response
 */
 public function show($id)
 {
 //
 }
/**
 * Show the form for editing the specified resource.
 *
 * @param int $id
 * @return Response
 */
 public function edit($id)
 {
 //
 }
/**
 * Update the specified resource in storage.
 *
 * @param int $id
 * @return Response
 */
 public function update($id)
 {
 //
 }
/**
 * Remove the specified resource from storage.
 *
 * @param int $id
 * @return Response
 */
 public function destroy($id)
 {
 //
 }
}

app/templates/scaffolding/controller.txt

<?php
class $NAME$ extends \BaseController {
/**
 * Display a listing of $COLLECTION$
 *
 * @return Response
 */
 public function index()
 {
 $$COLLECTION$ = $MODEL$::all();
return View::make('$COLLECTION$.index', compact('$COLLECTION$'));
 }
/**
 * Show the form for creating a new $RESOURCE$
 *
 * @return Response
 */
 public function create()
 {
 return View::make('$COLLECTION$.create');
 }
/**
 * Store a newly created $RESOURCE$ in storage.
 *
 * @return Response
 */
 public function store()
 {
 $validator = Validator::make($data = Input::all(), $MODEL$::$rules);
if ($validator->fails())
 {
 return Redirect::back()->withErrors($validator)->withInput();
 }
$MODEL$::create($data);
return Redirect::route('$COLLECTION$.index');
 }
/**
 * Display the specified $RESOURCE$.
 *
 * @param int $id
 * @return Response
 */
 public function show($id)
 {
 $$RESOURCE$ = $MODEL$::findOrFail($id);
return View::make('$COLLECTION$.show', compact('$RESOURCE$'));
 }
/**
 * Show the form for editing the specified $RESOURCE$.
 *
 * @param int $id
 * @return Response
 */
 public function edit($id)
 {
 $$RESOURCE$ = $MODEL$::find($id);
return View::make('$COLLECTION$.edit', compact('$RESOURCE$'));
 }
/**
 * Update the specified resource in storage.
 *
 * @param int $id
 * @return Response
 */
 public function update($id)
 {
 $$RESOURCE$ = $MODEL$::findOrFail($id);
$validator = Validator::make($data = Input::all(), $MODEL$::$rules);
if ($validator->fails())
 {
 return Redirect::back()->withErrors($validator)->withInput();
 }
$$RESOURCE$->update($data);
return Redirect::route('$COLLECTION$.index');
 }
/**
 * Remove the specified resource from storage.
 *
 * @param int $id
 * @return Response
 */
 public function destroy($id)
 {
 $MODEL$::destroy($id);
return Redirect::route('$COLLECTION$.index');
 }
}

上記の2つのファイルを見比べてみれば、わかると思いますが、このファイルがリソース及びスキャフォールドのテンプレートファイルになります。

つまり、このファイルを書き換えるとGeneratorsで生成されるファイルを変更することが出来ると言うことです。

スキャフォールドのテンプレートを私がいつも使っている、レストフルControllerに書き換えてみます。

app/templates/scafolding/contoller.txt

<?php

class $NAME$ extends \BaseController {

 /**
 * コンストラクター
 */
 public function __construct(){
 $this->beforeFilter('csrf',['on'=>'post']);
 }

 /**
 * 一覧ページ
 */
 public function getIndex()
 {
 $$COLLECTION$ = $MODEL$::paginate();

 return View::make('$COLLECTION$.index', compact('$COLLECTION$'));
 }

 /**
 * 新規作成
 */
 public function getCreate()
 {
 return View::make('$COLLECTION$.create');
 }
 public function postCreate()
 {
 $inputs = Input::except('_token');
 $val = Validator::make($inputs, $MODEL$::$rules);

 if ($val->fails())
 {
 return Redirect::back()->withErrors($val)->withInput();
 }

 $MODEL$::create($inputs);

 return Redirect::route('$COLLECTION$.index');
 }

 /**
 * 詳細ページ
 */
 public function getView($id)
 {
 $$RESOURCE$ = $MODEL$::findOrFail($id);

 return View::make('$COLLECTION$.show', compact('$RESOURCE$'));
 }

 /**
 * データ編集
 */
 public function getEdit($id)
 {
 $$RESOURCE$ = $MODEL$::find($id);

 return View::make('$COLLECTION$.edit', compact('$RESOURCE$'));
 }
 public function postEdit($id)
 {
 $$RESOURCE$ = $MODEL$::findOrFail($id);

 $inputs = Input::except('_token');
 $val = Validator::make($inputs, $MODEL$::$rules);

 if ($val->fails())
 {
 return Redirect::back()->withErrors($val)->withInput();
 }

 $$RESOURCE$->update($inputs);

 return Redirect::route('$COLLECTION$.index');
 }

 /**
 * データ削除
 */
 public function postDestroy()
 {
$id = Input::get('id'); 
$MODEL$::destroy($id);

 return Redirect::route('$COLLECTION$.index');
 }

}

$と$に挟まれた大文字は、すべて、Generatorsで一定の文字に変換されます。下記に変換される文字について調べてみます。※php artisan g:sc postで、postを生成したとして説明しています。

  • $NAME$:クラス名に変換されます。つまり、コントローラなら、PostsControllerでモデルなら、Postに変換されます。
  • $$COLLECTION$:COLLECTIONはテーブル名に変換されます。つまり、この場合は、$posts(複数形)に変換されます。
  • $MODEL$:モデル名、つまり、Postに変換されます。
  • $$RESOURCE$:、リソース名、つまり、$post(単数形)に変換されます。

モデルも書き換えます。

app/templates/scafolding/model.txt

<?php

class $NAME$ extends \Eloquent {

 // Add your validation rules here
 public static $rules = [
 // 'title' => 'required'
 ];

 // Don't forget to fill this array
 protected $guarded = ['id'];

}

これで、自分専用のテンプレートが完成します。上記のテンプレートの場合は、ルーターに下記のように追加します。

Route::controller(‘URL’,コントローラ名);

このように自分専用のテンプレートを作成して、高速開発に役立ててください。

これほど便利な、Generatorsですので、ビューファイルもそれぞれのファイル(index.blade.php、create.blade.php、edit.blade.php等)ごとに、テンプレートを指定出来るようにしてくれると助かるのですが。

« »

コメントを残す

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