Правильно ли использовать подобный сервис в Symfony 3.4? - PullRequest
0 голосов
/ 20 декабря 2018

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

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

Ответы [ 4 ]

0 голосов
/ 20 декабря 2018

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

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

// 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 голосов
/ 20 декабря 2018

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

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

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

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

0 голосов
/ 20 декабря 2018
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 голосов
/ 20 декабря 2018

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

public function someFunction(someService $service) //I do that because I'm lazier than you.
{
    //your code
}

, автоматическое подключение будет искать вашу услугу и внедрять ее.

В services.yaml вы можете установить:

services:
    _defaults:
        autowire: true
        autoconfigure: true
        public: false

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...