2017-10-10 1 views
0

J'ai un arbre comme celui-ci:services Symfony 3 non trouvé exception

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

Maintenant, je veux utiliser le service "MyStringService" dans "MyController" comme ceci:

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

Alors regardons au service, cela ne fondamentalement rien:

<?php 

namespace AppBundle\Service; 

class MyStringService 
{ 

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

} 

Et pour que je puisse l'appeler par l'ID je suit dans mes s ervices.yml:

services: 
    my_string_service: 
     class: AppBundle/Service/MyStringService 

Quand j'utilise php bin/console debug:container my_string_service je reçois:

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 
---------------- ----------------------------------- 

Maintenant, quand je commence le service et ouvrir la page localhost:8000/ ou localhost:8000/MyUsername je reçois un ServiceNotFoundException.

Alors maintenant je viens de commencer avec symfony et je ne sais pas ce qui me manque.

Merci à l'avance

+0

pourquoi 'public no'? – Matteo

Répondre

1

L'élément clé ici dans la sortie est Public no. Par défaut, avec une nouvelle installation de Symfony, les services sont privés, dans l'intention de les utiliser comme des dépendances plutôt que de les extraire du conteneur (ainsi, typé par un constructeur, ou avec une petite configuration supplémentaire, dans un ControllerAction).

Vous pouvez déclarer ce service comme public: true dans votre fichier services.yml, ou (mieux, à long terme), commencez à les définir dans un constructeur:

<?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); 
     ... 

Il existe une documentation sur la service_container page.

+0

Merci pour ça ... Maintenant, je peux travailler sur un Invalidname '" 'AppBundle/Service/MyStringService' "n'est pas un nom de classe valide pour le service" my_string_service ". – Xeni91

+1

C'est un nom \ namespace \ class –