2015-01-27 5 views
1

저는 최근 Symfony Routing 구성 요소로 작업하기 시작했습니다. 다음과 같이 YAMLSymfony2 라우팅에서 http POST를 인식하지 못합니까?

내 경로 :.에 따라 그러나 URL을 https://my.domain.com/custom "는 사용자 정의 YAML 파일에 한 요청 방법 후에가는 경우에도 기본 경로로 해석됩니다

custom: 
    path: /custom 
    defaults: {controller: custom, action: refresh} 
    methods: [POST] 
    schemes: [https] 
default: 
    path: /{controller}/{action} 
    defaults: {controller : index, action: index} 

, 내 jQuery를 아약스 설정 및 크롬 콘솔, POST입니다 :

XHR finished loading: POST "https://my.domain.com/custom". 

또는 크롬에 따라 네트워크 -> 헤더 :

Request URL:https://my.domain.com/custom 
Request Method:POST 

나도 같은 YAML 구성을 떠나는 얻을 요청 방법을 변경하면 예상 물론, 이는 중 하나가 작동하지 않습니다. 사용자 정의에 대한 yaml 구성을 변경하면 POST 대신 GET을 받아들이고 GET 요청을 보내면 예상대로 작동합니다. 하지만 사용자 정의에 대한 yaml 구성을 변경하고 POST 요청을 보내면 작동합니다. 즉, 사용자 정의 규칙이 일치합니다. 어떤면에서는 브라우저의 POST 요청이 서버 측에서 GET으로 해석되는 것처럼 보입니다.

일종의 이상한 Chrome 버그 인 경우 Firefox와 동일한 결과를 보았습니다.

그런 다음 $ _SERVER [ 'REQUEST_METHOD'] 인쇄를 시도했으며 결과는 예상대로 POST 요청이 POST이면 GET 요청이 GET 인 경우 GET. 그래서 그것은 어딘가에서 Symfony의 잘못이라고 생각합니다. 아마도 내가 잘못 설정 한 것 같습니다. 난 그냥 여기에 요청 컨텍스트를 근본적으로 뭔가를 잘못하고 있어요 강한 느낌이

$args  = isset($_REQUEST['args']) ? $_REQUEST['args'] : ''; 
$request = Request::createFromGlobals(); 
$locator = new FileLocator(HOME_PATH . 'config'); 
$loader  = new YamlFileLoader($locator); 
$routes  = $loader->load('routes.yml'); 
$context = new RequestContext($_SERVER['REQUEST_URI']); 
$context->setScheme($request->getScheme()); 
$context->setHost($_SERVER['SERVER_NAME']); 
$matcher = new UrlMatcher($routes, $context); 

try 
{ 
    $match   = $matcher->match('/' . rtrim($args, '/')); 
.... 
} 
.... 

,하지만 그건 내가 그들 작업 얻을 관리 방법, 그리고 사용 :

은 여기 내 관련 PHP 코드입니다 지금까지 GET 경로로 잘 작동합니다. 도와 주셔서 미리 감사드립니다.

+0

symfony2 표준 에디션 내에서 라우팅 구성 요소를 사용하고 있습니까? –

+0

아니요, 개별적으로 구성 요소로 사용합니다. – Sejanus

+0

좋아, 내가 도와 줄 수 없다. –

답변

0

미안하지만 거의 2 년이 지났지 만 방금이 문제를 해결했습니다.

당신은 Request 객체와 RequestContext 오브젝트를 배정 할 수있어 :

$request = Request::createFromGlobals(); 
$context = new RequestContext($_SERVER['REQUEST_URI']); 
$context->fromRequest($request); 
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

설명 :

(나는이 답이없는 질문을 발견했을 때와 frustated) 나는, 같은 문제로 실행되고 소스 코드를 파헤 치면서 모든 요청에 ​​대해 "GET"이라고 주장하는 이유를 알아 냈습니다.

내 실수는 UrlMatcher가 Request 객체 (덤프 할 때 'POST'를 표시)를 사용하고 있다고 생각했지만 실수하지 않았습니다. 그것은 RequestContext 객체를 사용한다.

당신은 심포니/라우팅/Matcher를/UrlMatcher.php

151 if ($requiredMethods = $route->getMethods()) { 
152  // HEAD and GET are equivalent as per RFC 
153  if ('HEAD' === $method = $this->context->getMethod()) { 
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
154   $method = 'GET'; 
155  } 

라인 (153)에이를 볼 수 있습니다 ...나는 RequestContext 클래스를 조사 할 때, 나는 생성자 기본값은 GET 것을 발견

52  public function __construct($baseUrl = '', $method = 'GET', $host = 'loc.... 

그러나 나는 기쁘게 생각도 행복하게 바로 docblock 우리의 문제를 해결하는 방법에 대해 설명 fromRequest 방법을 발견 :

64  /** 
65  * Updates the RequestContext information based on a HttpFoundation Request. 
      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^ 
66  * 
67  * @param Request $request A Request instance 
68  * 
69  * @return RequestContext The current instance, implementing a fluent interface 
70  */ 
71  public function fromRequest(Request $request) 
72  { 
73   $this->setBaseUrl($request->getBaseUrl()); 
74   $this->setPathInfo($request->getPathInfo()); 
75   $this->setMethod($request->getMethod()); 
76   $this->setHost($request->getHost()); 
77   $this->setScheme($request->getScheme()); 
78   $this->setHttpPort($request->isSecure() ? $this->httpPort : $request->getPort()); 
79   $this->setHttpsPort($request->isSecure() ? $request->getPort() : $this->httpsPort); 
80   $this->setQueryString($request->server->get('QUERY_STRING', '')); 
81 
82   return $this; 
83  } 

건배!

관련 문제