ZF2 - BootStrap重定向

时间:2016-02-26 11:40:58

标签: zend-framework2 bootstrapping

我的用户必须先确认他们的电子邮件地址才能访问该应用程序。

我有一个特定的路线,如果他们登录并且他们的电子邮件未被确认,他们会被发送到:“customer / register-landing”这将发送一封电子邮件,该视图将解释他们需要做什么。

我使用bootstrap是为了简洁。

这是我到目前为止所做的最后一点,我正在努力解决(重新直接部分)

//I run console related queries and this breaks if run
if ( $e->getRequest() instanceof \ZF\ContentNegotiation\Request )
        {
            //Get a user object
            $authService = $sm->get( AuthorizationService::class );
            $userObject = $authService->getIdentity();

            if (!$userObject instanceof User ) {
                return;
            }

            if ($userObject->getIsEmailConfirmed() == 1) {
                return;
            }

            //So we have a logged in user who needs to confirm their email
            $redirect = $em->attach(MvcEvent::EVENT_DISPATCH,
                function($e){
                    $route = $e->getRouteMatch();

                    if ($route->getMatchedRouteName() != 'customer/register-landing')
                    {
                        //Redirect to the route: customer/register-landing
                    }


                }
            );

        }

重新指向实际页面需要做什么?我环顾四周,发现了这段代码:

                $em->getSharedManager()->attach('Zend\Mvc\Controller\AbstractActionController', 'dispatch', function($e) {
                    $controller = $e->getTarget();
                    $controller->plugin('redirect')->toRoute('customer/register-landing');

                }, 100);

然而,当我将它添加到课程中时,它不起作用:

$redirect = $em->attach(MvcEvent::EVENT_DISPATCH,
                    function($e){
                        $route = $e->getRouteMatch();

                        if ($route->getMatchedRouteName() != 'customer/register-landing')
                        {
                                               $em->getSharedManager()->attach('Zend\Mvc\Controller\AbstractActionController', 'dispatch', function($e) {
                        $controller = $e->getTarget();
                        $controller->plugin('redirect')->toRoute('customer/register-landing');

                    }, 100);
                        }


                    }
                );

这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

我用下一个代码解决了这个问题。如果您需要所有代码,请转到https://github.com/Gimalca/piderapido/blob/master/module/Admin/Module.php

class Module {

public function onBootstrap(MvcEvent $e) {

}

public function init(ModuleManager $moduleManager) {
    $moduleName = $moduleManager->getEvent()->getModuleName();
    if ($moduleName == 'Admin') {
        $events = $moduleManager->getEventManager();
        $sharedEvents = $events->getSharedManager();
        // This define modules need Login
        $sharedEvents->attach(array(__NAMESPACE__, 'Admin', 'Account'), 'dispatch', array($this, 'initAuth'), 100);
    }
}

public function initAuth(MvcEvent $e) {

    //This get router strings
    $routerMatch = $e->getRouteMatch();
    $module = $routerMatch->getMatchedRouteName();
    $controller = $routerMatch->getParam('controller');
    $action = $routerMatch->getParam('action');

    //This get Authenticate Class
    $app = $e->getApplication();
    $sm = $app->getServiceManager();
    $auth = $sm->get('Admin\Model\LoginAdmin');

    // This redirect all. but is login interface not 
    if ($controller != 'Admin\Controller\Login'  && !$auth->isLoggedIn()) {
        $controller = $e->getTarget();

        return $controller->redirect()->toRoute('admin',array('controller'=>'login','action' => 'index'));
    }


    if ($auth->isLoggedIn()) {

        $viewModel = $e->getViewModel();
        $viewModel->userIdentity = $auth->getIdentity();
    }
}