私はこのようなモデルを持っています
class test extends Model
{
public $rules = [
'title' => 'required',
'name' => 'required',
];
protected $fillable = ['title','name'];
}
そしてこのようなコントローラー
public function store(Request $request)
{
$test=new test; /// create model object
$validator = Validator::make($request->all(), [
$test->rules
]);
if ($validator->fails()) {
return view('test')->withErrors($validator)
}
test::create($request->all());
}
検証はこのようなエラーを示します
0フィールドは必須です。
これ見せたい
名前フィールドは必須です。
タイトルフィールドは必須です。
私はそれを解決します
public function store(Request $request)
{
$test=new test; /// create model object
$validator = Validator::make($request->all(),$test->rules);
if ($validator->fails()) {
return view('test')->withErrors($validator)
}
test::create($request->all());
}
また、モデルでの検証と、コントローラーで通常どおりに処理されるValidationExceptionのスローを確認することもできます(エラーバッグなどを使用)。例えば:
abstract class BaseModel extends Model implements ModelInterface {
protected $validationRules = [];
/**
* Validate model against rules
* @param array $rules optional array of validation rules. If not passed will validate against object's current values
* @throws ValidationException if validation fails. Used for displaying errors in view
*/
public function validate($rules=[]) {
if (empty($rules))
$rules = $this->toArray();
$validator = \Validator::make($rules,$this->validationRules);
if ($validator->fails())
throw new ValidationException($validator);
}
/**
* Attempt to validate input, if successful fill this object
* @param array $inputArray associative array of values for this object to validate against and fill this object
* @throws ValidationException if validation fails. Used for displaying errors in view
*/
public function validateAndFill($inputArray) {
// must validate input before injecting into model
$this->validate($inputArray);
$this->fill($inputArray);
}
}
次に、私のコントローラーで:
public function store(Request $request) {
$person = $this->personService->create($request->input());
return redirect()->route('people.index', $person)->with('status', $person->first_name.' has been saved');
}
最後に私の基本サービスクラスで
abstract class BaseResourceService {
protected $dataService;
protected $modelClassName;
/**
* Create a resource
* @param array $inputArray of key value pairs of this object to create
* @returns $object
*/
public function create($inputArray) {
try {
$arr = $inputArray;
$object = new $this->modelClassName();
$object->validateAndFill($arr);
$this->dataService->create($object);
return $object;
}
catch (Exception $exception) {
$this->handleError($exception);
}
}
モデルが検証すると、通常どおり続行されます。検証エラーがある場合は、フラッシュデータ/エラーバッグに検証エラーがある前のページに戻ります。
おそらく$ person-> validate()メソッドをサービスクラスに移動しますが、それでも上記のように機能します。
あなたはそれを間違った方法でやっています。 rules
配列は、コントローラー内にあるか、 フォームリクエスト にある必要があります。
より良いアプローチをお見せしましょう:
php artisan make:request TestRequest
を使用して新しいフォームリクエストファイルを作成します。
例TestRequest
クラス:
namespace App\Http\Requests;
use App\Http\Requests\Request;
class TestRequest extends Request
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation messages.
*
* @return array
*/
public function messages()
{
return [
'title.required' => 'A title is required.',
'name.required' => 'The name field is required'
];
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'title' => 'required',
'name' => 'required',
];
}
}
requestオブジェクトをコントローラーメソッドに挿入します。
public function store(TestRequest $request)
{
// You don't need any validation, this is already done
test::create($request->all());
}