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

Posted

技术标签:

【中文标题】Laravel - 包无法识别身份验证功能?【英文标题】:Laravel - Package can't recognise Auth functions? 【发布时间】:2020-06-02 14:32:36 【问题描述】:

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

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()-&gt;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()-&gt;tokenAuth::user()-&gt;unreadNotifications-&gt;count()) 等函数

这是我的包裹路线:

<?php


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

这是控制器

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

【问题讨论】:

当你做vendor:publish 你期望从Auth::user() 得到什么??你在 CLI 中 我希望从安装包的应用程序中获取用户数据。如果那当然是可能的 哪个用户?当您在 CLI 命令中时,没有用户经过身份验证 【参考方案1】:

我在我所有的活动包中都看到它们在视图中根本不使用 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';
    

希望这最终能奏效!

【讨论】:

用户总是经过身份验证,但这意味着我不能在我的主要项目布局中再做Auth::user()?我不知道如何解析我的主项目中的变量。因为你上面说的代码会放在我的包里。但我的主要项目布局仍然使用Auth::user() 哦,对不起,我错过了那部分,所以我认为您的失败是您正在执行寄存器功能中的所有逻辑,您应该将所有这些都传递给引导功能,给我一秒钟我将通过澄清编辑我的回复;) 我将所有内容从 register 方法转移到 boot 方法,但不幸的是这不起作用。我仍然得到同样的错误。这可能是什么原因?【参考方案2】:

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

Laravel 为 routes/web.php 中的路由定义了一个默认的中间件组 web,该组使用 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,但不在此组中。因此,不会执行对用户进行身份验证所需的所有内部操作。

在这种情况下,我会尝试使用 -&gt;middleware('auth')-&gt;middleware('web'),这将使用 main-projects 组中间件。

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

这是一个不同的想法:

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

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

【讨论】:

以上是关于Laravel - 包无法识别身份验证功能?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.5 无法使用身份验证脚手架登录

react和laravel中的登录身份验证无法正常工作

无法在 Laravel 6 中的 SMTP 服务器上进行身份验证

身份验证 laravel 4.2 无法工作

Laravel 5.2 - 经过身份验证的用户更改密码 - 更新后的密码匹配问题

Laravel echo - 无法通过私有频道进行身份验证