Laravel尝试读取null上的属性“Username”

gmxoilav  于 2023-06-30  发布在  其他
关注(0)|答案(1)|浏览(152)

我是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');
eaf3rand

eaf3rand1#

您遇到的问题可能与您登录用户的方式有关。在Laravel中,当你使用Auth::login($user)时,你需要确保用户示例是Laravel的可验证用户模型的示例,并且应该已经使用身份验证驱动程序检索到了它,该驱动程序使用用户的凭证来检索用户示例。
但是,您直接使用原始用户名和密码查询数据库,并通过这种方式获得用户的示例。这可能会导致应用程序在Laravel的身份验证会话中无法正确设置用户。
使用Auth::attempt()方法验证用户,而不是使用原始用户名和密码查询用户。Auth::attempt()接受一个凭证数组,如果凭证有效,则让用户登录。
示例:

function NewUser_homePost(Request $request) 
{
    // Validate the request data
    $credentials = $request->only('Username', 'Password');

    // Attempt to login
    if (Auth::attempt($credentials)) {
        // Authentication passed...
        return redirect(route('User_Home'))->with("success", "Logged in successfully");
    }

    // Authentication failed...
    return redirect(route('Home'))->with("error", "Login details are not valid");
}

确保User模型(在本例中为New_UserModel)使用适当的字段进行身份验证。默认情况下,Laravel使用email作为用户名,使用password作为密码。如果用户名使用了不同的列名,例如您的情况中的Username,请确保您已自定义了使用该列名的身份验证。
我建议使用默认的laravel用户模型。Laravel文档:https://laravel.com/docs/10.x/authentication

相关问题