2013-02-15 36 views
0

我想在ZF2做返回的JavaScript文件一個簡單的控制器動作。 簡單地說,就是我想要做的是什麼,用PHP,你可以通過以下方式做到:現在Zend框架2控制器動作返回JavaScript文件:錯誤500

<?php header('Content-Type: text/javascript'); ?> 
var foo = '<?php echo $bar; ?>'; 

,在ZF2我有一個的ActionController的這樣一個動作功能:

public function environmentAction() 
{ 
    $headers = new Headers(); 
    $headers->addHeaderLine('Content-Type', 'text/javascript'); 

    $this->getResponse()->setHeaders($headers); 

    $this->layout()->setTemplate('js/environment'); 

    $view = new ViewModel(); 
    return $view; 
} 

然後,路由被以下列方式構造:

'environment' => array(
    'type' => 'Literal', 
    'options' => array(
     'route' => '/js/environment.js', 
     'defaults' => array(
      'controller' => 'Application\Controller\Index', 
      'action'  => 'environment', 
     ), 
    ), 
) 

在結束時,視圖是一個.phtml文件(即在template_map部分下的0123所定義的一個鍵)喜歡在簡單的PHP案例:

var foo = '<?php echo $bar; ?>' 

因此,所有應該做的。我只是在我的layout.phtml頭部分添加一個<script>元素:

<script type="text/javascript" src="/js/environment.js"></script> 

的問題是,在我的瀏覽器控制檯我得到加載頁面時出現以下錯誤:

GET ***/js/environment.js 500 (Internal Server Error) 

但如果我嘗試在新頁面中打開相同的鏈接,我成功獲取腳本。

有什麼區別?在我的瀏覽器開發工具,我看到這個劇本和它的頭文件的HTTP GET請求是相同的所有其他要求的網絡部分,那麼,爲什麼不同的作用?爲什麼我得到這個錯誤?而在我的PHP日誌中沒有關於這個事件。任何想法?


解決修改這樣的操作功能:

public function environmentAction() 
{ 
    $headers = new Headers(); 
    $headers->addHeaderLine('Content-Type', 'text/javascript'); 

    $this->getResponse()->setHeaders($headers); 

    $view = new ViewModel(); 
    $view->setTemplate('js/environment'); 
    $view->setTerminal(true); 
    return $view; 
} 
+1

你不應該設置不同的佈局,而是叫'$ viewModel-> setTerminal(真)。 這完全_disables_佈局(這是什麼,你可能需要在這種情況下。 – Ocramius 2013-02-15 10:28:04

+0

究竟是你想達到什麼目的?如果你可以給你需要做的也許我們可以爲您提供更好的建議什麼的例子.. – Andrew 2013-02-15 10:47:11

+1

解決!@Ocramius,我只需要設置模板'因爲該視圖文件不在默認路徑'application/index/environment.phtml'中,但在另一個不同的路徑。 無論如何,我刪除了行$ this-> layout() - > setTemplate('js/environment');'並添加了'$ view-> setTemplate('js/environment'); $ view-> setTerminal(true);'返回視圖之前,它的工作原理!無論如何,這是奇怪的恕我直言,因爲我認爲它應該也適用於佈局控制器插件,它應該設置根模板(如果我沒有錯的話)。 – Alessio 2013-02-15 11:33:28

回答

0

這是做事情的一個非常糟糕的方式。

<script type="text/javascript" src="/js/environment.js"></script> 

這將使瀏覽器對文件中「/js/environment.js」這將再次匹配路線的新要求:

'route' => '/js/environment.js' 

你會得到一個競爭條件/無限循環。

根據您的Web服務器設置,如果您請求'/js/environment.js'並且文件真的存在(這是一個物理目錄alled js contains environment.js),那麼文件將被傳回,而不是無論如何,這是另一個不良後果。您所產生的視圖模型`;

+0

感謝您的回覆安德魯!也許我沒有解釋清楚。在總體佈局中,我添加了'