我正在尝试为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/