2017-06-21 2 views
0

J'ai un projet dans lequel chaque client a un sous-domaine unique et sa propre base de données. Je souhaite utiliser les files d'attente de Laravel pour traiter les tâches et envoyer des notifications. Mais comme le trait SerializesModels ne sérialise/ne désérialise que l'identificateur de modèle, le travail tente toujours d'extraire les données de la base de données principale, quel que soit le client qui initie le travail.Laravel, beanstalkd et plusieurs bases de données

Existe-t-il un moyen de spécifier une connexion db? Si ce n'est pas faisable, je suis ouvert à d'autres workflows suggérés.

Des Laravel docs:

modèles Eloquent seront gracieusement sérialisés et sérialisé lorsque le travail est en cours de traitement. Si votre travail en attente accepte un modèle Éloquent dans son constructeur, seul l'identificateur du modèle sera sérialisé dans la file d'attente. Lorsque le travail est effectivement traité, le système de file d'attente récupère automatiquement l'instance de modèle complète dans la base de données. Tout est totalement transparent pour votre application et évite les problèmes pouvant survenir lors de la sérialisation d'instances de modèle Eloquent complètes.

Exemple: Donc, un travail est envoyé avec l'ordre du OrderController

dispatch(new SendEventSignupEmail($order)); 

L'ordre est injecté par le constructeur dans la classe d'emploi

public function __construct(Order $order) 
{ 
    // 
    $this->order = $order; 
} 

Je crois comprendre que l'identifiant du modèle extrait et sérialisé et envoyé à la méthode du handle où il est non sérialisé et le modèle est récupéré à partir de la base de données.

public function handle() 
{ 
    Mail::to($this->order)->send(new EventSignup($this->order)); 
} 

Le problème est que, à ce stade, $ this-> commande est en fait un ordre différent (ou le travail échoue) parce que le trait serializesModels récupéré le modèle de la db par défaut.

Répondre

0

Le trait SerializesModels est (à mon avis) un peu non intuitif. Comme vous l'avez constaté, il ne sérialise que l'identifiant, puis frappe la base de données pour réhydrater l'objet. Cependant, ce trait n'est pas nécessaire pour sérialiser les modèles.

Supprimez le trait et il doit sérialiser l'objet dans son ensemble, afin que votre travail n'ait pas besoin de toucher la base de données pour obtenir ses données.