初めてのLaravel 5.1 : (24) Named Route

今までコントローラやビューの中でURLを指定する時は、ソースコードに直にパスを書いていました。しかし、この方法だと、パスに変更があった時に、多くの箇所を変更しなければなりません。そこで、ルートに名前を付け、ルート名でURLを指定することで、この問題を解決したいと思います。

名前付きルートの設定

ルートに名前を付けるよう routes.php を修正します。

// app/Http/routes.php

...
// 以前の Route の書き方
//Route::get('articles', 'ArticlesController@index');
//Route::get('articles/create', 'ArticlesController@create');
//Route::get('articles/{id}', 'ArticlesController@show');
//Route::post('articles', 'ArticlesController@store');
//Route::get('articles/{id}/edit', 'ArticlesController@edit');
//Route::patch('articles/{id}', 'ArticlesController@update');
//Route::delete('articles/{id}', 'ArticlesController@destroy');

// 名前を指定した Route の書き方
Route::get('articles', ['as' => 'articles.index', 'uses' => 'ArticlesController@index']);
Route::get('articles/create', ['as' => 'articles.create', 'uses' => 'ArticlesController@create']);
Route::get('articles/{id}', ['as' => 'articles.show', 'uses' => 'ArticlesController@show']);
Route::post('articles', ['as' => 'articles.store', 'uses' => 'ArticlesController@store']);
Route::get('articles/{id}/edit', ['as' => 'articles.edit', 'uses' => 'ArticlesController@edit']);
Route::patch('articles/{id}', ['as' => 'articles.update', 'uses' => 'ArticlesController@update']);
Route::delete('articles/{id}', ['as' => 'articles.destroy', 'uses' => 'ArticlesController@destroy']);

配列を使って、ルート名とアクション(コントローラとメソッド)を指定します。

  • ‘as’ キーでルート名を指定
  • ‘uses’ キーでアクションを指定

名前付きルートの使い方

Controller

// app/Http/Controllers/ArticlesController.php
    ...
    ...
    public function store(ArticleRequest $request) {
        Article::create($request->all());
        Session::flash('flash_message', '記事を追加しました。');

        // return redirect('articles');
        return redirect()->route('articles.index');
    }
    ...
    ...
    public function update($id, ArticleRequest $request) {
        $article = Article::findOrFail($id);

        $article->update($request->all());
        Session::flash('flash_message', '記事を更新しました。');

        // return redirect(url('articles', [$article->id]));
        return redirect()->route('articles.show', [$article->id]);
    }

redirect で直にパスを書いていたのを、named route に変更しました。

View

// resources/views/articles/create.blade.php

@extends('layout')

@section('content')
    <h1>Write a New Article</h1>

    <hr/>

    @include('errors.form_errors')


    {{-- Form::open(['url' => 'articles']) --}}
    {!! Form::open(['route' => 'articles.store']) !!}
        @include('articles.form', ['published_at' => date('Y-m-d'), 'submitButton' => 'Add Article'])
    {!! Form::close() !!}

@stop

Form::open で直にパスを書いていたのを、named route に変更しました。


演習

コントローラやビューでURLを指定している箇所を全て、名前付きルートでの指定に変更してみてください。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中