web-dev-qa-db-fra.com

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

Avoir une méthode qui importe des données CSV dans une base de données. Je fais une validation de base en utilisant

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

Mais après cela, les choses peuvent mal tourner pour des raisons plus complexes, plus loin dans le terrier du lapin, cela jette des exceptions. Je ne parviens pas à écrire les éléments de validation appropriés à utiliser avec la méthode validate, mais j'aime beaucoup le fonctionnement de Laravel lorsque la validation échoue et la facilité d'intégration des erreurs. dans la vue de la lame, etc., alors ...

Existe-t-il un moyen (de préférence propre) de manuellement dire Laravel que "je sais que je n'ai pas utilisé votre méthode validate pour le moment, mais j'aimerais vraiment vous exposer cette erreur ici comme si je " Est-ce qu'il y a quelque chose que je peux retourner, une exception avec laquelle je peux emballer des 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?
}
36
Svish

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.

90
Erin

Laravel <= 5.8 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);
11
Mārtiņš Briedis

Il suffit de retourner du contrôleur:

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

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]));
}
3
madalinivascu

Pour Laravel 5.8:

.

La façon la plus simple de lancer une exception est la suivante:

throw new \ErrorException('Error found');
0
Syamsoul Azrien

Pour Laravel 5.4:

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