2014-09-11 80 views
0

我完全不熟悉與網站(如HTML,PHP,Twig,Symfony等)有關的所有內容。我必須從Silex開始建立一個網站。 到目前爲止,我設法讓所有的工作都能正常工作,但是我真的很想用我想要使用的共享服務。我在一個控制器中設置的信息在另一個控制器中不可用。我創建了一個非常小的例子來說明我的問題:Silex共享服務似乎被實例化了不止一次

//This is the main file app.php 
<?php 

require_once __DIR__.'/vendor/autoload.php'; 
require_once __DIR__.'/src/Inpainter.php'; 

$app = new Silex\Application(); 

$app->register(new Silex\Provider\TwigServiceProvider(), array(
    'twig.path' => __DIR__.'/templates', 
)); 

$app['inpainter'] = $app->share(function() use($app) { 
    return new Inpainter(); 
}); 

$app->get('/test/', function() use ($app){ 
    $app['inpainter']->setMask('foo'); 
    return $app['twig']->render('index.html.twig', array(
    )); 
}) 
->bind('home'); 

$app->get('/downloads/', function() use ($app){ 
    $app['inpainter']->writeMask(); 
    return $app['twig']->render('downloads.html.twig', array(
    )); 
}) 
->bind('downloads'); 

$app->run(); 

?> 

index.html.twig文件只包含一個重定向到「下載」的鏈接。 的Inpainter類如下所示:

<?php 

class Inpainter { 

    private $mask; 

    public function setMask ($mask) { 
     $this->mask = $mask; 
    } 

    public function writeMask() { 
     echo 'I am inpainting with ' . $this->mask; 
    } 

} 

?> 

現在,如果我點擊index網站的鏈接,該網站downloads應顯示「我以foo補繪」。但相反,我有「我正在修補」。我很確定我犯了一個非常愚蠢的錯誤,但我無法找到它。任何幫助將不勝感激。

回答

1

工作正常您的應用程序... 8-)

如果您使用的是index.html.twig您的應用程序鏈接將被迫創建一個新的實例 - 所以$app['inpainter']->setMask()從未執行路線時調用/downloads/

如果你想從一個路由(/test/)到另一個(/downloads/)切換,並保持你的應用程序實例活着,你可以use a subrequest

use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpKernel\HttpKernelInterface; 

$app->get('/test/', function() use ($app){ 
    $app['inpainter']->setMask('foo'); 
    $subRequest = Request::create('/downloads/', 'GET'); 
    return $app->handle($subRequest, HttpKernelInterface::SUB_REQUEST); 
}) 
->bind('home'); 

如果你想用你的模板,你必須在鏈接向它附加一個參數或使用會話來傳遞應用程序實例之間的傳遞變量。

+0

非常感謝,這是非常有益的! – Sarah 2014-09-12 07:46:29

相關問題