【问题标题】:Laravel Singleton still creating new objectsLaravel Singleton 仍在创建新对象
【发布时间】:2021-02-23 18:04:30
【问题描述】:

我的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 中的面包屑对象是两个不同的对象,包含不同的数据集)。 .这不好。

我做错了什么?

【问题讨论】:

    标签: php laravel laravel-8 jetstream


    【解决方案1】:

    如果您想解析您设置的绑定,您需要使用您设置绑定的 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 - Service Container - Resolving - The make method

    【讨论】:

      【解决方案2】:

      这是我使用的解决方案:

      AppServiceProvider

      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');
          });
      }
      

      【讨论】:

        猜你喜欢
        • 2017-02-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-27
        相关资源
        最近更新 更多