Laravel 5.dev HTTPルーティング

基本的なルーティング

アプリケーションのほとんどのルートは、app/Http/routes.phpファイルの中で定義されるでしょう。このファイルは、App\Providers\RouteServiceProviderクラスによりロードされています。一番基本的な、LaravelのルートはURIと「クロージャー」を指定します。

基本のGETルート

Route::get('/', function()
{
    return 'Hello World';
});

その他の基本ルート

Route::post('foo/bar', function()
{
    return 'Hello World';
});

Route::put('foo/bar', function()
{
    //
});

Route::delete('foo/bar', function()
{
    //
});

複数のHTTP動詞に対応するルートの登録

Route::match(['get', 'post'], '/', function()
{
    return 'Hello World';
});

全てのHTTP動詞に対応するルートの登録

Route::any('foo', function()
{
    return 'Hello World';
});

ルートに対するURLを生成する必要が時々起こると思います。urlヘルパを使用できます。

$url = url('foo');

CSRFからの保護

Laravelでは、クロス・サイト・リクエスト・フォージェリからアプリケーションを簡単に守られます。クロス・サイト・リクエスト・フォージェリは悪意のあるエクスプロイトの一種であり、信頼するユーザーの代わりに、認められていないコマンドを実行します。

Laravelは、アプリケーションにより管理されているアクティブなユーザーの各セッションごとに、CSRF「トークン」を自動的に生成しています。このトークンは認証済みのユーザーが、実装にアプリケーションに対してリクエストを送信しているのかを確認するために役立ちます。

CSRFトークンのフォームへの挿入

<input type="hidden" name="_token" value="<?php echo csrf_token(); ?>">

もちろん、Blade テンプレートエンジンを使用できます。

<input type="hidden" name="_token" value="{{ csrf_token() }}">

POST、PUT、DELETEリクエストのCSRFトークンを自分で確認する必要はありません。VerifyCsrfToken HTTPミドルウェアが、リクエスト中のトークンが、セッションに保存されているトークンと一致するか、確認しています。

さらに、"POST"パラメーターとしてCSRFトークンを見つけるため、このミドルウェアはJavascriptのフレームワークで一般的に使用されている、X-XSRF-TOKENリクエストヘッダーもチェックします。

擬似メソッド

HTMLフォームはPUTDELETEアクションをサポートしていません。ですから、PUTDELETEのルートを呼び出すHTMLフォームを定義している場合、_method隠しフィールドをそのフォームに追加する必要があります。

_methodフィールドで送る値は、HTTPリクエストのメソッドとして使用されます。例をご覧ください。

<form action="/foo/bar" method="POST">
    <input type="hidden" name="_method" value="PUT">
    <input type="hidden" name="_token" value="<?php echo csrf_token(); ?>">
</form>

ルートパラメーター

もちろんルート中にある、リクエストURIのセグメントを取得することもできます。

基本的なルートパラメーター

Route::get('user/{id}', function($id)
{
    return 'User '.$id;
});

オプションのルートパラメーター

Route::get('user/{name?}', function($name = null)
{
    return $name;
});

デフォルト値を指定したオプションのルートパラメーター

Route::get('user/{name?}', function($name = 'John')
{
    return $name;
});

正規表現によるルートの束縛

Route::get('user/{name}', function($name)
{
    //
})
->where('name', '[A-Za-z]+');

Route::get('user/{id}', function($id)
{
    //
})
->where('id', '[0-9]+');

正規表現の配列による束縛

Route::get('user/{id}/{name}', function($id, $name)
{
    //
})
->where(['id' => '[0-9]+', 'name' => '[a-z]+'])

グローバルパターンの定義

patternメソッドを使用すれば、ルートパラメーターを指定した正規表現で常に束縛することができます。これらは、RouteServiceProviderbeforeメソッドで定義することを推奨します。

$router->pattern('id', '[0-9]+');

パターンが定義されると、そのパラメーターを使用する全ルートに適用されます。

Route::get('user/{id}', function($id)
{
    // Only called if {id} is numeric.
});

ルートパラメーター値へのアクセス

ルートの外で、ルートパラメーターの値にアクセスする必要がある場合、inputメソッドが使用できます。

if ($route->input('id') == 1)
{
    //
}

また、現在のルートパラメーターへは、Illuminate\Http\Requestインスタンスによってもアクセスできます。現在のリクエストのリクエストインスタンスは、Requestファサードや、依存が注入される場所でIlluminate\Http\Requestをタイプヒントで指定することによってもアクセス可能です。

use Illuminate\Http\Request;

Route::get('user/{id}', function(Request $request, $id)
{
    if ($request->route('id'))
    {
        //
    }
});

名前付きルート

リダイレクトやURLを生成する場合により便利にするために、ルートにつけた名前で、ルートを参照することができます。ルート名を配列キーのasで定義してください。

Route::get('user/profile', ['as' => 'profile', function()
{
    //
}]);

コントローラアクションに対してもルート名を指定できます。

Route::get('user/profile', [
    'as' => 'profile', 'uses' => 'UserController@showProfile'
]);

これで、ルート名をURLやリダイレクトを生成する場合に使用できます。

$url = route('profile');

$redirect = redirect()->route('profile');

実行中のルート名はcurrentRouteNameメソッドでアクセスできます。

$name = Route::currentRouteName();

ルートグループ

フィルターをルートのグループに対して使用する必要がある場合もあるでしょう。それぞれのルートにフィルターを個別に指定する代わりに、ルートグループを使用できます。

Route::group(['before' => 'auth'], function()
{
    Route::get('/', function()
    {
        // Authフィルター適用
    });

    Route::get('user/profile', function()
    {
        // Authフィルター適用
    });
});

またgroupの配列へ、namespace引数により、そのグループのコントローラー全部に対し、名前空間を指定することもできます。

Route::group(['namespace' => 'Admin'], function()
{
    //
});

注目: デフォルトでRouteServiceProviderは、名前空間グループの中でroutes.phpファイルを呼び出します。これにより、完全な名前空間を指定せずに、コントローラールートが登録できます。

サブドメインルーティング

Laravelのルートではサブドメインをワイルドカードで処理でき、ドメイン名のワイルドカードパラメーターをルートに渡すことも可能です。

サブドメインルートの登録

Route::group(['domain' => '{account}.myapp.com'], function()
{

    Route::get('user/{id}', function($account, $id)
    {
        //
    });

});

ルートのプリフィックス

ルートグループのプレフィックスはグループの属性配列でprefixオプションを使用し指定します。

Route::group(['prefix' => 'admin'], function()
{

    Route::get('user', function()
    {
        //
    });

});

ルートとモデルの結合

Laravelモデル結合は、モデルのインスタンスをルートから受け取る、便利な手法です。例えば、ユーザーのIDを受け取る代わりに、そのIDに合致するUserモデルのインスタンスを受け取ることができます。

最初に、ルーターのmodelメソッドで指定したパラメーターで使用するモデルを指定します。モデルの結合は、RouteServiceProvider::bootメソッドの中で定義してください。

モデルとパラメーターを結合する

public function boot(Router $router)
{
    parent::boot($router);

    $router->model('user', 'App\User');
}

次に、{user}パラメーターを含んだルートを定義します。

Route::get('profile/{user}', function(App\User $user)
{
    //
});

{user}パラメーターとUserモデルを結合済みですから、ルートからUserインスタンスが渡されます。例えば、profile/1がリクエストされると、IDが1のUserインスタンスが渡されます。

注目:もしデータベースにモデルのインスタンスが見つからない場合、404エラーがスローされます

もし独自の"not found"動作を指定したい場合は、modelメソッドへクロージャーを3つ目の引数として渡してください。

Route::model('user', 'User', function()
{
    throw new NotFoundHttpException;
});

独自のインスタンス取得ロジックを使用したい場合は、Router::bindメソッドを使用してください。bindメソッドのクロージャーには、URIセグメントの値が渡されますので、ルートへ注入したいクラスのインスタンスを返してください。

Route::bind('user', function($value)
{
    return User::where('name', $value)->first();
});

404エラーのスロー

手動で404エラーをルートから発生させるには2つのやり方があります。最初の方法はabortヘルパを使用するものです。

abort(404);

abortヘルパはただ、Symfony\Component\HttpFoundation\Exception\HttpException例外を指定したステータスコードと共にスローするだけです。

2つめの方法はSymfony\Component\HttpKernel\Exception\NotFoundHttpExceptionのインスタンスをスローするやりかたです。

404例外の取り扱いやこうしたエラーのカスタム処理を使用する詳しい方法はドキュメントのエラーの章をご覧ください。

ドキュメント章別ページ

Artisan CLI

ヘッダー項目移動

注目:アイコン:ページ内リンク設置(リンクがないヘッダーへの移動では、リンクがある以前のヘッダーのハッシュをURLへ付加します。

移動

クリックで即時移動します。

設定

適用ボタンクリック後に、全項目まとめて適用されます。

カラーテーマ
和文指定 Pagination
和文指定 Scaffold
Largeスクリーン表示幅
インデント
本文フォント
コードフォント
フォント適用確認

フォントの指定フィールドから、フォーカスが外れると、当ブロックの内容に反映されます。EnglishのDisplayもPreviewしてください。

フォント設定時、表示に不具合が出た場合、当サイトのクッキーを削除してください。

バックスラッシュを含むインライン\Code\Blockの例です。

以下はコードブロックの例です。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * ユーザに関連する電話レコードを取得
     */
    public function phone()
    {
        return $this->hasOne('App\Phone');
    }
}

設定を保存する前に、表示が乱れないか必ず確認してください。CSSによるフォントファミリー指定の知識がない場合は、フォントを変更しないほうが良いでしょう。

キーボード・ショートカット

オープン操作

PDC

ページ(章)移動の左オフキャンバスオープン

HA

ヘッダー移動モーダルオープン

MS

移動/設定の右オフキャンバスオープン

ヘッダー移動

T

最初のヘッダーへ移動

E

最後のヘッダーへ移動

NJ

次ヘッダー(H2〜H4)へ移動

BK

前ヘッダー(H2〜H4)へ移動

その他

?

このヘルプページ表示
閉じる