【问题标题】:Laravel - How to get user id in app service providerLaravel - 如何在应用服务提供商中获取用户 ID
【发布时间】:2018-05-05 12:18:49
【问题描述】:

我尝试在我的应用服务提供商中获取用户 ID,但我得到一个错误显示 ErrorException: Trying to get property of non-object,知道如何获取用户 ID 吗?

AppServiceProvider:

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\Project;

use Log;
use Auth;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    { 
        $userid =  Auth::user()->id;
        Log::info('userid :', [$userid]);


        $project = Project::where('user_id',Auth::user()->id)->count();

    }
}

错误:

local.ERROR: ErrorException: Trying to get property of non-object in C:\wamp64\www\test\app\Providers\AppServiceProvider.php:20 Stack trace: #0 C:\wamp64\www\test\app\Providers\AppServiceProvider.php(20): Illuminate\Foundation\Bootstrap\HandleExceptions->handleError(8, 'Trying to get p...', 'C:\\wamp64\\www\\f...', 20, Array) #1 [internal function]: App\Providers\AppServiceProvider->boot() #2 C:\wamp64\www\test\vendor\laravel\framework\src\Illuminate\Container\Container.php(507): call_user_func_array(Array, Array) #3 C:\wamp64\www\test\vendor\laravel\framework\src\Illuminate\Foundation\Application.php(734): Illuminate\Container\Container->call(Array) #4 C:\wamp64\www\test\vendor\laravel\framework\src\Illuminate\Foundation\Application.php(717): Illuminate\Foundation\Application->bootProvider(Object(App\Providers\AppServiceProvider)) #5 [internal function]: Illuminate\Foundation\Application->Illuminate\Foundation\{closure}(Object(App\Providers\AppServiceProvider), 19) #6 C:\wamp64\www\test\vendor\laravel\framework\src\Illuminate\Foundation\Application.php(718): array_walk(Array, Object(Closure)) #7 C:\wamp64\www\test\vendor\laravel\framework\src\Illuminate\Foundation\Bootstrap\BootProviders.php(17): Illuminate\Foundation\Application->boot() #8 C:\wamp64\www\test\vendor\laravel\framework\src\Illuminate\Foundation\Application.php(203): Illuminate\Foundation\Bootstrap\BootProviders->bootstrap(Object(Illuminate\Foundation\Application)) #9 C:\wamp64\www\test\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php(222): Illuminate\Foundation\Application->bootstrapWith(Array) #10 C:\wamp64\www\test\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php(117): Illuminate\Foundation\Http\Kernel->bootstrap() #11 C:\wamp64\www\test\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php(87): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter(Object(Illuminate\Http\Request)) #12 C:\wamp64

【问题讨论】:

  • 我的意思是,如果用户未通过身份验证怎么办?如果他们没有登录,您将无法访问-&gt;id。如果您运行任何工匠命令,您也无法从命令行访问它。您似乎还想提供一个全局应用程序变量。如果是这种情况,如果这就是您想要实现的目标,那么视图合成器可能更适合您
  • 我只在他们登录后才检查。但是还是拿不到身份证。 @Ohgodwhy
  • 您的查询返回的是数组还是对象?如果你把它转储出来,你可能会发现它是一个数组,你需要的只是一个数组访问([])而不是对象访问(->)。
  • 尝试使用命名空间Illuminate\Support\Facades\Auth 而不是Auth。或者我认为有一个帮助方法,所以你可以做auth()-&gt;user()-&gt;id。

标签: laravel laravel-5


【解决方案1】:

使用 View::composer('*',) 在所有视图中使用 Auth。

 use Illuminate\Support\Facades\View;
.........
public function boot()
{ 
     View::composer('*', function($view)
     {
         if (Auth::check()){
         $project = Project::where('user_id',Auth::id() )->count();
    }
 });

您可以将其理解为在视图渲染之前进行身份验证之后,您需要在这些之间进行检查,而不是之前。

【讨论】:

    【解决方案2】:

    Auth 将始终尝试获取 id,即使用户已登录或未登录。如果用户没有登录,那么它会给你非对象错误,因为没有任何东西可以通过用户模型对象获取。

     public function boot()
        { 
            if (Auth::check()) {
               $userid =  Auth::user()->id;
               Log::info('userid :', [$userid]);
    
    
               $project = Project::where('user_id',Auth::user()->id)->count();
            }
    
        }
    

    祝你好运。

    【讨论】:

      【解决方案3】:

      在您的服务提供商的boot() 方法中,您应该只引导您的应用程序并且不执行任何有关查找或输出数据的操作。如果确实需要在服务提供商中执行此操作,您可以在您的提供商的 register() 方法中执行此操作。不过,更好的地方可能是控制器或命令。


      直接使用Auth::user() 也很危险,因为您的应用中可能没有经过身份验证的用户。您可以改为在使用Auth::user() 访问用户之前执行if(Auth::check()) { ... },或者,在您的情况下就足够了,您可以使用Auth::id() 访问用户ID。如果没有可用的用户,它也会返回null,即Auth::check() === false。

      【讨论】:

        猜你喜欢
        • 2016-08-23
        • 2016-04-11
        • 2020-11-30
        • 1970-01-01
        • 2022-06-22
        • 1970-01-01
        • 2012-10-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多