Intereting Posts
Как преобразовать таблицу parent-child (смежность) в вложенный набор с использованием PHP и MySQL? Подключение динамической базы данных Codeigniter Преобразование объекта в JSON и JSON в Object в PHP (библиотека, подобная Gson для Java) Считать элементы по условию с помощью XML и PHP? Предоставляет ли Aptana 3 плагин PHP так же хорошо, как Aptana 1.5.1? Предварительно определенные функции против определяемого пользователем? Отладка скриптов php-cli с помощью xdebug и netbeans? Уведомление в реальном времени от веб-сервера к клиенту PHP сравнивает два массива и получает согласованные значения, а не разницу Установка переменных в Constructor VS для определения класса Когда целесообразно использовать AJAX? Как использовать открытый идентификатор в качестве системы входа в систему Блоки – фигурные скобки / не фигурные скобки? время работы ресторана с таблицей базы данных в формате для чтения человеком с использованием php Получить параметры POST PUT с помощью Slim 3

Как автоматически регистрировать нового пользователя после регистрации у пользовательского провайдера в Silex?

Контекст: я создал пользовательский провайдер для моего приложения Silex, и теперь я могу зарегистрироваться и полностью зарегистрировать собственного пользователя. Тем не менее, мне нужно теперь автоматически регистрировать моего пользователя после регистрации, и это не работает.

Вот мой раздел безопасности:

'secured' => array( 'pattern' => '^/', 'anonymous' => false, 'form' => array('login_path' => '/login', 'check_path' => '/login_check'), 'logout' => array('logout_path' => '/logout', 'invalidate_session' => true), 'users' => $app->share(function () use ($app) { return new Partner\DAO\PartnerDAO($app['db']); }) ) 

Вот мой userProviderInterface:

 public function refreshUser(UserInterface $user) { if (!$user instanceof Partner) { throw new UnsupportedUserException(sprintf('Instances of "%s" are not supported.', get_class($user))); } return $this->loadUserByUsername($user->getUsername()); } public function supportsClass($class) { return 'Partner\Entity\Partner' === $class; } 

С Xdebug я вижу это здесь:

  foreach ($this->userProviders as $provider) { try { $refreshedUser = $provider->refreshUser($user); $token->setUser($refreshedUser); if (null !== $this->logger) { $this->logger->debug('User was reloaded from a user provider.', array('username' => $refreshedUser->getUsername(), 'provider' => get_class($provider))); } return $token; 

$this->userProviders содержит только один провайдер: 'Users' => null

Обратите внимание, что :

Вход, регистрация и выход из системы работают отлично. Эта ошибка запускается только тогда, когда я хочу автоматически войти в систему с моего пользователя после регистрации. Вот код:

 $token = new UsernamePasswordToken($partner, null, 'secured', $partner->getRoles()); // Note that $partner->getRoles() is array('ROLE_USER') $app['security.token_storage']->setToken($token); return $app->redirect($app["url_generator"]->generate("partner_home")); 

После регистрации я автоматически создаю токен и перенаправляю пользователя в защищенной области, но Silex перенаправляет его на страницу входа в систему, и если я нажму где-нибудь, я получу:

Для пользователя «Partner \ Entity \ Partner» нет пользователя.

Я не знаю, где искать больше, и мне действительно может понадобиться помощь.

Основано решение, более похожее на обходное решение, но оно делает работу:

Вместо того, чтобы использовать метод security / token, я теперь регистрирую пользователя, создавая запрос к контроллеру login_check, чтобы генерировать все необходимое событие входа.

В моем контроллере:

 $subRequest = Request::create( $app['url_generator']->generate('login_check'), 'POST', array( '_username' => $partner->getEmail(), '_password' => $rawPassword, $request->cookies->all(), array(), $request->server->all() ) ); $app->handle($subRequest, HttpKernelInterface::MASTER_REQUEST, false); 

Для чего требуется «require_previous_session» => false »в конфигурации брандмауэра:

 'secured' => array( 'pattern' => '^/', 'anonymous' => false, 'form' => array( 'login_path' => '/login', 'check_path' => '/login_check', 'require_previous_session' => false ), 'logout' => array('logout_path' => '/logout', 'invalidate_session' => true), 'users' => $app->share(function () use ($app) { return new Partner\DAO\PartnerDAO($app['db']); }) ) 

Я не уверен, что это хорошее или плохое решение, но оно работает.