Я использую ZfcUser с ht-user-registration и scn-social-auth, и есть два довольно незначительных улучшения, которые я хочу добиться, чтобы расширить мою реализацию, но пока у меня нет большого успеха:
ht-user-registration отправляет новым пользователям электронное письмо после регистрации и отказывает им в доступе, пока они не активируют свою учетную запись, это работает нормально. Чтобы расширить это, я бы хотел перенаправить пользователя после регистрации, чтобы он отправлялся на страницу с указанием проверить свою электронную почту, а не на страницу входа в систему, что является стандартным поведением ZfcUser. Я попытался добавить прослушиватель событий в модуль начальной загрузки, который выглядит следующим образом:
$response = $e->getResponse();
// indicate that we intend to redirect after register action
// set the redirection location to the home page
$response->getHeaders()->addHeaderLine('Location', 'home');
$response->setStatusCode(302);
$response->sendHeaders();
$em = \Zend\EventManager\StaticEventManager::getInstance();
$em->attach('ZfcUser\Service\User', 'register', function($event) use ($response) {
// don't allow anything else to process this event
$event->stopPropagation();
// return the redirect response
return $response;
});
Это вызывается правильно, но перенаправление никогда не происходит, и пользователь по-прежнему попадает на страницу входа. Есть ли что-то еще, что мне нужно сделать, чтобы выполнить перенаправление? Или, может быть, есть лучший способ полностью достичь этого?
Я хотел бы добавить переменные макета, чтобы я мог изменять заголовки страниц и навигацию в своем шаблоне макета для страниц ZfcUser. Для этого я сделал переопределение UserController из ZfcUser следующим образом:
class UserController extends \ZfcUser\Controller\UserController
{
public function loginAction()
{
$this->layout()->setVariables(array(
'view_title' => 'Reports Login',
));
return parent::loginAction();
}
}
А затем переопределить invokable для zfcuser в конфиге следующим образом:
'controllers' => array(
'invokables' => array(
'Application\Controller\Index' => 'Application\Controller\IndexController',
'zfcuser' => 'Application\Controller\UserController',
),
),
Фреймворк пытается создать экземпляр моего UserController в нужной точке, но терпит неудачу с InvalidArgumentException: «Вы должны предоставить вызываемый redirectCallback», который, как я вижу, необходим для создания базового контроллера, но не передается моей переопределенной версии — любые подсказки, почему не? Я не могу найти работающий пример этого, чтобы помочь.
Может быть, есть гораздо более простой способ внедрить переменные макета в действия контроллера другого модуля?
[РЕДАКТИРОВАТЬ] Я нашел простой, но не очень элегантный способ сделать это. Так как мой модуль переопределяет представления как для входа в систему, так и для регистрации, можно установить переменные макета в представлении, поэтому я смог добавить один вкладыш в верхнюю часть каждого представления для установки переменной макета, например:<?php $this->layout()->setVariable('view_title', 'Register for an account'); ?>
Это не правильно, но работает. Если есть лучшее решение, которое я хотел бы знать.
Задача ещё не решена.
Других решений пока нет …