Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

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

19 de agosto de 2015

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.

@javiereguiluz

19 agosto 2015, 8:21
#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.

@manuel_j555

19 agosto 2015, 14:49
#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

@miguelplazasr

19 agosto 2015, 14:49