2016-07-27 20 views
0

想像してみましょう - Laravelアプリケーション、get requstが作成されます。Laravelリクエストのintとstringキーの奇妙な振る舞い

状況は、整数名の入力を持つカスタム要求が行われていることです。カスタムリクエストファイルで、別のフィールドを追加しています。「フィールド」と言うことができます。だから、最初に$request->all()戻り

array(
    1 => "value1", 
    5 => "value5", 
    12 => "value12", 
) 

$request->all()戻り

array(
    1 => "value1", 
    5 => "value5", 
    12 => "value12", 
    "fields" => array(
         "key" => "value", 
       ), 
) 

を新しいフィールドを追加した後、今、問題が発生します - $request->get("fields")はNULLを返します。

$request->all()はフィールドを返します。

$request->only(["fields"])は、フィールドを含む配列を返します。

$request->exists("fields")がtrueを返します。

なぜそうですか?


EDIT

カスタムリクエストクラス内の新しいフィールドの追加:

public function getValidatorInstance() 
{ 
    $validator = parent::getValidatorInstance(); 

    $validator->after(function() use ($validator, $event) 
    { 
     $this->merge(["fields" => ["key" => "value"]]); 
    } 
    return $validator; 
} 
+1

追加の仕組みを教えてください。 – itachi

+1

前に$ request-> get()を使ったことがありませんでしたが、代わりに$ request-> input( 'fields')でコードを試すことができますか? – Yanaro

+1

フィールドを追加するコードを私に教えてください –

答えて

1

$request->all()が要求を通じて提出されたすべてのデータを返す必要があります。それはすべきである。

$request->only(["fields"])は、[]のために要求からfieldsキーを取得して配列にキャストしています。通常の動作

$request->exists("fields")は、リクエストデータにそのキーが存在するかどうかをチェックしています。通常の動作

Illuminate\Http\Requestを見ると、get()メソッドはありません。私は、要求から入力を抽出するために使用された方法は、$request->input('fieldName')です。しかし、Illuminate\Http\Requestには__get()という方法があり、うまくいくようです。より明示的なので、input()メソッドを使用します。

+1

'Request :: get'は親クラスの' Symfony \ Component \ HttpFoundation \ Request'で定義されています。 –

+0

ああ、十分に掘り下げなかった:P。 Thx –

+0

@ AntrewNolan答えてくれてありがとうが、私の質問はなぜget()メソッドが動作していないのですか? :) –

0

は、私はあなたが単純なスコープ問題がある可能性がありと思う、および$thisがあなたのバリデータのafter閉鎖では使用できません。

$validator->after(function() use ($validator, $event, $this) 
{ 
    $this->merge(["fields" => ["key" => "value"]]); 
} 

あなたは動作しませんPHP 5.3以上の下を使用している場合は、親スコープの$thisへの参照を取得する必要があります。

$self = $this; 
$validator->after(function() use ($validator, $event, $self) 
{ 
    $self->merge(["fields" => ["key" => "value"]]); 
} 
+0

スコープの問題があった場合、..-> exists( "fields")はfalseを返し、...-> all()でもどちらも表示されません。良い推測tho –