ECサイト運営開発記

PHPフレームワーク Laravelの使い方を中心とした通販サイトの開発日記

LaravelのBladeテンプレート

PHPフレームワークLaravel」のコントローラーの簡単な使い方とBladeテンプレートについて、備忘録も兼ねて残しておく。
Laravelのインストール方法については、割愛。ダウンロードして、この辺を参考にすれば、基本どうにかなるので。

  • コントローラーを使うにあたり、下準備
    • application/controllers/ディレクトリに標準で、home.phpとbase.phpが入っている。
      • 文字通りHome_ControllerとBase_Controller。
      • 通常は、BaseControllerを継承して、新たにコントローラーを作成するらしいので、今回もそれに習う
  • 今回やりたい事
    • コントローラーを作成して、LaravelのBladeテンプレートを使いViewを表示する
    • まずは、新規にショッピングコントローラーを作成
      • ファイル名 application/controllers/shopping.php
<?php 
class Shopping_Controller extends Base_Controller {
  // とりあえず、何もない状態
  public function action_index(){
     echo "shopping controller!";
  }
}
?>
    • デフォルトレイアウトファイルを作成
      • application/views/layouts/default.blade.php という具合で 拡張子 *.blade.php で作成。
      • レイアウトテンプレートは以下のような感じ
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>@yield("page_title")</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
{{HTML::style("css/bootstrap/css/bootstrap.min.css")}}
{{HTML::script("js/jquery-1.7.2.min.js")}}
{{HTML::script("css/bootstrap/js/bootstrap.min.js")}}
</head>
<body>
<div class="container">
	@include("partials.header")
	@yield("content")
	@include("partials.footer")
</div>
    • Bladeテンプレートの基礎
      • {{ }}ブロック
        • 変数の出力
          • この中には、PHPコードが書ける
          • {{$a}}、{{10*3}}、{{$a+1}} など基本なんでもOK。
          • ちなみに、上のコードでは、Laravelのヘルパを呼び出してる。
      • @yieldは特定のセクションの出力結果を表示するもの
        • アクションViewファイル等で@section("section_name") @endsectionで囲まれた内容を @yieldで呼び出す
          • アクションViewファイル内で@section("page_title")ようこそホームページへ@endsection と記述し、@yield("page_title")とした場合、「ようこそホームページへ」と出力される。
      • @include("〜〜")は文字通り、見たままパーツの読み込みに使用する
        • @include("partials.header")は application/views/partials/header.blade.php を読み込む
    • アクションテンプレートの作成
      • レイアウトテンプレートと同様に application/views/shopping/index.blade.php という具合で 拡張子 *.blade.php で作成。
        • application/views/コントローラー名/アクション名.blade.php がわかりやすいかも。でも、基本的にどこに置いても自由
@layout("layouts.default")

@section("page_title")
カテゴリー一覧
@endsection

@section("content")
	<h2>カテゴリー一覧</h2>
	<ul>
	@forelse ($categoryList as $category)
		<li>
		<a href="<?php echo URL::to("shopping/category/"); ?><?php echo $category->category_id ?>/">
		<?php echo $category->category_name ?>
		</a>
		</li>
	@empty
		<li>カテゴリーが見つかりませんでした</li>
	@endforelse
	</ul>
@endsection
    • アクションViewテンプレートからレイアウトを指定する
      • @layout("layouts.default")
        • .(ドット)がディレクトリ区切り
        • application/views/layouts/default.blade.php
    • @section("content") 〜 @endsection がコンテンツ。
      • もちろん、"content" という名前で縛る必要はない。
    • @section("page_title")カテゴリー一覧@endsection
      • レイアウトテンプレートで@yield("page_title")で呼びだすと、カテゴリー一覧が出力される
    • ループ構文や条件分岐が可能
      • @forelse @empty @endforelse
        • Smartyでいう{foreaech}〜{foreachelse}〜{/foreach}
      • @if ($a==1) 〜 @endif
  • コントローラーファイル application/controllers/shopping.php を編集
    • 以下、shoppingコントローラーのindexアクションで全てのカテゴリー一覧を取得して、Bladeテンプレートを使い表示するコード
<?php 
class Shopping_Controller extends Base_Controller {

  // レイアウトテンプレートの指定
  public $layout = "layouts.default";

  // インデックスアクション
  public function action_index(){
    
    // Viewsの指定
    $view=View::make("shopping.index");
    $view->with("categoryList",Category::all());

    // 必ず、Viewを返却する
    return $view;
  }
}
?>
    • public $layout = "layouts.default"; でテンプレートファイルを指定する。
    • アクションメソッドの中で、Viewにデータをセットして、レンダリングする
      • $view=View::make("shopping.index");
        • Viewファイルがapplication/views/shopping/index.blade.php の場合
    • Viewにデータをセットする場合、$view->with("categoryList",Category::all());
      • Smartyでいうassign("key",$value);
    • アクションの最後に、$viewオブジェクトを返却すれば、レンダリング
      • return $view;

大筋ではこんな具合。Bladeテンプレートの詳細に関しては、

[ドキュメントとチュートリアル]
http://laravel.com/docs/views/templating
http://daylerees.com/2012/04/07/laravel-blade/

[電子書籍版]
http://daylerees.com/2012/03/31/release-code-happy/
などを参照。