2016-07-14 7 views
1

私はマルチアプリケーションを設計しました。マルチサイト管理者(すなわち、http://root.com/admin)とすべてのサイトアクセス(すなわちhttp://site1.comhttp://site2.com..)があります。 (マルチサイト管理者または子サイト)ルーティング処理するにはSymfony2機能テストクライアントはサーバーパラメータSERVER_NAMEを強制的に使用します。

、私はバーチャルホストの設定にUseCanonicalNameの設定:

そう
ServerName root.com 
ServerAlias media.site1.com site1.com media.site2.com, site2.com ... 

UseCanonicalName On 

、私は$要求 - >サーバー - >(「SERVER_NAME」を得ることを確信しています)は常にroot.comで返され、ルーティングプロセスではルートドメイン(管理目的)、子サイト、および404コンテンツの間で違いが生じます。

実生活ではうまくいっていますが、テストではUseCanonicalNameがvhostでServerNameを指定してSERVER_NAMEを強制しないようです。通常のクロームクライアントから

ダンプ:テストクライアントから

array(34) { 
    'HTTP_HOST' => 
    string(9) string 'site1.com' 
    ... 
    'HTTP_USER_AGENT' => 
    string(105) 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36' 
    'SERVER_NAME' => 
    string(8) 'root.com' 
    ... 
} 

ダンプ私はテストクライアント上でSERVER_NAMEを強制しようとした

array(16) { 
    'SERVER_NAME' => 
    string(9) "site1.com" 
    'HTTP_HOST' => 
    string(9) "site1.com" 
    'HTTP_USER_AGENT' => 
    string(19) "Symfony2 BrowserKit" 
    ... 
} 

$crawler = $this->client->request('GET', $route, [], [], ['SERVER_NAME' => 'root.com']); 

しかし、これは何も変わらない、私はまだSERVER_NAMEの値がHTTP_HOSTと等しく、子サイトFOかBO(SERVER_NAMEとHTTP_HOSTの違いが問題になる)をテストするときはすべてをねじ込む。

ので、Symfony2のBrowserKitはUseCanonicalNameのディレクティブは鈍感であるのはなぜ

  • クライアントクラスのパラメータを使用するにはどうすればよいですか?ビューの厳格なポイントに

答えて

0

は、私は最終的に上記のような問題を通じて自分の道を見つけることができた:私は、Clientクラスのオーバーロードされた(symfonyの\バンドル\ FrameworkBundle \クライアント)は、具体的にfilterRequest呼び出しの後にメソッドを要求:

public function request($method, $uri, array $parameters = array(), array $files = array(), array $server = array(), $content = null, $changeHistory = true) 
    { 
     if ($this->isMainRequest) { 
      $this->redirectCount = 0; 
     } else { 
      ++$this->redirectCount; 
     } 

     $uri = $this->getAbsoluteUri($uri); 

     $server = array_merge($this->server, $server); 

     if (isset($server['HTTPS'])) { 
      $uri = preg_replace('{^'.parse_url($uri, PHP_URL_SCHEME).'}', $server['HTTPS'] ? 'https' : 'http', $uri); 
     } 

     if (!$this->history->isEmpty()) { 
      $server['HTTP_REFERER'] = $this->history->current()->getUri(); 
     } 

     if (empty($server['HTTP_HOST'])) { 
      $server['HTTP_HOST'] = $this->extractHost($uri); 
     } 

     $server['HTTPS'] = 'https' == parse_url($uri, PHP_URL_SCHEME); 


     $this->internalRequest = new Request($uri, $method, $parameters, $files, $this->cookieJar->allValues($uri), $server, $content); 

     $this->request = $this->filterRequest($this->internalRequest); 

     // MY ADDITION 
     // 
     $this->request->server->replace(array_merge($this->request->server->all(), $server)); 

     // /MY ADDITION 
     // 

     if (true === $changeHistory) { 
      $this->history->add($this->internalRequest); 
     } 

     if ($this->insulated) { 
      $this->response = $this->doRequestInProcess($this->request); 
     } else { 
      $this->response = $this->doRequest($this->request); 
     } 

     $this->internalResponse = $this->filterResponse($this->response); 

     $this->cookieJar->updateFromResponse($this->internalResponse, $uri); 

     $status = $this->internalResponse->getStatus(); 

     if ($status >= 300 && $status < 400) { 
      $this->redirect = $this->internalResponse->getHeader('Location'); 
     } else { 
      $this->redirect = null; 
     } 

     if ($this->followRedirects && $this->redirect) { 
      return $this->crawler = $this->followRedirect(); 
     } 

     return $this->crawler = $this->createCrawlerFromContent($this->internalRequest->getUri(), $this->internalResponse->getContent(), $this->internalResponse->getHeader('Content-Type')); 
    } 

これを行うには、$ this-> request-> serverに含まれている実際のサーバーのparamsとrequestメソッドに渡された$ server paramsを強制的にマージします。

このようなマージは既に行われていますが($ server = array_merge($ this-> server、$ server);)、何らかの理由で私が説明できないfilterRequestコールの種類が要求を「リセット」します私のカスタムサーバーparams。

私はサブリクエストに関してこれが深い意味を持っているとはっきりとは分かりません。 AFAIK、それはちょうど最初のものから生じるすべてのリクエストまたはサブリクエストで私のカスタムサーバーパラメータをマージします。

一方、filterRequest(バイパスのみ)がすべてのサーバー変数をリセットする理由は誰にも分かりますか?

PS:機能試験セッションで別の問題が発生しましたが、私は尋ねましたanother question

関連する問題