12
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

laravelでURLを作成する便利な関数(route()・action())を使うときに、パラメータをエンコードする

Last updated at Posted at 2019-05-29

route()・action()はどちらもURLを作成するときにすごく便利です。

route('sample.index');  //こちらは、routes/web.phpでnameを指定する必要があります。
action('SampleController@index');

どちらも同様のURLを作成してくれます。第二引数で、パラメータを渡すことができます。
Bladeのほうで、利用するときは、旧型の書き方と比べると可読性が全然違います。

###旧型

{{Form::open(['url' => 'http://sample/index?id='. $data['id']. '&name='. $data['name'])}}

###route()・action()利用時

url属性を使用した場合

{{Form::open(['url' => route('sample.index', [$data])])}}
{{Form::open(['url' => action('SampleController@index', [$data])])}}

LaravelのBladeには、routeとactionの属性が用意されています(パラメータがない場合は利用する)
(こちらの形でも、input hiddenを使えば、パラメータを渡すことは可能ですが、個人的には、すべてurl属性を使って統一するほうが見やすい気がします。)

{{Form::open(['route' => 'sample.index'])}}
{{Form::open(['action' => 'SampleController@index])}}

##Formにroute関数を使用して、特定の場合、思った挙動をしなくなる話

当然と言われれば、それまでの話なのですが、URLにidを埋め込んで、そのidに、/を入れたときに、思った通りの挙動をしません。例をあげてみます。

routes/web.php
Route::get('/test/{id}/index', 'TestController@index')->name('test.index');

idごとのデータのindexメソッドの処理がはしる想定のルートです。

TestController.php
public function index(Request $request, $id)
    {
        dd($id);
    }

引数で、idを受け取ります。それでは、bladeを編集します。

test.blade.php
{{Form::open(['url' => route('test.index', ['id' => '1']), 'method' => 'get'])}}
{{Form::submit('送信')}}
{{Form::close()}}

まずは、idに1をいれて、ボタンを押下してみます。

Screenshot_8.png

想定通り、1が表示されました。それでは、/をいれてみます。

test.blade.php
{{Form::open(['url' => route('test.index', ['id' => '/']), 'method' => 'get'])}}
{{Form::submit('送信')}}
{{Form::close()}}

/を入れて試してみます。404エラーがでました。URLをみると、///となっており、URLがおかしくなっています。

Screenshot_10.png

###対処法
本来、/はURLの区切り、?はパラメータを渡すときにURLの大切な役を担っています。それを、URLのパラメータとして使用するためには、エンコードする必要があります。

routes/web.php
Route::get('/test/{id}/index', 'TestController@index')->name('test.index')->where('id', '(.*)');
Screenshot_11.png

できました。?をパラメータに使いたい場合は、エンコードされていたらそのまま使えますが、されていなかったら、urlencode('?')などでエンコードしてから、パラメータとして使用しましょう。

##まとめ
パラメータに/や?を使わないようするのが一番いいと思います

参考にさせていただいた記事-スラッシュのエンコード

12
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?