我对几乎所有与网站有关的内容都很陌生(比如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修复”。但相反,我有“我正在修复”。我很确定我犯了一个非常愚蠢的错误,但我找不到它。任何帮助将不胜感激。
答案 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');
如果要使用模板中的链接,必须在其中附加参数或使用会话在应用程序实例之间传递变量。