我正在尝试为ZFCUser模块实现一个功能,该功能将检测当前URL,将其传递给登录页面,并在用户登录后将其重定向到该URL。

有没有人尝试这样做?

我需要向人们提供指向该网站某些区域的链接,但要迫使他们先登录才能看到它们。

谢谢
苹果电脑

最佳答案

因此,由于ZfcUser(1.2)仅允许重定向到纯路由(没有参数,没有URI),因此我编写了自己的RedirectCallback进行覆盖,如下所示:

<?php

namespace Application\Controller;

use Zend\Mvc\Application;
use Zend\Mvc\Router\RouteInterface;
use Zend\Mvc\Router\Exception;
use Zend\Http\PhpEnvironment\Response;
use ZfcUser\Options\ModuleOptions;
use Zend\Mvc\Router\RouteMatch;
use Zend\Http\Request;

/**
 * Can redirect to the URI given during login.
 * N.B. Don't extend ZfcUser version since its members are all private.
 */
class RedirectUriCallback {

    /**
     * @var RouteInterface
     */
    protected $router;

    /**
     * @var Application
     */
    protected $application;

    /**
     * @var ModuleOptions
     */
    protected $options;

    /**
     * @param Application $application
     * @param RouteInterface $router
     * @param ModuleOptions $options
     */
    public function __construct(
    Application $application, RouteInterface $router, ModuleOptions $options
    ) {
        $this->router = $router;
        $this->application = $application;
        $this->options = $options;
    }

    /**
     * @return Response
     */
    public function __invoke() {
        $routeMatch = $this->application->getMvcEvent()->getRouteMatch();
        $redirect = $this->getRedirect($routeMatch->getMatchedRouteName(),
        $this->getRedirectRouteFromRequest());

        $response = $this->application->getResponse();
        $response->getHeaders()->addHeaderLine('Location', $redirect);
        $response->setStatusCode(302);
        return $response;
    }

    protected function getRedirectRouteFromRequest() {
        $request = $this->application->getRequest();
        $redirect = $request->getQuery('redirect')? : $request->getPost('redirect');
        return $this->getSafeRedirect($redirect);
    }

    /**
     * Sanitize URI: through router and back.
     * @param $uri
     * @return mixed
     */
    private function getSafeRedirect($uri) {
        if (!$uri) {
            return false;
        }
        try {
            $request = new Request;
            $request->setUri($uri);
            $routeMatch = $this->router->match($request);
            if ($routeMatch instanceof RouteMatch) {
                return $this->router->assemble(
                $routeMatch->getParams(),
                ['name' => $routeMatch->getMatchedRouteName()]
                );
            }
        } catch (Exception\RuntimeException $e) {

        }
        return null;
    }

    /**
     * Returns the url to redirect to based on current route.
     * If $redirect is set and the option to use redirect is set to true, it will return the $redirect url.
     *
     * @param string $currentRoute
     * @param mixed $redirect
     * @return mixed
     */
    protected function getRedirect($currentRoute, $redirect = null) {
        $redirect = $this->getSafeRedirect($redirect);
        if (!$this->options->getUseRedirectParameterIfPresent()) {
            $redirect = false;
        }
        if ($redirect) {
            return $redirect;
        }

        $route = 'zfcuser';
        switch ($currentRoute) {
            case 'zfcuser/register':
            case 'zfcuser/login':
                $route = $this->options->getLoginRedirectRoute();
                break;
            case 'zfcuser/logout':
                $route = $this->options->getLogoutRedirectRoute();
                break;
        }
        return $this->router->assemble([], ['name' => $route]);
    }

}


然后通过覆盖'zfcuser_redirect_callback'工厂来返回上述类,如下所示:

        'zfcuser_redirect_callback' => function ($sm) {
            $router = $sm->get('Router');
            $application = $sm->get('Application');
            $options = $sm->get('zfcuser_module_options');
            return new RedirectUriCallback($application, $router,
            $options);
        },


(祝你好运,没有保证。)

关于php - ZFCUser登录后重定向到自定义URL,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24385650/

10-12 04:15