我有这次迁移:
Schema::create('users', function (Blueprint $table) {
$table->bigIncrements('id');
$table->bigInteger('company_id')->unsigned();
$table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
$table->boolean('enable')->default(0);
$table->string('name', 120)->nullable();
$table->string('surname', 120)->nullable();
$table->string('email', 120)->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->bigInteger('counter')->default(0);
$table->string('url_address', 160);
$table->string('ip', 25)->nullable();
$table->boolean('isCompany')->default(0);
$table->boolean('isMailing')->default(0);
$table->text('content')->nullable();
$table->string('nip1', 12)->nullable();
$table->string('business1', 120)->nullable();
$table->string('phone1', 60)->nullable();
$table->string('street1', 150)->nullable();
$table->string('number1', 8)->nullable();
$table->string('postal_code1', 12)->nullable();
$table->string('city1', 100)->nullable();
$table->bigInteger('country_id1')->default(0);
$table->bigInteger('provincial_id1')->default(0);
$table->string('nip2', 12)->nullable();
$table->string('business2', 120)->nullable();
$table->string('phone2', 60)->nullable();
$table->string('street2', 150)->nullable();
$table->string('number2', 8)->nullable();
$table->string('postal_code2', 12)->nullable();
$table->string('city2', 100)->nullable();
$table->bigInteger('country_id2')->default(0);
$table->bigInteger('provincial_id2')->default(0);
$table->string('nip3', 12)->nullable();
$table->string('business3', 120)->nullable();
$table->string('phone3', 60)->nullable();
$table->string('street3', 150)->nullable();
$table->string('number3', 8)->nullable();
$table->string('postal_code3', 12)->nullable();
$table->string('city3', 100)->nullable();
$table->bigInteger('country_id3')->default(0);
$table->bigInteger('provincial_id3')->default(0);
$table->decimal('cash', 9, 2)->default(0);
$table->decimal('lng', 10, 8)->default(0);
$table->decimal('lat', 10, 8)->default(0);
$table->boolean('enable_map')->default(0);
$table->rememberToken();
$table->timestamps();
$table->engine = "InnoDB";
});
关于登录Laravel,我有两个问题:
仅当用户启用enable = 1时,我才能登录
参数enable为默认值0。单击邮件中的激活链接后,我想在enable = 1上更改enable = 0
我该怎么做?
答案 0 :(得分:1)
调用attempt()
方法时,您可以传递一组可以使用的凭据。
您可以按照前面所述进行操作并创建自己的控制器,但是如果您使用的是laravel随附的身份验证支架(其中包括auth:make
和app/Http/Controllers/Auth
中的类),则只需进行编辑文件:
app/Http/Controllers/Auth/LoginController.php
在这里,您想通过添加以下内容来覆盖凭据方法:
protected function credentials(Request $request)
{
return array_merge($request->only($this->username(), 'password'), ['active' => 1]);
}
这意味着当其余代码自动插入时,它将使credentails数组看起来像:
array(
'username' => 'theusername',
'password' => 'thepassword',
'active' => 1
)
之前提到过,您应该将属性强制转换为布尔值,但这不是事实。 Laravel迁移会创建一个很小的int列而不是布尔值,并且强制转换仅在处理模型时有效。由于此数组用于生成数据库查询的条件,因此强制转换将不起作用,因为数据库中的值为1
而不是true
。
答案 1 :(得分:-1)
您将不得不覆盖默认的控制器和路由。
首先要删除自己创建的身份验证路由。
然后定义您的控制器。
对于登录部分,您可以创建自己的登录控制器,然后在其中进行自己的登录尝试,这是Laravel所使用的。您可以在此处添加所需的属性验证。
public function login(Request $request)
{
//Validate your form data here
$request->validate([
'email' => ['required', 'string'],
'password' => ['required', 'string'],
]);
//Create your own login attempt here
$login_atempt = Auth::attempt([
'email' => $request->email,
'password' => $request->password,
'enabled' => true //or 1 , I recommend you to cast your attribute to boolean in your model
], $request->filled('remember'));
if ($login_atempt) {
$request->session()->regenerate();
return redirect()->route('home'); //Your home screen route after successful login
}
//using custom validation message as Laravel does
throw ValidationException::withMessages([
'email' => [trans('auth.failed')],
]);
}
还添加了一种简单的方法来调用登录表单。
public function showLoginForm()
{
return view('auth.login');
}
然后选择您的路线(我将控制器命名为UserLoginController)
Route::group(['middleware' => 'guest'], function () {
Route::get('/login', 'UserLoginController@showLoginForm')->name('login.index');
Route::post('/login', 'UserLoginController@login')->name('login');
});
关于Laravel文档指出的第二个问题
验证电子邮件地址后,用户将自动重定向到/ home。您可以通过在VerificationController上定义redirectTo方法或属性来自定义验证后重定向位置:
protected $redirectTo = '/dashboard';
因此,您可以制作自己的控制器来处理启用属性更改和重定向的操作。
要完成此操作,请确保手动添加所需的身份验证路由。
答案 2 :(得分:-1)
为此,您必须制作自定义登录控制器并处理这种情况。 我要详细提及这一点,请按照以下步骤检查我。
更新您的路由/web.php
Route::get('/', function () {
return redirect(route('login'));
});
Route::get('/home', 'HomeController@index')->name('home');
Route::post('/authenticate', 'LoginController@authenticate')->name('authenticate');
Route::get('/logout', '\App\Http\Controllers\Auth\LoginController@logout');
并将此方法添加到此控制器中
/**
* Handle an authentication attempt.
*
* @param \Illuminate\Http\Request $request
*
* @return Response
*/
public function authenticate(Request $request)
{
//ADD VALIDATION CODE HERE
$credentials = $request->only('email', 'password');
if (Auth::attempt($credentials)) {
// Authentication passed...
return redirect()->intended('dashboard');
}
}
我希望这对您有用。