Я хочу зарегистрировать класс App\Service\SomeService как сервис.
Вот мой services.yaml:
services:
_defaults:
autowire: false
autoconfigure: true
public: true
App\:
resource: '../src/*'
exclude: '../src/{Entity,Migrations,Tests,Kernel.php}'
App\Controller\:
resource: '../src/Controller'
tags: ['controller.service_arguments']
someservice:
class: App\Service\SomeService
Теперь запускаю debug:container someservice:
Information for Service "someservice"
=====================================
---------------- -------------------------
Option Value
---------------- -------------------------
Service ID someservice
Class App\Service\SomeService
Tags -
Public yes
Synthetic no
Lazy no
Shared yes
Abstract no
Autowired no
Autoconfigured yes
---------------- -------------------------
Но также, когда я запускаю debug:container App\\Service\\SomeService:
Information for Service "App\Service\SomeService"
=================================================
---------------- -------------------------
Option Value
---------------- -------------------------
Service ID App\Service\SomeService
Class App\Service\SomeService
Tags -
Public yes
Synthetic no
Lazy no
Shared yes
Abstract no
Autowired no
Autoconfigured yes
---------------- -------------------------
Оказывается, у меня есть еще одна служба, указывающая на тот же класс:
namespace App\Controller;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use App\Service\SomeService;
class DefaultController extends Controller
{
/**
* @Route("/")
* @return Response
*/
public function index()
{
var_dump($this->get('someservice') === $this->get(SomeService::class));
return new Response;
}
}
Выходы:
bool(false)
Почему у меня зарегистрированы две службы вместо одной?






Это потому, что вы дважды зарегистрировали его в своем services.yaml.
Один раз автоматически с этой строкой:
App\:
resource: '../src/*'
exclude: '../src/{Entity,Migrations,Tests,Kernel.php}'
Другой, вручную:
someservice:
class: App\Service\SomeService
Поскольку у них разные имена (someservice и App\Service\SomeService), они разные для Symfony.
Я предлагаю вам удалить второе объявление и вызывать службу только с ее полным именем в вашем контроллере: $this->get(SomeService::class)