当前位置: 首页 > 知识库问答 >
问题:

如何覆盖Laravel 5中的注册函数

鲁鸿
2023-03-14

我试图通过遵循这个问题中的建议来覆盖Laravel 5中的注册函数。然而,在我的例子中,我并没有试图从注册页面重定向用户。相反,我只想注册新用户,但保持当前(管理员)用户登录。默认函数验证并登录新用户,然后重定向到“主页”。下面是我尝试添加到AuthController的内容。php:

// OVERRIDE FUNCTION IN AuthenticatesAndRegistersUsers (located under /Illuminate/Foundation/Auth)
public function postRegister(Request $request) {
    $validator = $this->registrar->validator($request->all());

    if ($validator->fails())
    {
        $this->throwValidationException(
            $request, $validator
        );
    }

    //$this->auth->login($this->registrar->create($request->all()));
    $this->registrar->create($request->all());

    return redirect('admin');
}

我认为我很聪明,只是创建了新帐户,然后将当前用户重定向到管理页面。但是,没有创建任何用户,也没有发生重定向。任何想法都将不胜感激!

共有3个答案

佴德曜
2023-03-14

您可能希望更改的另一个默认行为是在注册表之后立即自动登录。您可能希望将用户重定向到单独的“成功”页面,并期望他们稍后手动登录

为此,需要重写trait registerUsers的register()方法。

我们上面讨论的控制器,寄存器控制器,使用这个重要的特性:

class RegisterController extends Controller
{
use RegistersUsers;
// ... all other code of controller
This trait performs all the “dirty work” of registration. It is part of the core 
framework, located in 
vendor/laravel/framework/src/Illuminate/Foundation/Auth/RegistersUsers.php:

trait RegistersUsers
{
/**
 * Handle a registration request for the application.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return \Illuminate\Http\Response
 */
public function register(Request $request)
{
    $this->validator($request->all())->validate();

    event(new Registered($user = $this->create($request->all())));

    $this->guard()->login($user);

    return $this->registered($request, $user)
                    ?: redirect($this->redirectPath());
}

// ... A few other methods

}

要禁用自动登录,您需要删除此特定行:

$this->guard()->login($user);

但您不能直接编辑Laravel core或其内部/供应商的任何部分。您可以做的是重写相同的方法并将其放入RegisterController中,如下所示:

namespace App\Http\Controllers\Auth;

// DON'T FORGET TO ADD THESE TWO!
use Illuminate\Http\Request;
use Illuminate\Auth\Events\Registered;

use App\User;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Illuminate\Foundation\Auth\RegistersUsers;

class RegisterController extends Controller
{

// ... Other methods

/**
 * Handle a registration request for the application.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return \Illuminate\Http\Response
 */
public function register(Request $request)
{
    $this->validator($request->all())->validate();

    event(new Registered($user = $this->create($request->all())));

    return $this->registered($request, $user)
        ?: redirect($this->redirectPath());
}

}

最后,注意重定向到参数或方法,如前一个技巧中所示,这样您的注册用户将登录到正确的页面。

微生俊材
2023-03-14

看看artisan rout:list,在哪里调用postRegister?

您需要重写寄存器函数。

耿珂
2023-03-14

如果我是你,我宁愿在我的模型中使用“创建”静态方法,例如:对于注册,我使用“用户”模型,然后我只需使用:

User::create($data = array());

它只将数据存储到用户模型中的表中。然后简单地说:

return redirect('admin');

新用户将不会登录到该站点。它只是将数据存储到数据库中的表中。

 类似资料:
  • 问题内容: 场景: 该代码不起作用,而且我找不到像继承那样来调用trait函数的方法。我打过电话,,,和以下内容: 没用。 有没有办法使它起作用,或者我必须完全重写特质函数,它比这要复杂得多:) 问题答案: 您的最后一个快到了: 特质不是阶级。您不能直接访问其成员。基本上只是自动复制和粘贴…

  • 我在将应用程序从Java镜像到Kotlin时遇到了一些问题。我用java编写了这个类,效果很好: 在IntelijiIdea中自动转换后,它开始变成这样 但编译器告诉我 意外重写:以下声明具有相同的JVM签名(to boolean(Ljava/lang/String;)Z): fun toBoolean(p0: String?):在my . util . booleanutils fun to B

  • 问题内容: 我正在使用内置的django登录和注销。在我的Project / urls.py中,我添加了用于登录和注销的URL。 我的帐户应用程序文件夹中有模板文件夹。我有这样的目录结构 我已经阅读了django文档,其中说对于login()默认模板是registration / login.html,这在我的项目中工作正常,而logout()默认模板是registration / logged_

  • 问题内容: 有没有一种方法可以使类函数不可重写?类似于java的关键字。即,任何覆盖的类都不能覆盖该方法。 问题答案: 问题是您正在尝试使用Java哲学来用Python编写。有些东西会延续,但不是全部。在Python中,您可以执行以下操作,这非常好,但是完全违反了Java对对象的看法。 如果您确实需要,可以尝试此处发布的代码。但是正如您所看到的,有很多代码可以让它执行您想要的操作。还应注意,即使是

  • 问题内容: 是否有可能覆盖 全局 功能,从而在一定程度上影响 全局 功能? 据我所知,该函数在包装NodeJS脚本的函数中作为参数提供: 有什么方法可以修改功能吗? 这可能只会影响脚本所在的脚本。 我们如何在流程级别进行修改? 问题答案:

  • 问题内容: 有什么方法可以防止子类覆盖基类中的方法? 我的猜测是没有,但是我来自.NET界,并且我正试图使我的API尽可能健壮,因此,任何输入都将不胜感激。 可以强制执行吗?我知道编译器无济于事,所以也许通过一些运行时检查来解决?还是这不是一种处理事情的Python方法? 问题答案: 您是对的:您的尝试与Python的结构及其文化背道而驰。 记录您的API,并教育您的用户如何使用它。这是他们的程序