Синглтон в AppServiceProvider вызывает ошибку при новой миграции

#laravel #laravel-8

#ларавель #laravel-8

Вопрос:

У меня есть синглтон, зарегистрированный в моем AppServiceProvider , который загружает модель валюты.

Проблема, по-видимому, заключается в том, что если вы запускаете миграцию для пустой базы данных, она пытается загрузить эту модель валюты до завершения миграции. (Таким образом, ни таблицы валют, ни строки валют пока не существует).

Как я могу заставить миграцию валюты запуститься первой, прежде чем она попытается загрузить этот синглтон?

 class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->singleton(Breadcrumbs::class, function($app){
            return new Breadcrumbs();
        });

        $this->app->singleton(Currency::class, function($app){
            return Currency::current();
        });
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot(Breadcrumbs $breadcrumbs, Currency $currency)
    {
        View::composer(['partials.*'], function($view) use ($breadcrumbs){
            $view->with('breadcrumbs', $breadcrumbs);
        });

        View::composer('*', function($view) use ($currency){
            $view->with([
                'me'        => Auth::user(),
                'currency'  => $currency
            ]);
        });
    }
}
 

И миграция завершается неудачей, с:

   TypeError 

  Argument 2 passed to AppProvidersAppServiceProvider::boot() must be an instance of AppModelsCurrency, null given, called in /home/vagrant/reviewmarket/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php on line 36

  at app/Providers/AppServiceProvider.php:34
     30▕      * Bootstrap any application services.
     31▕      *
     32▕      * @return void
     33▕      */
  ➜  34public function boot(Breadcrumbs $breadcrumbs, Currency $currency)
     35▕     {
     36View::composer(['partials.*'], function($view) use ($breadcrumbs){
     37▕             $view->with('breadcrumbs', $breadcrumbs);
     38▕         });

       7 vendor frames 
  8   [internal]:0
      IlluminateFoundationApplication::IlluminateFoundation{closure}(Object(AppProvidersAppServiceProvider))

       5 vendor frames 
  14  artisan:37
      IlluminateFoundationConsoleKernel::handle(Object(SymfonyComponentConsoleInputArgvInput), Object(SymfonyComponentConsoleOutputConsoleOutput))
 

Ответ №1:

не добавляйте параметры в boot()

 public function boot()
{
    $breadcrumbs = Breadcrumbs::all();
    $currency = Currency::all();

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

    View::composer('*', function ($view) use ($currency) {
        $view->with([
            'me'        => Auth::user(),
            'currency'  => $currency
        ]);
    });
}
 

исправьте так

Laravel внутренне вызывает загрузочную функцию, например AppProvidersAppServiceProvider::boot() , и когда вы добавляете 2 параметра в метод загрузки boot() , функция должна отправить 2 параметра, которые вызывают ошибку