从另一个控制器获取服务中定义的变量

时间:2019-03-30 18:12:14

标签: php symfony service

我将直奔主题

我有以下两个简单的控制器:

/**
* @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。有共享服务实例的方法吗?

谢谢您的建议

1 个答案:

答案 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将数据存储在数据库中的某处也是一样。

希望对您有帮助。