Bonjour la communauté, c'est depuis le matin que je suis bloqué
Voilà l'erreur que symfony 4 m'affiche lorsque je lance le serveur :
Cannot autowire service "App\Service\Validate": argument "$registry" of met
hod "__construct()" references class "Doctrine\Bundle\DoctrineBundle\Regist
ry" but no such service exists. Try changing the type-hint to one of its pa
rents: interface "Doctrine\Common\Persistence\ManagerRegistry", or interfac
e "Symfony\Bridge\Doctrine\RegistryInterface".
Voici mon controller ( PostController.php)
<?php
namespace App\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use App\Service\Validate;
use Symfony\Component\HttpFoundation\JsonResponse;
use Nelmio\ApiDocBundle\Annotation\ApiDoc;
class PostController extends Controller
{
/**
*@ApiDoc(
* resource=true,
* description="Get one single post",
* requirements={
* {
* "name"="id",
* "dataType"="integer",
* "requirements"="\d+",
* "description"="The post unique identifier."
* }
* },
* section="posts"
* )
* @Route("/api/posts/{id}",name="show_post")
* @Method({"GET"})
*/
public function showPost($id)
{
$post=$this->getDoctrine()->getRepository('AppBundle:Post')->find($id);
if (empty($post)){
$response=array(
'code'=>1,
'message'=>'post not found',
'error'=>null,
'result'=>null
);
return new JsonResponse($response, Response::HTTP_NOT_FOUND);
}
$data=$this->get('jms_serializer')->serialize($post,'json');
$response=array(
'code'=>0,
'message'=>'success',
'errors'=>null,
'result'=>json_decode($data)
);
return new JsonResponse($response,200);
}
/**
* @ApiDoc(
* description="Create a new post",
*
* statusCodes = {
* 201 = "Creation with success",
* 400 = "invalid form"
* },
* responseMap={
* 201 = {"class"=Post::class},
*
* },
* section="posts"
*
*
* )
*
* @param Request $request
* @param Validate $validate
* @return JsonResponse
* @Route("/api/posts",name="create_post")
* @Method({"POST"})
*/
public function createPost(Request $request, Validate $validate)
{
$data=$request->getContent();
$post=$this->get('jms_serializer')->deserialize($data,'App\Entity\Post','json');
$reponse=$validate->validateRequest($post);
if (!empty($reponse)){
return new JsonResponse($reponse, Response::HTTP_BAD_REQUEST);
}
$em=$this->getDoctrine()->getManager();
$em->persist($post);
$em->flush();
$response=array(
'code'=>0,
'message'=>'Post created!',
'errors'=>null,
'result'=>null
);
return new JsonResponse($response,Response::HTTP_CREATED);
}
/**
* @ApiDoc(
* resource=true,
* description="Get the list of all posts",
* section="posts"
* )
*
* @Route("/api/posts",name="list_posts")
* @Method({"GET"})
*/
public function listPost()
{
$posts=$this->getDoctrine()->getRepository('App:Post')->findAll();
if (!count($posts)){
$response=array(
'code'=>1,
'message'=>'No posts found!',
'errors'=>null,
'result'=>null
);
return new JsonResponse($response, Response::HTTP_NOT_FOUND);
}
$data=$this->get('jms_serializer')->serialize($posts,'json');
$response=array(
'code'=>0,
'message'=>'success',
'errors'=>null,
'result'=>json_decode($data)
);
return new JsonResponse($response,200);
}
/**
* @param Request $request
* @param $id
* @Route("/api/posts/{id}",name="update_post")
* @Method({"PUT"})
* @return JsonResponse
*/
public function updatePost(Request $request,$id,Validate $validate)
{
$post=$this->getDoctrine()->getRepository('App:Post')->find($id);
if (empty($post))
{
$response=array(
'code'=>1,
'message'=>'Post Not found !',
'errors'=>null,
'result'=>null
);
return new JsonResponse($response, Response::HTTP_NOT_FOUND);
}
$body=$request->getContent();
$data=$this->get('jms_serializer')->deserialize($body,'App\Entity\Post','json');
$reponse= $validate->validateRequest($data);
if (!empty($reponse))
{
return new JsonResponse($reponse, Response::HTTP_BAD_REQUEST);
}
$post->setTitle($data->getTitle());
$post->setDescription($data->getDescription());
$em=$this->getDoctrine()->getManager();
$em->persist($post);
$em->flush();
$response=array(
'code'=>0,
'message'=>'Post updated!',
'errors'=>null,
'result'=>null
);
return new JsonResponse($response,200);
}
/**
* @Route("/api/posts/{id}",name="delete_post")
* @Method({"DELETE"})
*/
public function deletePost($id)
{
$post=$this->getDoctrine()->getRepository('App:Post')->find($id);
if (empty($post)) {
$response=array(
'code'=>1,
'message'=>'post Not found !',
'errors'=>null,
'result'=>null
);
return new JsonResponse($response, Response::HTTP_NOT_FOUND);
}
$em=$this->getDoctrine()->getManager();
$em->remove($post);
$em->flush();
$response=array(
'code'=>0,
'message'=>'post deleted !',
'errors'=>null,
'result'=>null
);
return new JsonResponse($response,200);
}
}
Voilà le service dans le dossier Validate
App/Service/Validate
<?php
namespace App\Service;
use Symfony\Component\Validator\ConstraintViolation;
use Symfony\Component\Validator\Validator\ValidatorInterface;
use Doctrine\Bundle\DoctrineBundle\Registry;
class Validate
{
private $validator;
private $em;
/**
* Validate constructor.
* @param ValidatorInterface $validator
*/
public function __construct(ValidatorInterface $validator,Registry $registry)
{
$this->validator=$validator;
$this->em=$registry;
}
public function validateRequest($data)
{
$errors = $this->validator->validate($data);
$errorsResponse = array();
/** @var ConstraintViolation $error */
foreach ($errors as $error) {
$errorsResponse[] = [
'field' => $error->getPropertyPath(),
'message' => $error->getMessage()
];
}
if (count($errors))
{
$reponse=array(
'code'=>1,
'message'=>'validation errors',
'errors'=>$errorsResponse,
'result'=>null
);
return $reponse;
}else{
$reponse=[];
return $reponse;
}
}
}
Voici le service
service.yaml
# Put parameters here that don't need to change on each machine where the app is deployed
# https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration
parameters:
locale: 'en'
services:
# default configuration for services in *this* file
_defaults:
autowire: true # Automatically injects dependencies in your services.
autoconfigure: true # Automatically registers your services as commands, event subscribers, etc.
public: false # Allows optimizing the container by removing unused services; this also means
# fetching services directly from the container via $container->get() won't work.
# The best practice is to be explicit about your dependencies anyway.
Mon_service:
class: App\Service\Validate
# makes classes in src/ available to be used as services
# this creates a service per class whose id is the fully-qualified class name
App\:
resource: '../src/*'
exclude: '../src/{Entity,Migrations,Tests,Kernel.php}'
# controllers are imported separately to make sure services can be injected
# as action arguments even if you don't extend any base controller class
App\Controller\:
resource: '../src/Controller'
tags: ['controller.service_arguments']
# add more service definitions when explicit configuration is needed
# please note that last definitions always *replace* previous ones
Aidez moi svp c'est depuis le matin que je cherche le problème sans succès.
Le problème vient de "App\Service\Validate" la classe "Registry", Symfony n'arrive pas à trouver cette classe, il faudrait que tu utilises "ManagerRegistry" ou "RegistryInterface". (Registry implémente probablement RegistryInterface donc tu peux l'utiliser sans que ça change quoi que ce soit au reste de ton code).
Merci beaucoup Romain--valin, si je dois utiliser ManagerRegistry, ce dernier est issue de quelle bibliothèque ? Je veux savoir le use que je dois employer stp
Voilà ce j'obtiens lorsque je fais la modification:
-Premi're modification: avec "Doctrine\Common\Persistence\ManagerRegistry
<?php
namespace App\Service;
use Symfony\Component\Validator\ConstraintViolation;
use Symfony\Component\Validator\Validator\ValidatorInterface;
use Doctrine\Common\Persistence\ManagerRegistry;
class Validate
{
private $validator;
private $em;
/**
* Validate constructor.
* @param ValidatorInterface $validator
*/
public function __construct(ValidatorInterface $validator,Registry $registry)
{
$this->validator=$validator;
$this->em=$registry;
}
public function validateRequest($data)
{
$errors = $this->validator->validate($data);
$errorsResponse = array();
/** @var ConstraintViolation $error */
foreach ($errors as $error) {
$errorsResponse[] = [
'field' => $error->getPropertyPath(),
'message' => $error->getMessage()
];
}
if (count($errors))
{
$reponse=array(
'code'=>1,
'message'=>'validation errors',
'errors'=>$errorsResponse,
'result'=>null
);
return $reponse;
}else{
$reponse=[];
return $reponse;
}
}
}
Deuxième changement Avec : Symfony\Bridge\Doctrine\RegistryInterface
<?php
namespace App\Service;
use Symfony\Component\Validator\ConstraintViolation;
use Symfony\Component\Validator\Validator\ValidatorInterface;
use Symfony\Bridge\Doctrine\RegistryInterface;
class Validate
{
private $validator;
private $em;
/**
* Validate constructor.
* @param ValidatorInterface $validator
*/
public function __construct(ValidatorInterface $validator,Registry $registry)
{
$this->validator=$validator;
$this->em=$registry;
}
public function validateRequest($data)
{
$errors = $this->validator->validate($data);
$errorsResponse = array();
/** @var ConstraintViolation $error */
foreach ($errors as $error) {
$errorsResponse[] = [
'field' => $error->getPropertyPath(),
'message' => $error->getMessage()
];
}
if (count($errors))
{
$reponse=array(
'code'=>1,
'message'=>'validation errors',
'errors'=>$errorsResponse,
'result'=>null
);
return $reponse;
}else{
$reponse=[];
return $reponse;
}
}
}
J'obtiens l'erreur suivante dans les deux cas :
C:\xampp\htdocs\symfony4\symfony\sf4>php bin/console server:run
In DefinitionErrorExceptionPass.php line 37:
Cannot autowire service "App\Service\Validate": argument "$registry" of met
hod "__construct()" has type "App\Service\Registry" but this class was not
found.
Merci beaucoup RV j'ai pu resoudre le problème et desormais je vais pouvoir bien lire mes erreurs lorsqu'elles apparaitrons et c'est grace à toi
Il fallait que je change aussi Registry dans le contructeur par RegistryInterface comme suit:
<?php
namespace App\Service;
use Symfony\Component\Validator\ConstraintViolation;
use Symfony\Component\Validator\Validator\ValidatorInterface;
use Symfony\Bridge\Doctrine\RegistryInterface;
class Validate
{
private $validator;
private $em;
/**
* Validate constructor.
* @param ValidatorInterface $validator
*/
public function __construct(ValidatorInterface $validator,RegistryInterface $registry)
{
$this->validator=$validator;
$this->em=$registry;
}
public function validateRequest($data)
{
$errors = $this->validator->validate($data);
$errorsResponse = array();
/** @var ConstraintViolation $error */
foreach ($errors as $error) {
$errorsResponse[] = [
'field' => $error->getPropertyPath(),
'message' => $error->getMessage()
];
}
if (count($errors))
{
$reponse=array(
'code'=>1,
'message'=>'validation errors',
'errors'=>$errorsResponse,
'result'=>null
);
return $reponse;
}else{
$reponse=[];
return $reponse;
}
}
}
Une fois de plus merci
- Edité par GregoireYakeu 29 mai 2018 à 7:40:17
Erreur controller symfony 4
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Développeur PHP / Symfony en Freelance
Développeur PHP / Symfony en Freelance