详解Laravel框架的依赖注入功能
发布:smiling 来源: PHP粉丝网 添加日期:2022-04-29 08:48:56 浏览: 评论:0
依赖注入不是让对象创建一个依赖关系,也不是让工厂对象去创建对象,而是将所需的依赖变成一个外部对象,使之成为一个"某些人的问题”,你为"某些人的问题”注入了类的依赖关系。在Laravel中,这个"某人”是服务容器,服务容器负责通过构造函数注入类的依赖关系。
概述
任何时候,你在一个控制器类中请求一个依赖,这个服务容器负责:
1.自动地在构造函数中检测依赖关系
2.如果需要构建这个依赖关系
3.通过构造函数创建对象形成依赖关系
来看一个非常简单的例子。
- <?php
- namespace App\Http\Controllers;
- use App\User;
- use App\Repositories\UserRepository;
- use App\Http\Controllers\Controller;
- class UserController extends Controller
- {
- protected $userRepository;
- public function __construct(UserRepository $userRepository)
- {
- $this->userRepository = $userRepository;
- }
- public function show($id)
- {
- $user = $this->userRepository->find($id);
- return view('user.profile', ['user' => $user]);
- }
- }
假如,你有一个UserController类需要UserRepository作为一个构造函数依赖。
1.服务容器使用PHP的反射类来检测,事实UserRepository需要被优先解析。
2.然后,它构造UserRepository实例。
3.然后,它构造UserController类实例。
依赖关系是如何被解析和注入的,我被很多Laravel开发人员不知道这个简单而强大的技术感到迷惑。 这是一个非常强大的技术,它可以被用来解决复杂对象的依赖关系。
如果由于某种原因,您不希望Laravel自动构建一个对象,您还可以通过传递一个可用于创建依赖关系的回调来告诉Laravel Service Container如何构造该对象。
- <?php
- $container->bind('My\Service', function($container) {
- return new My\Service($container->make('My\AnotherService'));
- });
您需要创建一个服务提供商来注册上述服务。
- <?php
- namespace App\Providers;
- use Illuminate\Support\ServiceProvider;
- class MyServiceProvider extends ServiceProvider
- {
- public function register()
- {
- $this->app->singleton(\My\Service::class, function ($app) {
- return new \My\Service($app->make('My\AnotherService'));
- });
- }
- }
当My\Service需要被解析的时候,负责返回一个对象的回调函数就会被调用。
- <?php
- namespace App\Http\Controllers;
- use App\User;
- use App\Http\Controllers\Controller;
- class MyController extends Controller
- {
- protected $myService;
- public function __construct(\My\Service $myService)
- {
- $this->myService = $myService;
- }
- // .. 方法
- }
真实的例子
假设你的应用需要Facebook的PHP SDK来访问Facebook的API,你的控制器就是这样的:
- <?php
- namespace App\Http\Controllers;
- use App\User;
- use App\Http\Controllers\Controller;
- use Facebook\Facebook;
- class FacebookApiAccessController extends Controller
- {
- protected $facebook;
- public function __construct(Facebook\Facebook $facebook)
- {
- $this->facebook = $facebook;
- }
- //.. action methods here
- }
现在,您需要告诉Service Container如何构建Facebook\Facebook的实例.
- <?php
- $container->singleton('Facebook\Facebook', function() {
- return new \Facebook\Facebook([
- 'app_id' => config('services.facebook.app_id'),
- 'app_secret' => config('services.facebook.app_secret'),
- 'default_graph_version' => 'v2.10',
- ]);
- });
注意,我已经调用了方法singleton而不是bind,唯一的区别是用singleton注册的服务被缓存,随后的解析服务调用返回缓存的服务。
结论:
依赖注入是一种强大的技术,你可以在Laravel中用来简化对象的创建. 默认情况下,Laravel的服务容器会自动的用反射去检测和解决依赖关系. 但是, 你可以指定回调来解析服务.
Tags: Laravel依赖注入
- 上一篇:php+laravel 扫码二维码签到功能
- 下一篇:最后一页
相关文章
- ·laravel框架中你所用到的依赖注入详解(2021-10-15)
- ·php+laravel依赖注入知识点总结(2022-01-21)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)