1、laravel Container:
Class Bar{
}
Class Foo{
public function __construct(Bar $bar) {
}
}
App::bind('Foo(类全名)',function(){
return new Foo(new Bar());
});
Route::get('getclass',function(Foo $foo){
dd($foo);
});
laravel会先检测,APP(应用主题)是否有绑定Foo类,如果有绑定就会直接
去调用接受返回的对象,如果没有绑定laravel就会自己去找到Foo对应的
类然后去new Foo,当发现Foo依赖Bar时候再去调用new Bar(这都是
根据php新特性反射机制找到的)
2、ServiceProvider:
2.1 :将类与ServiceProvider绑定
2.2:通过调用ServiceProvider返回类对象,调用对象方法:
app('test')->get()
app()['test']->get()
app('Test')->make('get')
这样会高度解耦
eg:
1)新建一个类:
namespace App\Third;
class Wechart{
public function get(){
return 'success';
}
}
2)命令行创建一个ServiceProvider:
php artisan make:provider WechartServiceProvider
3)WechartServiceProvider的register:
public function register()
{
$this->app->bind('wechart',function(){
return new Wechart();
});
}
4)现在虽然将wechart类与WechartServiceProvider建立了关联
关系,但是laravel不知道有WechartServiceProvider这个类,
所以要在config/app.php的provider中,添加
WechartServiceProvider告诉laravel,这样laravel在初始化
时候加载进来,全局才可以使用
5)使用,通过WechartServiceProvider返回Wechart类对象:
5.1)app('wechart')->get(); //success
5.2)当然可以通过php反射使用(不推荐):
Route::get('getclass',function(\App\Third\Wechart
$wechart){
dd($wechart->getSuccess());
});
3、Facades门面:
分析Route:'
Route' => Illuminate\Support\Facades\Route::class,
所有的门面(Route)都是继承Facades,Facades有个__callStatic,
当调用静态(Route::get())的方法不存在,会调用当前的Facades中
__callStatic,然后改方法会调用Route中的getFacadeAccessor,
这个方法每个门面类中都会有,然后会执行:
$instance = static::getFacadeRoot(),而getFacadeRoot方法
会返回:
static::resolveFacadeInstance(static::getFacadeAccessor()); //相当于app('xxx'),其中xxx就是getFacadeAccessor字符串
这样就得到了Route对应的真正的类的实例,然后接着执行__callStatic
中$instance->$method(...$args),就调用到对应的方法。
所以调用门面中的方法一般都是:
方法:
1) alias的key::方法名称 //Route::get()
2)app('xx')->get() //其中xx就是getFacadeAccessor中的返回
属性:
1)alias的key::get('database.default')
2)app('xx')['database.default']['default']
4、Contracts定义的基本都是各个服务的接口:
接口都放在:
vendor/laravel/framework/src/Illuminate/Contracts
类的实现都在:
vendor/laravel/framework/src/Illuminate下
其实Contracts应该就是就是laravel提供给开发者的laravel内部使用类的接口,比如提供的所有Mail都无法满足需求,我们就可以实现
Illuminate/Contracts/Mail接口,然后开发我们的类,然后把在
config/app.php中的aliases中的Email换成自己写的就可以了
5、
laravel的提供者、容器、门面
猜你喜欢
转载自blog.csdn.net/jj546630576/article/details/79250235
今日推荐
周排行