laravel ServiceProvider
服务提供者在app初始化注册进容器 ,每个服务提供者均继承基础的抽象类ServiceProvider
\Laravel\Lumen\Application::register
初始化的时候通过register方法加载到loadedProviders数组里,判断register和boot方法是否存在,存在则在注册的时候调用初始化。
,boot方法用于类的初始化
/**
* Register a service provider with the application.
*
* @param \Illuminate\Support\ServiceProvider|string $provider
* @return \Illuminate\Support\ServiceProvider
*/
public function register($provider)
{
if (! $provider instanceof ServiceProvider) {
$provider = new $provider($this);
}
if (array_key_exists($providerName = get_class($provider), $this->loadedProviders)) {
return;
}
$this->loadedProviders[$providerName] = true;
if (method_exists($provider, 'register')) {
$provider->register();
}
if (method_exists($provider, 'boot')) {
return $this->call([$provider, 'boot']);
}
}
register方法用于注入类到容器中,boot方法用于在启动的时候加载
app.php中绑定到容器中
$app->register(App\Providers\TestServiceProvider::class);
/**
* Class TestServiceProvider
* @package App\Providers
*/
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use App\Providers\Test1;
class TestServiceProvider extends ServiceProvider
{
public function boot()
{
echo "this is boot!\n"
}
/**
* Register any application services.
*
* @return void
*/
public function register()
{
$this->app->singleton("test1", function () {
return new Test1();
});
}
}
namespace App\Providers;
/**
* Class Test1
* @package App\Providers
*/
class Test1
{
public function test()
{
echo "this is test!\n";
}
}
接下来应用可以用依赖注入的方式活着app函数去寻找我们绑定的别名
class TestController extends Controller
{
const Privileges = [
'test' => '*',
];
public function test()
{
var_dump(app('test')->test());exit;
}
}
use App\Providers\Test1;
class TestController extends Controller
{
public function test()
{
var_dump(app('test')->test());exit;
}
public function test1(Test1 $test1)
{
var_dump($test1->test());exit;
}
}
这里面最主要的就是利用register方法把我们实例处理业务的类注入到容器中,然后在用的时候就可以从容器中取出一个实例来,实现业务代码的解藕。
网友评论