Subrequests com post vars

Aqui está o quadro geral: estou escrevendo um pacote do symfony2 para minha aplicação web. Esta aplicação consiste em um site padrão com controladores CRUD. E, por outro lado, contém uma api de descanso que também gerencia criação / edição / … em entidades.

Comecei a escrever o Rest\UserController para a entidade do User . Ele contém todas as ações REST padrão (GET, POST, PUT, DELETE). Baseia-se no muito bom tutorial de William Durand: http://williamdurand.fr/2012/08/02/rest-apis-with-symfony2-the-right-way/

Uma vez que isso foi criado e funcional, criei outro UserController para lidar com o lado da web do aplicativo. Neste controlador eu tenho uma ação chamada editAction que processa um formulário em uma resposta HTML. Este formulário, quando enviado, envia uma solicitação PUT para a ação do controlador de ação. Minha idéia era encaminhar o pedido para Rest\UserController com action putAction . Aqui está o código para UserController::putAction :

  /** * This action forwards the request to the REST controller. It redirects * to a user list upon success, or displays the message should an error * occur. * @Route("/{id}/put", name="igt_user_put") * @Method("PUT") */ public function putAction (User $user) { $response = $this->forward('MyBundle:Rest\User:put', array('id'=>$user->getId())); if ($response->getStatusCode() == Response::HTTP_NO_CONTENT) { return new RedirectResponse($this->generateUrl('igt_user_list')); } return $response; } 

Isso funciona como um charme e parece que é a boa maneira de fazê-lo. O problema ocorreu quando pensei que eu faria o mesmo para a ativação / desativação do usuário. Eu teria um lockAction no UserController que executaria uma solicitação através do “Rest \ UserController :: putAction” com dados sintéticos para alterar o campo habilitado.

Mas o meu problema é que parece não haver nenhuma maneira de configurar o POST vars na chamada direta (somente caminho e consulta). Eu até tentei usar $ kernel-> handle ($ request) com uma solicitação sintética, mas não encontra as rotas do meu controlador Rest.

Estou esquecendo de algo ?

Não tenho certeza de que isso funcionará ou não, mas você pode tentar.

 // Framework controller class public function forward($controller, array $path = array(), array $query = array()) { $path['_controller'] = $controller; $subRequest = $this->container->get('request_stack') ->getCurrentRequest()->duplicate($query, null, $path); return $this->container->get('http_kernel')->handle($subRequest, HttpKernelInterface::SUB_REQUEST); } 

Podemos ver que duplica o pedido atual e depois o manipula.

 // Request /** * Clones a request and overrides some of its parameters. * * @param array $query The GET parameters * @param array $request The POST parameters * @param array $attributes The request attributes (parameters parsed from the PATH_INFO, ...) * ... */ public function duplicate(array $query = null, array $request = null, array $attributes = null, array $cookies = null, array $files = null, array $server = null) { 

Portanto, o método duplicado levará uma matriz de variables ​​pós. Então tente algo como:

 public function forwardPost($controller, array $path = array(), array $query = array(), array $post = array()) { $path['_controller'] = $controller; $subRequest = $this->container->get('request_stack') ->getCurrentRequest()->duplicate($query, $post, $path); return $this->container->get('http_kernel')->handle($subRequest, HttpKernelInterface::SUB_REQUEST); } 

Tenha curiosidade para ver se isso vai funcionar. Eu sempre coloquei o meu REST como um aplicativo separado e, em seguida, use guzzle para interface para ele. Mas o encaminhamento seria mais rápido.

Intereting Posts