Je dois vérifier si une entité Email
existe déjà dans le ArrayCollection
mais je dois effectuer la vérification des e-mails sous forme de chaînes (l'entité contient un ID et quelques relations avec d'autres entités, pour cela raison pour laquelle j'utilise un tableau séparé qui conserve tous les e-mails).
Maintenant, dans le premier, j'ai écrit ce code:
/**
* A new Email is adding: check if it already exists.
*
* In a normal scenario we should use $this->emails->contains().
* But it is possible the email comes from the setPrimaryEmail method.
* In this case, the object is created from scratch and so it is possible it contains a string email that is
* already present but that is not recognizable as the Email object that contains it is created from scratch.
*
* So we hav to compare Email by Email the string value to check if it already exists: if it exists, then we use
* the already present Email object, instead we can persist the new one securely.
*
* @var Email $existentEmail
*/
foreach ($this->emails as $existentEmail) {
if ($existentEmail->getEmail()->getEmail() === $email->getEmail()) {
// If the two email compared as strings are equals, set the passed email as the already existent one.
$email = $existentEmail;
}
}
Mais en lisant la classe ArrayCollection
, j'ai vu la méthode exists
qui semble être une façon plus élégante de faire la même chose que moi.
Mais je ne sais pas comment l'utiliser: quelqu'un peut-il m'expliquer comment utiliser cette méthode compte tenu du code ci-dessus?
Bien sûr, en PHP a Fermeture est un simple Fonctions anonymes . Vous pouvez réécrire votre code comme suit:
$exists = $this->emails->exists(function($key, $element) use ($email){
return $email->getEmail() === $element->getEmail()->getEmail();
}
);
J'espère que cette aide
Merci @Matteo!
Juste pour être complet, voici le code avec lequel j'ai trouvé:
public function addEmail(Email $email)
{
$predictate = function($key, $element) use ($email) {
/** @var Email $element If the two email compared as strings are equals, return true. */
return $element->getEmail()->getEmail() === $email->getEmail();
};
// Create a new Email object and add it to the collection
if (false === $this->emails->exists($predictate)) {
$this->emails->add($email);
}
// Anyway set the email for this store
$email->setForStore($this);
return $this;
}