Error "You have requested a non-existent service" en una API de Symfony

Hola a todos,

Estoy haciendo una API y uso Symfony 2.7. Mi problema radica cuando intento eliminar un registro, según el error el servicio no existe, pero el servicio existe y es funcional pues los métodos Get, POST y PUT funcionan.

Estos son los métodos del controlador:

/**
     * Removes a community.
     *
     * @ApiDoc(
     *   resource = true,
     *   statusCodes={
     *     204="Returned when successful"
     *   }
     * )
     *
     * @param int $id the community id
     * @return array|View|null
     */
    public function deleteCommunityAction($id)
    {
        try {
            if (!($community = $this->get($id))) {
                throw $this->createNotFoundException("Community does not exist.");
            } else {
                $this->get('app.handler.community_handler')->delete($community);
                return $this->routeRedirectView('get_communities', Codes::HTTP_NO_CONTENT);
            }
 
        } catch (InvalidFormException $exception) {
            return $exception->getForm();
        }
    }
 
    /**
     * Removes a community.
     *
     * @ApiDoc(
     *   resource = true,
     *   statusCodes={
     *     204="Returned when successful",
     *     404="Returned when the community is not found"
     *   }
     * )
     *
     * @param int $id the community id
     * @return RouteRedirectView
     */
    public function removeCommunityAction($id)
    {
        return $this->deleteCommunityAction($id);
    }

Y estos son los métodos en el Handler

/**
     * Remove a Community
     * @param CommunityInterface $community
     * @param array $parameters
     * @param string $method
     * @return bool
     */
    public function processDelete(CommunityInterface $community, array $parameters, $method = "DELETE")
    {
        $this->em->remove($community);
        $this->em->flush();
        return true;
    }
 
    /**
     * Delete a community
     *
     * @param CommunityInterface $community
     * @param array $parameters
     *
     * @return bool
     */
    public function delete(CommunityInterface $community, array $parameters)
    {
        return $this->processForm($community, $parameters, 'DELETE');
    }

Espero que alguno pueda ayudarme con mi problema,

Gracias.

Respuestas

#1

Me temo que sólo con esta información no vamos a poder descubrir la causa del error. Seguramente, en el mensaje de error te pone la línea exacta que está causando el problema y con suerte, algo más de información de contexto. Si esa información no es privada, ¿podrías pegarla aquí para tener más pistas sobre qué está sucediendo?

Por otra parte, quizás debes hacerlo de esa manera, pero en Symfony 2.7 el objeto Response ya define constantes para todos los estados de HTTP. Así que en vez de Codes:: HTTP_NO_CONTENT ya puedes hacer Response::HTTP_NO_CONTENT.

#2

Hola, en la linea de código !($community = $this->get($id)) de la acción deleteCommunityAction podria ser el problema, Ya que $this->get($id) en los controladres que extienden del controlador base de symfony se utilizar para obtener un servicio, como por ejemplo tu lo has hecho con $this->get('app.handler.community_handler').

Al parecer estas intentando obtener un registro (no se si de la base de datos) a partir de su id, por lo que deberás obtenerlo haciendo uso de algún repositorio de esas comunidades.

#3

Hola Javier, gracias por la respuesta, pues logré solucionarlo colocando un método aparte para realizar la búsqueda, de esta forma:

public function deleteCommunityAction($id)
    {
        try {
            $community = $this->getOr404($id);
            $this->get('app.handler.community_handler')->delete($community);
        } catch (InvalidFormException $exception) {
            return $exception->getForm();
        }
 
        return $this->routeRedirectView('get_communities');
    }
 
    protected function getOr404($id)
    {
        if (!($community = $this->get('app.handler.community_handler')->get($id))) {
            throw new NotFoundHttpException(sprintf('The resource \'%s\' was not found.', $id));
        }
 
        return $community;
    }

De esta manera me funcionó.

Gracias