我正在学习PHP,我直接开始使用OOP。所以我试图构建一个完整的登录系统,包括通过电子邮件激活用户 - > https://www.youtube.com/watch?v=LJJXCni8mNc。
但我现在遇到了问题。用户可以登录,但不会激活。当然,我检查了数据库。注册后active
设置为0
,如果我理解代码正确,那么active
true
login.php
时,用户才能进入。我在if ($v->passes()){
$user = $app->user
->where('username', $identifier)
->orWhere('email', $identifier)
->where('active', true)
->first
register.php
我添加了user.php
login.php
和<?php
use ZESI\User\UserPermission;
$app -> get('/register', $guest(), function() use ($app){
$app->render('auth/register.php');
})->name('register');
$app -> post('/register', $guest(), function() use ($app) {
$request = $app->request;
$email = $request->post('email');
$username = $request->post('username');
$password = $request->post('password');
$password2 = $request->post('password2');
$v = $app->validation;
$v->validate([
'email' => [$email, 'required|email|uniqueEmail'],
'username' => [$username, 'required|alnumDash|max(20)|uniqueUsername'],
'password' => [$password, 'required|min(6)'],
'password2' => [$password2, 'required|matches(password)'],
]);
if ($v->passes()){
$identifier = $app->randomlib->generateString(128);
$user = $app->user->create([
'email' => $email,
'username' => $username,
'password' => $app->hash->password($password),
'active' => false,
'active_hash' => $app->hash->hash($identifier),
]);
$user->permissions()->create(UserPermission::$defaults);
$app->mail->send('email/auth/registered.php', ['user' => $user, 'identifier' => $identifier], function ($message) use ($user){
$message->to($user->email);
$message->subject('Ihre Registrierung');
});
$app->flash('global', 'Registrierung erfolgreich');
$app->response->redirect($app->urlFor('home'));
}
$app->render('auth/register.php', [
'errors' => $v->errors(),
'request' => $request,
]);
})->name('register.post');
,我希望有人可以告诉我我的错误在哪里。
register.php
<?php
namespace ZESI\User;
use Illuminate\Database\Eloquent\Model as Eloquent;
class User extends Eloquent{
protected $table = 'users';
protected $fillable = [
'email',
'username',
'password',
'active',
'active_hash',
'remember_identifier',
'remember_token',
];
public function getFullName(){
if (!$this->firstname || !$this->lastname){
return null;
}
return "{$this->firstname} {$this->lastname}";
}
public function getFullNameOrUsername(){
return $this->getFullName() ?: $this->username;
}
public function activateAccount(){
$this->update([
'active' => true,
'active_hash' => null
]);
}
public function getAvatarUrl($options = []){
$size = isset($options['size']) ? $options['size']: 45;
return 'http://www.gravatar.com/avatar/' . md5($this->email) . '?s=' . $size . '&d=identicon';
}
public function updateRememberCredentials($identifier, $token){
$this->update([
'remember_identifier' => $identifier,
'remember_token' => $token,
]);
}
public function removeRememberCredentials(){
$this->updateRememberCredentials(null, null);
}
public function hasPermission($permission){
return (bool) $this->permissions->{$permission};
}
public function isAdmin(){
return $this->hasPermission('is_admin');
}
public function permissions(){
return $this->hasOne('ZESI\User\UserPermission', 'user_id');
}
}
user.php的
<?php
use Carbon\Carbon;
$app->get('/login', $guest(), function() use ($app) {
$app->render('auth/login.php');
})->name('login');
$app->post('/login', $guest(), function() use ($app){
$request = $app->request;
$identifier = $request->post('identifier');
$password = $request->post('password');
$remember = $request->post('remember');
$v = $app->validation;
$v->validate([
'identifier' => [$identifier, 'required'],
'password' => [$password, 'required']
]);
if ($v->passes()){
$user = $app->user
->where('username', $identifier)
->orWhere('email', $identifier)
->where('active', true)
->first();
if ($user && $app->hash->passwordCheck($password, $user->password)){
$_SESSION[$app->config->get('auth.session')] = $user->id;
if ($remember === 'on'){
$rememberIdentifier = $app->randomlib->generateString(128);
$rememberToken = $app->randomlib->generateString(128);
$user->updateRememberCredentials(
$rememberIdentifier,
$app->hash->hash($rememberToken)
);
$app->setCookie(
$app->config->get('auth.remember'),
"{$rememberIdentifier}___{$rememberToken}",
Carbon::parse('+1 week')->timestamp
);
}
$app->flash('global', 'Login erfolgreich');
$app->response->redirect($app->urlFor('home'));
} else {
$app->flash('global', 'Anmeldung fehlgeschlagen!');
$app->response->redirect($app->urlFor('login'));
}
}
$app->render('auth/login.php', [
'errors' => $v->errors(),
'requests' => $request
]);
})->name('login.post');
的login.php
->where('active', true)
->where('username', $identifier)
->orWhere('email', $identifier)
->first();
修改 不工作:
if ($v->passes()){
$user = $app->user
->where('username', $identifier)
->where('active', true)
->orWhere('email', $identifier)
->where('active', true)
->first();
工作:
class Note < ApplicationRecord
belongs_to :user
belongs_to :notable, polymorphic: true
end
答案 0 :(得分:1)
$identifier = 'jmattheis';
$app->user
->where('username', $identifier)
->orWhere('email', $identifier)
->where('active', true)
这将是像这样的
SELECT * FROM `users`
WHERE `username` = 'jmattheis' OR `email` = 'jmattheis' AND `active` = true
这将是when (username = jmattheis) or (email = jmattheis and active = true)
你应该使用(
或雄辩地使用它:
$app->user
->where(function($query) use ($identifier) {
$query->where('username', $identifier)
->orWhere('email', $identifier);
})->where('active', true)->first();