localdisk

PHP とか Java とか Web とか好きなことを書きます。

Laravel 最速マスター

はじめに

このエントリはMojolicious最速マスター - Qiita [キータ]をぱk…インスパイアしたものです。

このエントリはLaravel Advent Calendar 2013の24日目の記事です。*1


PHP の Web Application Frameworkである Laravel でアプリをつくる場合に必要な基礎的な使用法を紹介します。

イントロ

インストール

composer を使用することによって依存関係を気にすることなくコマンド一発でインストールできます。

composer create-project laravel/laravel your-project-name --prefer-dist

起動

artisan コマンドを使用して起動させてみましょう。

php artisan serve

とすることで、 http://localhost:8000/ でアプリケーションが起動します。

ルーティング

GET/POSTのメソッドで振り分ける

app/routes.php の中で Route::get と Route::post を使いましょう。他にも Route::putRoute::patch, Route::delete もサポートされているのですが、最初は get/post で充分でしょう。

<?php
Route::get('entry', function()
{
    ...;
});
Route::post('entry', function()
{
    ...;
});

URLの一部をキャプチャする - path の placeholder

/entry/1 とか /entry/2 とか /entry/3 とかURLの一部、この場合だと /entry/{数字の部分} をキャプチャしてコントローラの中で使いたい時はこのようにします。

<?php
Route::get('entry/{id}', function($id)
{
    $entry = Entry::find($id);
    ...;
})->where('id', '[0-9]+');

ルートパラメータはクロージャの引数に入るのでそのまま使えば OK です。

コントローラ

Laravel ではコントローラの処理を routes.php に書く方法とクラスとして別ファイルに書く方法があります。1人で作業する場合やプロトタイプを作る場合は routes.php に書くのはよい方法ですが、多人数での開発になるといささか不便です。その場合はクラスを作成するのがよいでしょう。ここでは説明を割愛します。わかりやすい ドキュメント がありますので、ぜひご覧になってください。

リクエストパラメータ値を取得する

Input::get を使います。他にも取得方法があるので ドキュメント を参考にしてください。

<?php
Route::post('entry', function()
{
    $body = Input::get('body');
    ...;
});

デバッグ用のログを出力する

Laravel のログは app/storage/laravel.log に保存されます。また、実行中にエラーが発生した場合はブラウザ上に詳細な例外画面が出力されます。*2また debug ログだけではなくエラーログなどログレベルを指定することが出来、他にも info/warning/error 等があります。

<?php
Route::post('entry', function()
{
    Log::debug('This is debug log!');
    ...;
});

テンプレート(ビュー)をレンダリングする

後ほど説明するテンプレート(ビュー)ファイルに値を渡しつつレンダリングする方法です。

<?php
Route::get('/', function()
{
    // app/views/index(.blade).php をレンダリングします
    return View::make('index');
});

View::make の第1引数でテンプレート(ビュー)ファイルを指定します。またデータを入れる場合は、View::make の第2引数に値をセットするか with メソッドを使用します。

<?php
Route::get('/', function()
{
    return View::make('index', ['name' => 'localdisk']);
    // こう書いても結果は同じです
    return View::make('index')->with('name', 'localdisk');
});

JSONを出力する

View::make のかわりに Response::json を使用することで JSON を出力することができます。

<?php
Route::get('json', function()
{
    return Response::json(['status' => 'OK', 'message' => 'I am Fine!']);
});

リダレイクトさせる

Redirect::to を使用します。パスだけ書いて同じアプリケーション内へ、http:// からはじめてフルでURLを書くと外部サイトへ飛びます。

<?php
Route::get('dummy', function()
{
    return Redirect::to('/');
});

テンプレート(ビュー)

変数の展開

PHP の文法がそのまま使えます(当たり前)。その他に Laravel では Blade というテンプレートエンジンを持っています。ここでは両方の書き方を紹介していきます。
コントローラから渡ってきた変数の展開は基本このように書きます。

// php
<p>Message: <?= e($message) ?></p>
// Blade
<p>Message: {{{ $message }}}</p>

PHP の場合は e() 関数を使用することでエスケープします。Blade の場合は {{{ $var }}} という中括弧3つで自動エスケープします。
エスケープさせたくない場合は、PHP であれば e() を使用しない、Blade の場合は中括弧2つで出力することによってエスケープ処理をオフにできます。

// エスケープしない例
// php
<p>Message: <?= $message ?></p>
// Blade
<p>Message: {{ $message }}</p>

ループ

普通に foreach でまわしましょう。entriesEntry クラスの配列が入ってるとして

<ul>
    <?php foreach($entries as $entry): ?>
    <li><?= e($entry->title) ?></li>
    <?php endforeach; ?>
</ul>
// Blade
<ul>
    @foreach ($entries as $entry)
    <li><{{{ $entry->title }}}</li>
    @endforeach
</ul>

で OK です。

レイアウトの適応

レイアウトの適応も Blade を使用すれば簡単に実現できます。PHP でやろうとするとちょっと大変なのでここは Blade を使用する例を紹介します。

# layouts/default.blade.php
<html><body>
  <div id=“content”>
    @yield('content')
  </div>
</body></html>

# index.blade.php

@extends('layouts.default')
@section('content')
<p>This is content section!</p>
@stop

その他

セッションを使う

セッションは PHP のネイティブセッションの他に MemcachedRedis, データベースも最初からサポートしています。インターフェースは同じで設定ファイルを変更するだけで OK です。

<?php
Route::get('/', function()
{
    // 取得
    $count = Session::get('count');
    // 保存
    Session::put('count', $count++);
    return View::make('index');
});
// View
<p>Count: <?= e(Session::get('count')); ?>

ユーザーエージェント名を取得する

Request::server$_SERVER の情報を取得できます。

<?php
Route::get('ua', function()
{
    $ua = Request::server('HTTP_USER_AGENT');
});

詳しい情報をドキュメントをどうぞ。日本語訳されているので安心ですよ。翻訳を行っている @HiroKws に感謝。

LeanPub にて Laravel 電子書籍が多数リリースされており @HiroKws が翻訳しています。私のおすすめをピックアップしておきます。Web にある情報で満足できなくなったら購入を検討してみるのもよいと思います。

  • Laravel 4 ドキュメント+
    • まずはこれ。5$ から帰るのでお得感あります。追補が本番。
  • Laravel 4 Cookbook
    • これを読めば Laravel でアプリケーションを作成するのに困ることはなくなるでしょう。500 ページのボリュームで $19.99 は実際破格だ。
  • Laravel Testing Decoded
    • アプリケーションを作るだけでは片手落ちだ。テストを書いてそのアプリケーションは初めて完成する。Laravel のテスト本。実のところ内容は Laravel にさほど依存していないので PHPer 全員におすすめしたい良本。

Laravel AdventCalendar 最終日

最後を締めてくれるのは @HiroKws さんです。よろしくお願いします!

最後に

僕も鍋食べたい。

*1:仕事の都合で過去記事の使い回しになりました。申し訳ありません。

*2:debug モードが on の場合のみ