#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▕ */
➜ 34▕ public function boot(Breadcrumbs $breadcrumbs, Currency $currency)
35▕ {
36▕ View::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 параметра, которые вызывают ошибку