Служба Symfony 3 не найдена, исключение

У меня есть такое дерево:

src
`-- AppBundle  
    |-- AppBundle.php   
    |-- Controller   
    |   `-- MyController.php  
    `-- Service         
        `-- MyStringService.php

Теперь я хочу использовать службу «MyStringService» в «MyController» следующим образом:

<?php

namespace AppBundle\Controller;

use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Validator\Constraints\Date;
use Symfony\Component\VarDumper\Cloner\Data;

class MyController extends Controller 
{
    public function usernameAction(Request $request, $username)
    {
        $data = $this->get('my_string_service')->getString($username);
        return $this->render('profile.html.twig', $data);
    }
}

Итак, давайте посмотрим на сервис, который практически ничего не делает:

<?php

namespace AppBundle\Service;

class MyStringService 
{

    public function getString($string)
    {
        return $string;
    }

}

И чтобы я мог вызвать его по идентификатору, указанному в моем services.yml:

services:
    my_string_service:
        class: AppBundle/Service/MyStringService

Когда я использую php bin/console debug:container my_string_service, я получаю:

Information for Service "my_string_service"
===========================================

 ---------------- ----------------------------------- 
  Option           Value
---------------- ----------------------------------- 
  Service ID       my_string_service                  
  Class            AppBundle/Service/MyStringService  
  Tags             -                                  
  Public           no                                 
  Synthetic        no                                 
  Lazy             no                                 
  Shared           yes                                
  Abstract         no
  Autowired        yes                                
  Autoconfigured   yes
---------------- ----------------------------------- 

Теперь, когда я запускаю службу и открываю страницу localhost:8000/ или localhost:8000/MyUsername, я получаю ServiceNotFoundException.

Так что теперь я только начал с symfony и не знаю, чего мне не хватает.

Заранее спасибо


person Xeni91    schedule 10.10.2017    source источник
comment
почему public no ?   -  person Matteo    schedule 10.10.2017


Ответы (1)


Ключевым элементом здесь в выводе является Public no.

По умолчанию при новой установке Symfony службы являются частными, с намерением использовать их в качестве зависимостей, а не извлекать из контейнера (таким образом, через конструктор или с небольшой дополнительной настройкой в ​​ControllerAction).

Вы можете либо объявить эту службу как public: true в файле services.yml, либо (что лучше в долгосрочной перспективе) начать определять их в конструкторе:

<?php
namespace AppBundle\Service;

use AppBundle\Service\MyStringService

class MyStringService 
{
    private $strService;

    public function __constructor(MyStringService $strService)
    {
        $this->strService = $strService;
    }

    public function getString($string)
    {
        $data = $this->strService->getString($username);
        return $this->render('profile.html.twig', $data);
        ...

Документация есть на странице service_container.

person Alister Bulman    schedule 10.10.2017
comment
Спасибо за это... Теперь я могу работать с Invalidname "'AppBundle/Service/MyStringService'" is not a valid class name for the "my_string_service" service. - person Xeni91; 10.10.2017
comment
Это \namespace\имя класса - person Alister Bulman; 10.10.2017