关于laravel provider绑定接口
前几天看了看laravel中关于容器的解释,总算不那么云里雾里了,但有一点不太明白:就是接口绑定那里。今天亲自敲了一遍代码后终于清楚了,我的理解如下:
当一个方法需要依赖于一个工具类的时候,使用依赖注入即可,如下:
class Service{ protected $inter; public function __construct(Inter $inter){ $this->inter = $inter; } }
这里的Inter可以是一个接口,也可以是一个实体类,如果是接口初始化的时候容器会根据接口类型在容器里找到该接口的实现类,比如下面这样的:
use App\Serveice\InterImpl; use App\Contracts\Inter; ... app()->singleton(Inter::class,InterImpl::class);
上面的use一定要声明,不然容器是找不到对应的类的,这里的
app()->singleton(Service::class),等价于app()->singleton(Service::class,Service:class)。这种通过类名形式的绑定,laravel在解析的时候会调用这个类型的构造函数来实例化服务。并且在调用构造函数的时候,会通过反射获得这个构造函数的参数类型,然后从容器已有的绑定中,解析出对应参数类型的服务实例,传入构造函数完成实例化。
Inter是一个实体类,则可以直接这样写:
use App\Contracts\Inter; ... app()->singleton(Inter::class);
更多容器的详解请见:laravel框架容器管理的一些要点