98 votes

Comment puis-je retourner ou lancer manuellement une erreur / une exception de validation dans Laravel?

Avoir une méthode qui est de l'importation de CSV des données dans une Base de données. Je fais un peu de base de validation à l'aide de

class CsvImportController extends Controller
{
    public function import(Request $request)
    {   
        $this->validate($request, [
            'csv_file' => 'required|mimes:csv,txt',
        ]);

Mais après que les choses peuvent aller mal pour des motifs plus complexes, plus bas dans le trou du lapin, qui lève des exceptions de quelque sorte. Je ne peux pas écrire de la bonne validation des trucs à utiliser avec l' validate méthode ici, mais, j'aime vraiment comment Laravel œuvres lors de la validation échoue et combien il est facile d'intégrer les erreur(s) dans la lame de vue etc, de sorte que...

Est-il (propre de préférence) le chemin manuellement dire Laravel que "je sais que je n'ai pas d'utiliser votre validate méthode dès maintenant, mais je voudrais vraiment vous exposer cette erreur ici, comme si je l'ai fait"? Est-il quelque chose que je peux revenir, une exception je peux envelopper les choses, ou quelque chose?

try
{
    // Call the rabbit hole of an import method
}
catch(\Exception $e)
{
    // Can I return/throw something that to Laravel looks 
    // like a validation error and acts accordingly here?
}

237voto

Erin Points 1219

A partir de laravel 5.5, la classe ValidationException a une méthode statique withMessages que vous pouvez utiliser:

 $error = \Illuminate\Validation\ValidationException::withMessages([
   'field_name_1' => ['Validation Message #1'],
   'field_name_2' => ['Validation Message #2'],
]);
throw $error;
 

Je n'ai pas testé cela, mais ça devrait marcher.

27voto

Mārtiņš Briedis Points 7934

Laravel <= 6.0 cette solution a fonctionné pour moi:

 $validator = Validator::make([], []); // Empty data and rules fields
$validator->errors()->add('fieldName', 'This is the error message');
throw new ValidationException($validator);
 

20voto

Mantas D Points 2286

Il suffit de retourner du contrôleur:

 return back()->withErrors('your error message');
 

6voto

madalinivascu Points 25929

vous pouvez essayer un sac de message personnalisé

 try
{
    // Call the rabbit hole of an import method
}
catch(\Exception $e)
{
    return redirect()->to('dashboard')->withErrors(new \Illuminate\Support\MessageBag(['catch_exception'=>$e]));
}
 

0voto

Akram Fares Points 1417

Pour Laravel 5.4:

 $validator = validator([], []); // Empty data and rules fields
$validator->errors()->add('fieldName', 'This is the error message');
throw new ValidationException($validator);
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X