Dans une fonction de mon contrôleur , j'appelle ceci:

$item = Item::where('i_id', $Id)->where('type', 1)->first();


$firebaseData = app('firebase')->getDatabase()->getReference('items/'.$Id)->getSnapshot()->getValue();

Ensuite, je fais beaucoup de "validation" entre les données des deux sources ci-dessus comme:

if ($item->time_expires < strtotime(Carbon::now()) && $firebaseData['active'] == 1) { 
return response()->json(['errors' => [trans('api.pleaserenew')]], 422); 
}

Et comme il ne s'agit pas de données provenant d'un utilisateur / d'une requête, je ne peux pas utiliser la méthode Laravels validate

Je ne veux pas garder ce genre de logique dans mon contrôleur, mais où dois-je le mettre? Comme une partie de mes données provient de Firebase, je ne peux pas non plus configurer un modèle Eloquent pour le gérer.

1
user2722667 5 avril 2017 à 19:10

2 réponses

Meilleure réponse

Pour toutes les données que vous avez dans votre application, vous pouvez utiliser la validation Laravel.

Vous pouvez fusionner vos données et les traiter en utilisant la façade Validator comme ceci:

$combinedData = array_merge($item->toArray(), $firebaseData);

Validator::make($combinedData, [
    'active' => 'required|in:1',
    'time_expires' => 'required|before:' . Carbon::now()->toDateTimeString()
], $customMessageArray);

Je pense que le meilleur endroit pour ce code est une sorte de classe de service que vous injecterez au contrôleur ou à une autre classe de service à l'aide de l'injection de dépendances Laravel.

0
Dmitriy Troyan 5 avril 2017 à 16:26

Je recommande de recevoir les données Firebase via une méthode dans le modèle:

public function getFirebaseData()
{
    app('firebase')->getDatabase()->getReference('items'/ . $this->i_id)->getSnapshot()->getValue();
}

De cette façon, vous avez la logique de recevoir les données découplées de la logique du contrôleur et de les déplacer là où cela a plus de sens. L'ajout d'une méthode de validation pourrait fonctionner de manière similaire dans le modèle, puis:

public function validateData()
{
    $combined = array_merge($this->toArray(), $this->getFirebaseData());

    Validator::make($combined, [
        'active' => 'in:1',
        'time_expires' => 'before:' . Carbon::now(),
    ]);
}

La mise en garde avec ceci est que l'erreur de validation sera lancée dans le modèle au lieu du contrôleur, mais cela ne devrait pas vraiment être un problème, je ne pense pas.

1
Padarom 5 avril 2017 à 16:30