0

我的 中有一个单例设置AppServiceProvider.php,例如:

public function boot()
{
    $this->app->singleton(Breadcrumbs::class, function($app){
        return new Breadcrumbs();
    });

    View::composer(['partials.*'], function($view){
        $view->with('breadcrumbs', new Breadcrumbs());
    });

}

Breadcrumbs 只是一个简单的类,它管理一系列面包屑,我希望整个应用程序中只有一个对象(所以每次你打电话时new Breadcrumbs()你实际上得到的是现有的对象,而不是一个新的对象。(我认为这就是单例是给?)

但现在已将其添加到JetStreamServiceProvider.php

public function boot()
{
        $this->configurePermissions();

        Fortify::loginView(function (){
            $breadcrumbs = new Breadcrumbs();
            $breadcrumbs->add('login','login.php');
            return view('auth.login');
        });
}

但是,它没有使用与 AppServiceProvider 中创建的对象相同的对象,而是创建了一个新对象(因此 AppServiceProvider 中的面包屑对象和 JetStreamServiceProvider 中的面包屑对象是包含不同数据集的 2 个不同对象)......这是不好。

我究竟做错了什么?

4

2 回答 2

2

如果你想解析你设置的绑定,你需要使用你设置绑定的 IoC 容器来解析它。您调用new Class的是您直接告诉 PHP 创建该类的新实例。Laravel 不会改变 PHP 的工作方式。

public function register()
{
    $this->app->singleton(Breadcrumbs::class, function () { ... });
}

public function boot()
{
    View::composer(['partials.*'], function ($view) {
        // resolve the instance from the IoC (Application) Container
        $view->with('breadcrumbs', $this->app->make(Breadcrumbs::class));
    });

    // you can do a "view share" to share this with all views instead:
    View::share('breadcrumbs', $this->app->make(Breadcrumbs::class));
}



Fortify::loginView(function () {
    $this->app->make(Breadcrumbs::class)->add('login', 'login.php');
    return view('auth.login');
});

Laravel 8.x Docs - 服务容器 - 解析 -make方法

于 2020-11-11T18:30:55.523 回答
0

这是我使用的解决方案:

应用服务提供者

public function register()
{
        $this->app->singleton(Breadcrumbs::class, function($app){
            return new Breadcrumbs();
        });
}

public function boot(Breadcrumbs $breadcrumbs)
{
        View::composer(['partials.*'], function($view) use ($breadcrumbs){
            $view->with('breadcrumbs', $breadcrumbs);
        });

}

JetStreamServiceProvider.php

public function boot(Breadcrumbs $breadcrumbs)
{
    Fortify::loginView(function () use ($breadcrumbs){
        $breadcrumbs->add('Login',Route('login'));
        return view('auth.login');
    });
}
于 2020-11-13T12:02:24.657 回答