Правильно ли использовать подобный сервис в Symfony 3.4?

Так разрешено ли это использовать или лучше внедрить службу в конструктор контроллера? Я знаю, что есть лучший способ, но я могу сделать это ради лени?

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();
}
}

0

Решение

Я полагаю, у вас есть проблемы с вашим сервисом, потому что вам нужно внедрить менеджер сущностей внутрь. Пожалуйста, обратите внимание, что в этом нет ничего плохого. Вот код, который должен работать:

Допустим, мы внедряем сервис:

// 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. Увидеть снова, документация здесь.

0

Другие решения

Хотя это не так (ваше приложение не будет зависать), это не рекомендуется.
Я предлагаю вам прочитать это страница

Как вы уже догадались, вы можете добавить свой сервис в свой конструктор.
Просто включите его в вашем config.yml, добавив

App\Controller\:
resource: '../../Controller'
tags: ['controller.service_arguments']

Это решит вам много проблем и рефакторинга, когда вашему сервису понадобится другая зависимость

1

Вы можете внедрить свой сервис непосредственно в контроллер, используя

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

Более подробную информацию, касающуюся автомобильной проводки, можно найти в документация

0

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();
}
}
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector