Silex共享服务似乎不止一次被实例化

时间:2014-09-11 12:35:21

标签: silex

我对几乎所有与网站有关的内容都很陌生(比如HTML,PHP,Twig,Symfony,......)。我必须从头开始与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 个答案:

答案 0 :(得分: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');

如果要使用模板中的链接,必须在其中附加参数或使用会话在应用程序实例之间传递变量。