Менеджер сущностей может обрабатываться с помощью шаблона внедрения зависимостей (DI). Этот шаблон полностью интегрирован в Symfony. Это забавный и волшебный c аспект Symfony.
Все классы, реализующие интерфейс, доступны с внедрением зависимостей. С Symfony4 + автоконфигурация активирована. Это кажется сложным, но для конечного разработчика это довольно просто. Вот простой пример того, как сделать это с вашими классами Phone, которые, кажется, представляют собой модель, в которой вы реализовали свою бизнес-логику c.
class Phone
{
private $entityManager;
//The entity manager will be provided to your constructor with the dependency injection.
public function __construct(EntityManagerInterface $entityManager)
{
$this->entityManager = $entityManager;
}
public function save($smsStore)
{
//you own logic go here
//here is the magic part, the entityManager is available, connected, ready to use.
$this->entityManager->persist($smsStore);
$em->flush();
}
}
Когда вы будете вызывать метод классов Utils, DI создаст его автоматически, и вы сможете использовать его свойство, в данном случае менеджер сущностей.
Если вы хотите использовать свой класс в контроллере, вы можете сделать это, добавив класс телефона в его конструктор :
class AuthController extends AbstractController
{
public function __construct(Phone $phoneUtils)
{
$this->phoneUtils = $phoneUtils;
}
public function someAction()
{
//your own logic here
//here is the magic part, the phone Utils is ready, it imports the entitymanager
//when you want to save your smsStore, simply call it
$this->phoneUtils->save($smsStore);
}
}
Вы используете Api-Platform, нет проблем! Вы можете воспроизвести этот шаблон проектирования в других классах, таких как ваши DataPersisters или в ваших EventListeners. Если вы посмотрите на этот пример в документации ApiPlateform , вы увидите, как автор получает менеджер Swiftmailer в своем прослушивателе событий. Просто замените swiftmailer на EntityManagerInterface или классы использования телефона.
(В контроллере существует самый простой способ извлечь класс использования телефона)
class AuthController extends AbstractController
{
//Do That: ADD Phone $phoneUtils as an argument in the method
public function someAction(Phone $phoneUtils)
{
//your own logic here
//Do not do that: $phoneUtils = new Phone();
//Magic! when you want to save your smsStore, simply call it
$phoneUtils->save($smsStore);
}
}
Если вы хотите получить Класс autowired (например, уровень безопасности), вы можете сделать это. Чтобы найти, какие классы могут быть подключены автоматически, есть несколько советов:
symfony console debug:autowiring
symfony console debug:autowiring Security
symfony console debug:autowiring AuthorizationChecker
. Он вернет все классы, соответствующие вашему запросу.
(Если вы не используете исполняемый файл symfony , вы можете заменить его на php bin / console debug: autowiring)