我是Laravel的新手,我经常遇到这个错误:尝试读取null上的属性“用户名”
我已经做了一个自定义的登录表单,有正确的验证,甚至当用户正确登录时会显示一条成功消息。然而,每当我尝试使用@auth,或者更具体地说,Auth::user()时,什么都没有显示,也没有错误。
我不明白我是如何成功登录的,但每次我试图调用登录信息时,它都显示为空,或者根本不存在。
如果我尝试输出简单的@auth <p>Hello world</p> @endauth
,网页在没有auth的情况下也能正常工作,但不会显示@auth内部的任何内容。当然,它也没有出现任何错误。
我的理论是,我没有使用Auth::attempt(),而是使用原始用户名和密码找到了用户,并以这种方式记录了它们。
我只是想通过显示来显示登录的用户名:{{ Auth::user()->Username }}
我愿意接受任何和所有建议。
下面是我的主控制器:
`<?php
namespace App\Http\Controllers\login;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\New_UserModel;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Session;
class Signup_NewController extends Controller
{
function NewUser_homePost(Request $request)
{
// grabs Username and Password
$user = New_UserModel::where([
'Username' => $request->Username,
'Password' => $request->Password
])->first();
// Checks to see if user is authenticated or not
if($user)
{
// Logs in the user
Auth::login($user);
return redirect(route('User_Home'))->with("success", "Logged in successfully");
}
return redirect(route('Home'))->with("error", "Login details are not valid");
}
public function New_HomePage() {
// ONLY DISPLAYS Register if users are not logged in
if(Auth::check()) {
return redirect(route('home'));
}
return view('login.New_Home');
}
public function createPost(Request $request)
{
$request->validate([
'Username' => 'required',
'Password' => 'required',
'Email' => 'required|email|unique:new_user',
]);
$data['First_Name'] = $request->First_Name;
$data['Last_Name'] = $request->Last_Name;
$data['Phone'] = $request->Phone;
$data['Email'] = $request->Email;
$data['Add1'] = $request->Add1;
$data['Add2'] = $request->Add2;
$data['Zip'] = $request->Zip;
$data['City'] = $request->City;
$data['State'] = $request->State;
$data['Username'] = $request->Username;
$data['Password'] = $request->Password;
// Saving to database
$user = New_UserModel::create($data);
if(!$user)
{
return redirect(route('Home'))->with("error", "Registration failed");
}
// Displays post created on button click
return redirect(route('New_Home'))->with('success', 'Post as been created');
}
// LOGOUT
function logout()
{
Session::flush();
Auth::logout();
return redirect(route('Home'))->with('success', "Logged out");
}
}`
以下是我的modal,如果有帮助的话:
`namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Laravel\Sanctum\HasApiTokens;
use Illuminate\Notifications\Notifiable;
class New_UserModel extends Authenticatable
{
use HasFactory, HasApiTokens, Notifiable;
protected $guarded=[];
protected $fillable = [
'Username', 'Password'
];
protected $table = "new_user";
}`
以下是我的路线:
Route::get('/New_Home', [Signup_NewController::class, 'New_Homepage'])->name('New_Home');
// Creating new accounts
Route::post('/create-post', [Signup_NewController::class, 'createPost'])->name('post.create');
Route::get('/login', [Signup_NewController::class, 'login'])->name('login');
// Login Logic
Route::post('/user_login', [Signup_NewController::class, 'NewUser_homePost'])->name('NewUser.post');
Route::get('/logout', [Signup_NewController::class, 'logout'])->name('logout');
1条答案
按热度按时间eaf3rand1#
您遇到的问题可能与您登录用户的方式有关。在Laravel中,当你使用Auth::login($user)时,你需要确保用户示例是Laravel的可验证用户模型的示例,并且应该已经使用身份验证驱动程序检索到了它,该驱动程序使用用户的凭证来检索用户示例。
但是,您直接使用原始用户名和密码查询数据库,并通过这种方式获得用户的示例。这可能会导致应用程序在Laravel的身份验证会话中无法正确设置用户。
使用Auth::attempt()方法验证用户,而不是使用原始用户名和密码查询用户。Auth::attempt()接受一个凭证数组,如果凭证有效,则让用户登录。
示例:
确保User模型(在本例中为New_UserModel)使用适当的字段进行身份验证。默认情况下,Laravel使用email作为用户名,使用password作为密码。如果用户名使用了不同的列名,例如您的情况中的Username,请确保您已自定义了使用该列名的身份验证。
我建议使用默认的laravel用户模型。Laravel文档:https://laravel.com/docs/10.x/authentication