Laravel-包无法识别身份验证功能?



我制作了一个软件包,用来计算网页上的访问者。目前,我有一个单一的路由、控制器和视图,除了显示一个简单的字符串外,它们没有太多功能。我有一个单独的Laravel应用程序,这个包是专门为它构建的。在这个单独的应用程序中,我有一个名为backend的布局文件。

CCD_ 1。

我的包视图是这样扩展这个模板的:(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('RainierenVisitorsHttpControllersVisitorController');
// 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', 'RainierenVisitorsHttpControllersVisitorController@index')->name('visitors');

这是控制器

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

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

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

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

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

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

在这个场景中,我将尝试使用->middleware('auth')->middleware('web'),它们将使用主要项目组中间件。

Route::get('dashboard/visitors', 'RainierenVisitorsHttpControllersVisitorController@index')
->name('visitors')
->middleware('web');

这里有一个不同的想法:

如果你说你总是通过身份验证。然后,您可以尝试将所有web中间件移动到您的Kernel(protected $middleware = [](中的全局中间件中。

我没有对此进行测试,但我可以想象这也可以奏效。

我在所有活动包中都看到,它们在视图中根本不使用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-寄存器法

您的服务提供商应该这样结束:

public function register()
{
//Nothing
}
/**
* Bootstrap services.
*
* @return void
*/
public function boot()
{
// Controllers
$this->app->make('RainierenVisitorsHttpControllersVisitorController');
// 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';
}

希望这最终能奏效!

最新更新