38

「フォーム リクエスト」でルート パラメータを検証したいのですが、その方法がわかりません。

以下はコードサンプルです。私は試しています:

ルート

// controller Server
Route::group(['prefix' => 'server'], function(){
    Route::get('checkToken/{token}',['as'=>'checkKey','uses'=> 'ServerController@checkToken']);
});

コントローラ

namespace App\Http\Controllers;


use App\Http\Controllers\Controller;

use Illuminate\Http\Request;
use App\Http\Requests;


class ServerController extends Controller {
    public function checkToken( \App\Http\Requests\CheckTokenServerRequest $request) // OT: - why I have to set full path to work??
        {   
            $token = Token::where('token', '=', $request->token)->first();      
            $dt = new DateTime; 
            $token->executed_at = $dt->format('m-d-y H:i:s');
            $token->save();

            return response()->json(json_decode($token->json),200);
        }
}

CheckTokenServerRequest

namespace App\Http\Requests;

use App\Http\Requests\Request;

class CheckTokenServerRequest extends Request {

        //autorization

        /**
         * Get the validation rules that apply to the request.
         *
         * @return array
         */
        public function rules()
        {

            return [
                'token' => ['required','exists:Tokens,token,executed_at,null']
            ];
        }

}

しかし、単純な URL http://myurl/server/checkToken/222を検証しようとすると、応答が返されます: no " token " parameter set.

別の「フォームリクエスト」でパラメーターを検証することは可能ですか?それとも、コントローラーですべてを行う必要がありますか?

ps。私の悪い英語でごめんなさい。

4

10 に答える 10

55

Laravel < 5.5 の場合:
この方法は、次のようにall()メソッドをオーバーライドすることです。CheckTokenServerRequest

public function all() 
{
   $data = parent::all();
   $data['token'] = $this->route('token');
   return $data;
}

EDIT
For Laravel >= 5.5:
上記のソリューションはLaravel < 5.5で機能します。Laravel 5.5以降で使用する場合は、次を使用する必要があります。

public function all($keys = null) 
{
   $data = parent::all($keys);
   $data['token'] = $this->route('token');
   return $data;
}

代わりは。

于 2016-05-31T16:03:36.453 に答える
14

all()Request オブジェクトの関数をオーバーライドして、検証ルールを URL パラメーターに自動的に適用する

class SetEmailRequest
{

    public function rules()
    {
        return [
            'email'    => 'required|email|max:40',
            'id'       => 'required|integer', // << url parameter
        ];
    }

    public function all()
    {
        $data = parent::all();
        $data['id'] = $this->route('id');

        return $data;
    }

    public function authorize()
    {
        return true;
    }
}

リクエストを挿入した後、次のようにコントローラーから通常どおりデータにアクセスします。

$setEmailRequest->email // request data
$setEmailRequest->id, // url data
于 2016-06-28T02:03:00.517 に答える
0

トークンの前にアンダースコアがありません。と置換する

_トークン

laravelによって生成されたフォームに対してチェックする場所。

public function rules()
{

    return [
        '_token' => ['required','exists:Tokens,token,executed_at,null']
    ];
于 2016-06-07T15:02:35.127 に答える