首页 > 解决方案 > 如何从 OctoberCMS 插件中的事件处理程序重定向?

问题描述

我在插件的启动事件中为“rainlab.user.logout”注册了一个监听器。

public function boot()
{
    Event::listen('rainlab.user.logout', function ($controller) {
        return Redirect::to('https://www.google.com');
    });
}

它什么也不做。我已通过使用确认流程正在到达此块

header("Location: https://www.google.com");
exit;

代替 return 语句,它会在没有重定向的情况下给出一个警告框说“错误” 。

标签: octobercmsoctobercms-plugins

解决方案


您可以使用 Logout Ajax 链接的数据属性重定向到任何您想要的地方。检查下面的例子。[为此,您需要将会话组件添加到您的页面]

检查更多信息:https ://octobercms.com/plugin/rainlab-user#documentation

<a data-request="onLogout" 
   data-request-data="redirect: 'https://www.google.com'"
>
   Sign out
</a>

不过,如果您想使用事件来重定向用户,您可以使用下面的代码。注意:它是一种 hacky 方法not recommended but yes it works

Event::listen('rainlab.user.logout', function ($controller) {
  $_POST['redirect'] = 'https://www.google.com';        
});

为什么您的方法不起作用[仅用于理解的额外内容]

因为在事件处理程序中他们没有捕获您从事件返回的任何数据,returning Redirect但在处理程序中他们没有捕获或接收它,这个事件rainlab.user.logout只是触发并且让您不再访问$user对象数据。所以你的退货声明对它没有影响。

内容:plugins/rainlab/user/components/Session.php

public function onLogout()
{
    $user = Auth::getUser();

    Auth::logout();

    if ($user) {
        Event::fire('rainlab.user.logout', [$user]);
        // ^ see, nothing is here which can accept your return redirect.
    }

    $url = post('redirect', Request::fullUrl());

    Flash::success(Lang::get('rainlab.user::lang.session.logout'));

    return Redirect::to($url);
}

如果您有任何疑问,请发表评论。


推荐阅读