Laravel - Как получить идентификатор пользователя в сервис-провайдере приложения - PullRequest
0 голосов
/ 05 мая 2018

Я пытаюсь получить идентификатор пользователя в своем сервис-провайдере приложений, но я получаю сообщение об ошибке, показывающее, что ErrorException: пытается получить свойство не-объекта, есть идеи, как получить идентификатор пользователя?

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

Ответы [ 3 ]

0 голосов
/ 05 мая 2018

Используйте View::composer('*',) для использования аутентификации во всех видах.

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

Вы можете понять это, так как после аутентификации перед просмотром рендера вам нужно проверять между ними не раньше.

0 голосов
/ 05 мая 2018

В методе boot() ваших поставщиков услуг вы должны только запустить приложение и не выполнять никаких действий, связанных с поиском или выводом данных. Вы можете сделать это методом register() своих поставщиков, если это действительно необходимо сделать в поставщике услуг. Тем не менее, в любом случае лучше было бы использовать контроллер или команду.


Использование Auth::user() напрямую также опасно, поскольку в вашем приложении может не быть пользователя, прошедшего проверку подлинности. Вместо этого вы можете выполнить if(Auth::check()) { ... } перед доступом к пользователю с помощью Auth::user(), или, что в вашем случае будет достаточно, вы можете получить доступ к идентификатору пользователя с помощью Auth::id(). Он также вернет null, если пользователь недоступен, то есть Auth::check() === false.

0 голосов
/ 05 мая 2018

Auth всегда будет пытаться получить идентификатор, даже если пользователь вошел в систему или нет. Если пользователь не вошел в систему, он выдаст необъектную ошибку, поскольку через объект модели User ничего не получится.

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


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

    }

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...