Получить переменную, определенную в сервисе от другого контроллера - PullRequest
0 голосов
/ 30 марта 2019

Я пойду прямо к точке

У меня есть два простых контроллера:

/**
* @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:

public function setVerificationCode(){
    $this->verificationCode = rand(100000, 999999);
    return $this;
}

public function getVerificationCode(): int
{
    return $this->verificationCode;
}

Мой вопрос: это реально, чтобы получить validCode в controller2, который был установлен в controller1?На данный момент в приведенном выше примере в controller1, когда я использую метод getVerificationCode (), он успешно возвращает некоторый случайный код, но, конечно, в controller2 он возвращает ноль.Есть ли способ поделиться экземпляром службы?

Спасибо за любой совет

1 Ответ

1 голос
/ 30 марта 2019

Вот смысл:

В Symfony по умолчанию службы являются общими, что означает, что один и тот же экземпляр работает для многих запросов, если вы хотите наоборот, вы можете изменить его в объявлении службы своей службы.как:

# config/services.yaml
services:
    App\SomeNonSharedService:
        shared: false
        # ...

Но здесь все по-другому, ваша функция возвращает случайное значение, поэтому даже если вы используете один и тот же экземпляр службы, вы уверены, что у вас не будет одинакового результата, поэтому здесь выможет сделать 2 вещи:

1 - сохранить данные в сеансе в случае, если эта логика касается пользователя при входе в систему:

2 - сохранить данные в базу данных

Для двух решений вам нужно, чтобы exmaple проверил, существует ли уже значение в сеансе / БД, как в первом случае, это ваш сервис, который получит результат, и в то же время сохранитезначение же где-то, поэтому при следующем запросе он получит данные оттуда, где вы его собрали.

Вот пример, если вы используете Session:

# 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');
    }


}

Этот случай работает только в том случае, если вы используете сеанс, если нет, сделайте то же самое с помощью EntityManager для хранения данных в базе данных.

Надеюсьэто поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...