laravel服务提供者和门面及契约整理
标签(空格分隔): laravel
服务提供者
通俗意思是:你家需要水,服务提供者送水的; 服务提供者生成后的代码
Contracts, ServiceContainer, ServiceProvider, Facades关系 概念 Contracts 合同,契约,也就是接口,定义一些规则,每个实现此接口的都要实现里面的方法
ServiceContainer 实现Contracts,具体的逻辑实现
ServiceProvider ServiceContainer的服务提供者,返回ServiceContainer的实例化,供其他地方使用,可以把它加入到app/config的provider中,会被自动注册到容器中
Facades 简化ServiceProvider的调用方式,而且可以静态调用ServiceContainer中的方法
php artisan make:provider FooServiceProvider
namespace App\Providers;
use Illuminate\Support\ServiceProvider;use App\lib\Tools\FooBar\FooBar;
class FooServiceProvider extends ServiceProvider{ /** * Bootstrap the application services. * * @return void */ public function boot() { // }
/** * Register the application services. * * @return void */ public function register() {
}}其中boot在框架加载初期就载入就提供,如果你提供的水还需要矿物质什么的(框架内一些依赖) 就不要在这里进行提供;
在一个继承服务提供者的文件内 boot方法 register方法都可以使用
$this->app->bind('test',function(){ return new Test();});方式提供依赖 这种写法理解思路可以参照:链接
在平时方法中使用:
public function two($id=null){ //从系统容器中获取实例化对象// $myfoo = app('test');// app()->make('test'); $myfoo = \App::make('test'); echo $myfoo->get();}或在 方法参数中加上依赖地址或名称;
use App\lib\Tools\FooBar\Test;
public function index(Test $test)根据文章:地址整理思路
门面
门面定义
namespace App\CustomFacades;
use Illuminate\Support\Facades\Facade;
class Foo extends Facade{
protected static function getFacadeAccessor() { return 'test'; }}继承Illuminate\Support\Facades\Facade getFacadeAccessor()中return ‘test’ 代表服务提供者代码中
$this->app->bind('test',function(){ return new Test();});的test
在app.php aliases 数组中添加
‘Foo’ => App\CustomFacades\Foo::class,
契约
参考网址:https://www.jb51.net/article/135189.htm https://www.cnblogs.com/redirect/p/6087810.html http://laravelacademy.org/post/769.html https://www.cnblogs.com/cyforever/p/6139109.html
部分信息可能已经过时