代码之家  ›  专栏  ›  技术社区  ›  Sarah

Silex共享服务似乎实例化了多次

  •  0
  • Sarah  · 技术社区  · 10 年前

    我对几乎所有与网站有关的东西都是全新的(比如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 回复  |  直到 10 年前
        1
  •  1
  •   Ralf Hertsch    10 年前

    您的应用程序正在按预期工作。。。8-)

    如果您正在使用 链接 在里面 index.html.twig 您的应用程序将被迫创建一个新实例,因此 $app['inpainter']->setMask() 执行路由时从未调用 /downloads/ .

    如果您想从一条路线切换( /test/ )到另一个( /下载/ )并使应用程序实例保持活动状态,您可以 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');
    

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