当新用户向应用程序注册时添加表单字段

时间:2015-03-10 06:20:18

标签: php laravel laravel-5 eloquent

我正在尝试将字段添加到Laravel 5创建的users表中。我已修改了迁移以添加该字段:

class CreateUsersTable extends Migration
{
    public function up()
    {
        Schema::create('users', function(Blueprint $table)
        {
            $table->increments('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->string('password', 60);
            $table->string('my_new_field'); // Added this field
            $table->rememberToken();
            $table->timestamps();
        });
    }
    ...    
}

我使用的是Laravel提供的默认身份验证系统。每当新用户注册时,我都需要将my_new_field设置为某个值。我是如何(以及在​​哪里)做的?

AuthController处理身份验证过程。它使用trait AuthenticatesAndRegistersUsers postRegister()函数处理注册请求。但实际插入的值在哪里?

3 个答案:

答案 0 :(得分:6)

create()中的App\Services\Registrar方法负责创建新的User实例。我在这个函数中添加了字段:

   /**
     * Create a new user instance after a valid registration.
     *
     * @param  array  $data
     * @return User
     */
    public function create(array $data)
    {
        return User::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'password' => bcrypt($data['password']),
            'my_new_field' => 'Init Value'
        ]);
    }

根据documentation

  

修改新用户注册时所需的表单字段   使用您的应用程序,您可以修改App\Services\Registrar   类。该类负责验证和创建新用户   你的申请。

     

注册商的validator方法包含验证规则   对于应用程序的新用户,而create方法   注册商负责在您的用户中创建新的用户记录   数据库。您可以根据需要随意修改这些方法。   AuthController通过方法调用注册器   包含在AuthenticatesAndRegistersUsers特征中。

更新2016年2月3日 Laravel 5.2 app / Services / Registrar.php文件中的设置已移至app / Http / Controllers / Auth / AuthController.php

我还必须在User模型中填写此字段:

class User extends Model implements AuthenticatableContract, CanResetPasswordContract
{
     ...
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = ['name', 'email', 'password', 'my_new_field'];
    ...
}

答案 1 :(得分:0)

只需在字段中添加默认值:

class CreateUsersTable extends Migration {

    public function up()
    {
        Schema::create('users', function(Blueprint $table)
        {
            $table->increments('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->string('password', 60);
            $table->string('my_new_field')->default('init_value'); // Added this field
            $table->rememberToken();
            $table->timestamps();
        });
    }
    ...    
}

Alternativeley,只需使用新的迁移来添加列,以防已经执行了创建迁移:

class AddMyNewFieldToUsersTable extends Migration {
    public function up()
    {
        Schema::table('users', function($table) {
            $table->string('my_new_field')->default('init_value'); // Added 
        });
    }

    public function down()
    {
        Schema::table('users', function($table) {
            $table->dropColumn('my_new_field');
        });
    }
}

如果您不想使用db defaults,您还可以在store方法中在控制器中设置此值:

public class UsersController extends BaseController {

    // ...

    public function store(Request $request) {
        $user = new User;
        $user->fill($request->all());
        $user->my_new_field = 'init_value';
        $user->save();

        // return whatever
    }
}

修改 鉴于您在评论中提供的信息是一点指导:

AuthController(/app/Http/Controllers/Auth/AuthController.php)中添加以下方法(这将覆盖AuthenticatesAndRegistersUsers-trait的默认值,可以找到here

public function postRegister(Request $request)
{
    $validator = $this->validator($request->all());

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

    $user = $this->create($request->all()); // here the values are inserted
    $user->my_new_field = 'init_value';     // here would be the place to add your custom default
    $user->save();                          // maybe try to do all that in a single transaction...

    Auth::login($user);

    return redirect($this->redirectPath());
}

我不太确定这是否可以开箱即用,但它应该让你开始。

答案 2 :(得分:0)

打开位于(对于Laravel 5.2 AuthController)

的特征
/vendor/laravel/framework/src/Illuminate/Foundation/Auth/AuthenticatesAndRegistersUsers.php

在这里,您可以轻松找到负责登录和注册用户的有趣方法。

这些是

getRegister() // responsible for showing registration form

postRegister() // responsible for processing registration request

getLogin() // responsible for showing login form

postLogin() // responsible for authentication user

每次调用这些方法时,您将访问特定路由(auth / register或auth / login),即用户注册和&用户登录

希望这会清除一些概念!!