Так разрешено ли это использовать или лучше внедрить службу в конструктор контроллера? Я знаю, что есть лучший способ, но я могу сделать это ради лени?
class someController extends Controller
{
/**
* @Route("/test")
*/
public function someFunction()
{
$manager = $this->getDoctrine();
$service = new someService($manager);
$all = $service->getAll();
dump($all);exit;
}
}
------------------------------------------------
use Doctrine\Common\Persistence\ManagerRegistry;
class someService implements someServiceInterface
{
/**
* @var ManagerRegistry
*/
private $manager;
public function __construct($manager)
{
$this->manager = $manager;
}
public function getAll()
{
return $this->manager->getRepository(SomeEntity::class)->findAll();
}
}
Я полагаю, у вас есть проблемы с вашим сервисом, потому что вам нужно внедрить менеджер сущностей внутрь. Пожалуйста, обратите внимание, что в этом нет ничего плохого. Вот код, который должен работать:
Допустим, мы внедряем сервис:
// Better use camel case with upper first letter
class SomeController extends Controller
{
/**
* @Route("/test")
*/
public function someFunction(SomeService $someService)
{
$all = $someService->getAll();
dump($all);exit;
}
}
Вы можете добавить непосредственно в конструктор вашего контроллера, но здесь я использую инъекцию действия, см документацию.
Вот как выглядит ваш сервис:
class SomeService implements SomeServiceInterface
{
/**
* @var EntityManagerInterface
*/
private $manager;
// Type hinting matters here!
public function __construct(EntityManagerInterface $manager)
{
$this->manager = $manager;
}
public function getAll()
{
return $this->manager->getRepository(SomeEntity::class)->findAll();
}
}
Это работает «из коробки» в настройках Symfony 4.x, потому что они определяют автозагрузку службы и автопровод по умолчанию. Какие функции доступны в Symfony 3.4, см документацию.
Но для того, чтобы настроить все это вручную, вам может понадобиться эта конфигурация:
You\SomeController:
autowire: true
tags: ['controller.service_arguments']
You\SomeService:
autowire: true
Наконец, если вы ищете способ создания ленивых сервисов, это особенность компонента внедрения зависимостей в Symfony. Увидеть снова, документация здесь.
Хотя это не так (ваше приложение не будет зависать), это не рекомендуется.
Я предлагаю вам прочитать это страница
Как вы уже догадались, вы можете добавить свой сервис в свой конструктор.
Просто включите его в вашем config.yml, добавив
App\Controller\:
resource: '../../Controller'
tags: ['controller.service_arguments']
Это решит вам много проблем и рефакторинга, когда вашему сервису понадобится другая зависимость
Вы можете внедрить свой сервис непосредственно в контроллер, используя
public function someFunction(someService $service) //I do that because I'm lazier than you.
{
//your code
}
Auto-Wiring будет искать ваш сервис и внедрить его.
В services.yaml вы можете установить:
services:
_defaults:
autowire: true
autoconfigure: true
public: false
Более подробную информацию, касающуюся автомобильной проводки, можно найти в документация
class SomeController extends AbstractController // Controller deprecated since 4.0
{
/**
* @Route("/test")
*/
public function someFunction(SomeServiceInterface $someService) // that's all what you need, "autowire: true" by default since 3.4
{
$manager = $this->getDoctrine();
$all = $someService->getAll();
dump($all);exit;
}
}
------------------------------------------------
use Doctrine\Common\Persistence\ManagerRegistry;
class SomeService implements SomeServiceInterface
{
/**
* @var ManagerRegistry
*/
private $manager;
public function __construct(ManagerRegistry $manager) // autowire
{
$this->manager = $manager;
}
public function getAll()
{
return $this->manager->getRepository(SomeEntity::class)->findAll();
}
}