【发布时间】:2021-06-26 13:38:59
【问题描述】:
在 Laravel 文档中,我看到了示例:
$this->app->when(PhotoController::class)
->needs(Filesystem::class)
->give(function () {
return Storage::disk('local');
});
$this->app->when([VideoController::class, UploadController::class])
->needs(Filesystem::class)
->give(function () {
return Storage::disk('s3');
});
https://laravel.com/docs/8.x/container#contextual-binding
我想在存储磁盘中使用不同的日志通道。
https://laravel.com/docs/8.x/logging#writing-to-specific-channels
我试试:
public function __construct(LoggerInterface $logger) {
$this->logger = $logger;
}
$this->app->when(PhotoController::class)
->needs('log')
->give(function () {
return \Log::channel('telegram');
});
$this->app->when([VideoController::class, UploadController::class])
->needs('log')
->give(function () {
return \Log::channel('slack');
});
但我得到错误:
NOTICE: PHP message: PHP Fatal error: Uncaught Error: Maximum function nesting level of '256' reached, aborting! in /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Application.php:792
Stack trace:
#0 /var/www/html/vendor/laravel/framework/src/Illuminate/Container/Container.php(646): Illuminate\Foundation\Application->resolve('Illuminate\\Log\\...')
#1 /var/www/html/app/Providers/AppServiceProvider.php(106): Illuminate\Container\Container->get('Illuminate\\Log\\...')
#2 /var/www/html/vendor/laravel/framework/src/Illuminate/Container/Container.php(805): App\Providers\AppServiceProvider->App\Providers\{closure}(Object(Illuminate\Foundation\Application), Array)
#3 /var/www/html/vendor/laravel/framework/src/Illuminate/Container/Container.php(691): Illuminate\Container\Container->build(Object(Closure))
#4 /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(796): Illuminate\Container\Container->resolve('log', Array, true)
#5 /var/www/html/vendor/laravel/framework/src/Illuminate/Container/Container.php(646): in /var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Application.php on line 792
我也试过了:
->needs(LoggerInterface::class)
同样的错误。
我没有在文档中看到如何正确执行此操作的示例。没什么。
【问题讨论】:
-
我相信这是因为你不能注入一个接口,而是它必须是一个实现,例如存储你得到一个具有特定存储类型的具体实例,而日志它是一个接口系统无法解析。
-
在
return \Log::channel ('slack');这一行出现了递归循环,因为它调用容器来解析日志的日志。需要一些解决方法。 -
也许先试试binding你的界面?
标签: php laravel dependency-injection contextual-binding