前言
在看本篇博文之前,你应该对Laravel5有了初步的了解。
例如如何定义路由与相应的控制器,如何使用Model操作数据库,如何渲染视图。
掌握了以上技能,就已经可以顺畅的使用Laravel进行web开发了。
对于想深入了解Laravel的伙伴们,接下来就应该了解Laravel的container和service provider。
城堡、管家和奴隶
从前有一个城堡,这个城堡有个大管家,他管着一个干活的奴隶。
场景1.
城堡经营的不错,客人越来越多,大管家觉得城堡里应该有一种交通工具,方便大家出行。于是他去买了一匹马,交给了奴隶,并对奴隶说:
以后有客人需要交通工具的,就把这匹马交给他。
场景2.
城堡经营的越来越好,管家手里的钱多了,觉得马太慢了,骑着很不舒服。他又一次对奴隶说,下次有客人需要交通工具时,你去东方路上的奔驰4s店里,买一辆奔驰c级回来,交给客人。
场景3.
有一天,城堡里要接待一位外国政要,奔驰车级别不够了,得买劳斯莱斯,管家对奴隶说:如果这位政要需要出行,你就去买一辆劳斯莱斯回来,但是,不管他要求多少次,你都只能用那一辆,不能再买第二辆了(车太贵)。
这里的城堡对应的就是container,管家就是service provider,马、奔驰车、劳斯莱斯是service。
场景1、2、3分别对应service provider向container绑定服务的三种方式。下面会讲到细节。
初识Container & Service provider
container的最大作用在于解决依赖关系。
在public/index.php这个入口文件里可以看到这样一行代码。
$app = require_once __DIR__.'/../bootstrap/app.php';
bootstrap/app.php有一段代码
$app = new Illuminate\Foundation\Application(
realpath(__DIR__.'/../')
);
上面这段代码就生成了我们这里提到的container。
框架里的一切活动都是在这个container里进行的。
当你在控制器里用变量类型指定传入的参数为Request类时,Laravel会“自动”帮你生成一个Request类的示例,之后你就可以调用Request类的方法来获取http请求的输入了。这看起来有些“神秘”。
其实,这个Request类就是一种服务(Service)。而Service provider负责向container“提供”服务(Service)。
在config/app.php文件里可以看到框架运行时加载的所有Service providers
'providers' => [
/*
* Laravel Framework Service Providers...
*/
'Illuminate\Foundation\Providers\ArtisanServiceProvider',
'Illuminate\Auth\AuthServiceProvider',
'Illuminate\Bus\BusServiceProvider',
'Illuminate\Cache\CacheServiceProvider',
'Illuminate\Foundation\Providers\ConsoleSupportServiceProvider',
'Illuminate\Routing\ControllerServiceProvider',
'Illuminate\Cookie\CookieServiceProvider',
'Illuminate\Database\DatabaseServiceProvider',
'Illuminate\Encryption\EncryptionServiceProvider',
'Illuminate\Filesystem\FilesystemServiceProvider',
'Illuminate\Foundation\Providers\FoundationServiceProvider',
'Illuminate\Hashing\HashServiceProvider',
'Illuminate\Mail\MailServiceProvider',
'Illuminate\Pagination\PaginationServiceProvider',
'Illuminate\Pipeline\PipelineServiceProvider',
'Illuminate\Queue\QueueServiceProvider',
'Illuminate\Redis\RedisServiceProvider',
'Illuminate\Auth\Passwords\PasswordResetServiceProvider',
'Illuminate\Session\SessionServiceProvider',
'Illuminate\Translation\TranslationServiceProvider',
'Illuminate\Validation\ValidationServiceProvider',
'Illuminate\View\ViewServiceProvider',
/*
* Application Service Providers...
*/
'App\Providers\AppServiceProvider',
'App\Providers\BusServiceProvider',
'App\Providers\ConfigServiceProvider',
'App\Providers\EventServiceProvider',
'App\Providers\RouteServiceProvider',
],
深入了解Service Provider