У меня есть Symfony тестовый пример, в котором я проверяю аутентификацию в административной области моего сайта. Вот тестовый пример (действительно очень простой):
public function setUp()
{
$this->client = static::createClient();
}
/* ... */
public function testAdminHomepageAllowsAdmins(): void
{
$this->logInAs('admin@website.com', ['ROLE_SUPER_ADMIN']);
$this->client->request('GET', '/admin');
self::assertResponseStatusCodeSame(Response::HTTP_OK);
}
private function logInAs(string $name = 'user@website.com', array $roles = ['ROLE_USER']): void
{
$session = self::$container->get('session');
$firewall = 'main';
$token = new UsernamePasswordToken($name, null, $firewall, $roles);
$session->set('_security_'.$firewall, serialize($token));
$session->save();
$cookie = new Cookie($session->getName(), $session->getId());
$this->client->getCookieJar()->set($cookie);
}
Проблема заключается в том, что мой код не выполняется, поскольку в ответе содержится код состояния HTTP 500 со следующим сообщением, отправленным Symfony:
Impossible to access an attribute ("email") on a null variable. (500 Internal Server Error)
Я знаю, что источником ошибки является TWIG. Очевидно, что для переменной Twig недостаточно UsernamePasswordToken
. {{ app.user }}
- устанавливается в ноль, и поэтому, когда Я звоню:
<span class="navbar-text">
Logged in as {{ app.user.email }} - <a href="{{ path('app_logout') }}">Log out</a>
</span>
В моем шаблоне отправлено исключение. То, что я хотел бы сделать, это сделать тестовый проход без изменения шаблона TWIG . Я только хочу изменить код, который есть в моем тестовом примере.
Обратите внимание, что он не работает даже с «функциональной» функцией входа в систему, например:
private function logInAs(string $email, string $plainPassword): void
{
$csrfToken = $this->client->getContainer()->get('security.csrf.token_manager')->getToken('authenticate');
$this->client->request('POST', '/login', [
'email' => $email,
'password' => $plainPassword,
'_csrf_token' => $csrfToken
]);
$this->client->followRedirect();
}