Laravel-包无法识别Auth函数?

时间:2020-02-18 14:26:54

标签: php laravel laravel-5 package

我制作了一个包裹,用来统计网页上的访问者。目前,我只有一条路线,控制器和视图,除了显示一个简单的字符串外,它们并没有做太多其他事情。我有一个单独的Laravel应用程序,该程序包是专门为此构建的。在这个单独的应用程序中,我有一个称为后端的布局文件。

layouts/layouts/backend.blade.php

我的程序包视图正在像这样扩展此模板:(backend.blade.php在程序包中不存在,但在课程的单独laravel应用程序中

@extends('layouts.layouts.backend')

@section('content')
    <div class="container-fluid pt-5 ">
        <div class="row">
            <div class="col-md-6">
                <h3>{{ __('Visitors') }}</h3>
            </div>
        </div>
    </div>
@endsection

该软件包成功扩展了此布局,但找不到Auth::user()->token之类的函数,并且会显示

Trying to get property 'token' of non-object (View: /Users/rainierlaan/Sites/rainierlaan/resources/views/layouts/layouts/backend.blade.php)

为什么会这样?

这是我的包裹服务提供商

 public function register()
    {
        // Controllers
        $this->app->make('Rainieren\Visitors\Http\Controllers\VisitorController');
        // Views
        $this->loadViewsFrom(__DIR__.'/resources/views', 'visitors');
        $this->publishes([
            __DIR__.'/resources/views' => resource_path('views/visitors'),
        ]);
        // Migrations
        $this->loadMigrationsFrom(__DIR__.'/database/migrations');
    }

    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        include __DIR__ . '/routes/routes.php';
    }

当我执行vendor:publish时,视图成功发布到了正确的文件夹,但是以某种方式无法识别诸如Auth::user()->tokenAuth::user()->unreadNotifications->count())之类的功能

这是我的包裹路线:

<?php


Route::get('dashboard/visitors', '\Rainieren\Visitors\Http\Controllers\VisitorController@index')->name('visitors');

这是控制器

public function index()
    {
        return view('visitors::index'); 
    }

2 个答案:

答案 0 :(得分:5)

我需要更多的调试信息,但我的第一个假设是缺少AuthenticateSessionAuthenticate中间件。

Laravel为web中的路由定义了默认的中间件组routes/web.php,该组使用AuthenticateSession中间件。这是新安装的样子:

Route::group([
    'middleware' => 'web', <<< this is the magic part
    'namespace' => $this->namespace,
], function ($router) {
    require base_path('routes/web.php');
});

在这里我们看到使用了中间件组web

在您的自定义模块/服务提供商中,情况并非如此。您的Route::get()定义已添加到Router,但未添加到该组中。因此,不会执行所有用于验证用户身份的必要内部操作。

在这种情况下,我将尝试使用将使用main-projects组中间件的->middleware('auth')->middleware('web')

Route::get('dashboard/visitors', '\Rainieren\Visitors\Http\Controllers\VisitorController@index')
  ->name('visitors')
  ->middleware('web');

这是一个不同的主意:

如果您说自己始终通过身份验证。然后,您可以尝试将所有web中间件移至Kernelprotected $middleware = [])中的全局中间件中。

我没有对此进行测试,但是我可以想象它也可以工作。

答案 1 :(得分:2)

我在所有活动软件包中都发现它们在视图中根本没有使用Auth类。

他们的解决方法是在控制器中使用它,并将其传递给视图:

$user = auth()->user();

return view('folder.view' ,['user'=>$user]);

然后在视图中:

{{$user->token}} <!-- OR --!> {{$user->unreadNotifications->count()}}

很明显,正如@ N69S所说的,只有在对用户进行身份验证的情况下,这才起作用。

希望这行得通!

编辑 :(抱歉,我第一次不太了解)

错误出在您的服务提供商类中,您必须在引导功能上而不是在寄存器中执行所有逻辑,因为如果您在寄存器功能中进行操作,则必须在laravel框架之前加载所有逻辑(要说些什么) https://laravel.com/docs/5.7/providers#the-register-method

您的服务提供商应按以下方式结束:

    public function register()
    {
        //Nothing
    }

    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        // Controllers
        $this->app->make('Rainieren\Visitors\Http\Controllers\VisitorController');
        // Views
        $this->loadViewsFrom(__DIR__.'/resources/views', 'visitors');
        $this->publishes([
            __DIR__.'/resources/views' => resource_path('views/visitors'),
        ]);
        // Migrations
        $this->loadMigrationsFrom(__DIR__.'/database/migrations');
        include __DIR__ . '/routes/routes.php';
    }

希望这终于奏效!