我将直奔主题
我有以下两个简单的控制器:
/**
* @Route("/controller1", name="controller1")
*/
public function controller1(UserVerification $verification)
{
$verification->setVerificationCode();
return $this->render('user_settings/settings.html.twig');
}
/**
* @Route("/controller2", name="controller2")
*/
public function controller2(UserVerification $verification)
{
$verificationCode = $verification->getVerificationCode();
return $this->render('user_settings/settings.html.twig', [
'verificationCode' => $verificationCode
]);
}
UserVerification Service中的以下两种方法:
public function setVerificationCode(){
$this->verificationCode = rand(100000, 999999);
return $this;
}
public function getVerificationCode(): int
{
return $this->verificationCode;
}
我的问题是:在controller1中设置的controller2中获取VerificationCode是真的吗?现在,在上面的示例中,在controller1中,当我使用方法getVerificationCode()时,它成功返回了一些随机代码,但是,当然在controller2中,它返回了null。有共享服务实例的方法吗?
谢谢您的建议
答案 0 :(得分:1)
这是重点:
在Symfony中,默认情况下,服务是共享的,这意味着同一个实例正在处理许多请求,如果相反,您可以在服务的服务声明中对其进行修改,例如:
# config/services.yaml
services:
App\SomeNonSharedService:
shared: false
# ...
但是,这里有所不同,您的函数返回一个随机值,因此即使您使用的是相同的服务实例,也可以确保您不会得到相同的结果,因此在这里您可以做两件事:
1-将数据保存到会话中,以防登录时此逻辑与用户有关:
2-将数据保存到dababase
对于这两个解决方案,您必须让exmaple验证该值是否已存在于session / DB中,就像第一个this一样,结果是由您的服务产生的,同时将值存储在samewhere中,因此下一个请求,它将从您存放的地方接收数据。
如果您正在使用会话,这是一个示例:
# config/services.yaml
services:
App\Services\CodeService:
arguments:
- "@session"
ServiceCode:
<?php
namespace App\Services;
use Symfony\Component\HttpFoundation\Session\Session;
class CodeService
{
private $session;
public function __construct( Session $session)
{
$this->session = $session;
}
pulic function setVerificationId(){
if(isset(!$this->session->get('verificationCode'))){
$this->session->set('verificationCode', rand(100000, 999999));
}
return this->getVerificationId();
}
public function getVerificationId()
{
return $this->session->get('verificationCode');
}
}
这种情况只有在使用session时才有效,否则,请执行 使用EntityManager将数据存储在数据库中的某处也是一样。
希望对您有帮助。