为什么要在服务提供者中使用Boot方法?
替换 Laravel 的日志
您可能想使用register https://github.com/laravel/framework/blob/4.0/src/Illuminate/Log/LogServiceProvider.php#L20方法而不是boot
该服务提供商的方法?
看起来您的实现将覆盖默认记录器,而不是创建额外的日志。这是你的意图吗?在这种情况下,请注意您已经使用了boot
方法来注册“log”的实例,但随后register
方法是重新做这项工作。 (也许将其替换回默认值?我不确定会导致什么行为)。
额外的日志
如果你想添加额外的日志,你可以做到这一点,而无需扩展 Laravel 的服务提供者。
在新文件和您自己的命名空间中,创建一个LogServiceProvider
:
<?php namespace Fideloper\Log;
use Illuminate\Support\ServiceProvider;
class LogServiceProvider extends ServiceProvider {
/**
* Indicates if loading of the provider is deferred.
*
* @var bool
*/
protected $defer = false;
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
$logger = new Writer(new \Monolog\Logger('my-custom-log'), $this->app['events']);
$logFile = 'my-custom-log.txt';
$logger->useDailyFiles(storage_path().'/logs/'.$logFile);
$this->app->instance('fideloper.log', $logger);
$this->app->bind('Fideloper\Log\Writer', function($app)
{
return $app->make('fideloper.log');
});
}
/**
* Get the services provided by the provider.
*
* @return array
*/
public function provides()
{
return array('fideloper.log');
}
}
然后创建一个新的日志编写器(类似于您的操作方式):
<?php namespace Fideloper\Log;
use Illuminate\Log\Writer as BaseWriter;
class Writer extends BaseWriter {}
请注意,我没有向扩展编写器类添加任何额外的功能,但我可以。
A con这个设置的原因是我没有创建或覆盖Log
外观使用我的新记录器。任何电话至Log::whatever()
仍然会转到 Laravel 的默认值。我创建一个新的Fideloper\Log\Writer
对象并且它能够工作是因为 Laravel 能够自动提供类依赖项。
$log = App::make('fideloper.log');
// Or get auto-created by laravel by making it a dependency
// in a controller, for example:
<?php
use Fideloper\Log\Writer
class SomeController extends BaseController {
public function __construct(Writer $log)
{
$this->log = $log;
//Later
$this->log->error('SOME CUSTOM ERROR');
}
}