依赖注入这个短语必然是指通过构造函数或在某些情况下通过 "setter"方法**"注入 "** 到一个类中的类依赖关系。我们可以将类注入到另一个类的构造函数中,然后得到该类的对象,通过该对象,我们可以访问其方法 和属性。
Laravel依赖性注入
Laravel的服务容器是一个依赖注入容器,也是一个应用程序的注册表。 Laravel容器是一个强大的工具,用于管理依赖关系和存储对象的各种用途; 例如; 你可以存储对象并在Facades中使用它们.
依赖性注入是常用的,即使是请求访问,我们大多是注入:
public function __construct(Request $request)
让我们看看表面之下,因为了解事物的工作原理总是比记住它们要好。
当你把对象注入到你的类中时, Container使用Reflection API来检查你的构造方法并检索你所定义的依赖关系.
什么是Laravel的Reflection API
反射被定义为一个程序在执行时检查自己并修改其逻辑的能力。
PHP 5有一个完整的反射API,增加了逆向工程类,接口,函数,方法,和扩展的能力。
此外,反射 API 还提供了检索函数、类和方法的文档注释的方法。
反射在PHP中是很普遍的。然而,在一些情况下,即使你不知道也可能会用到它。
PHP的一些内置函数间接地使用了反射API,call_user_func函数。
我们将通过一个例子来了解。
第一步: 安装Laravel项目
输入以下命令:
composer create-project laravel/laravel DI --prefer-dist
现在, 配置数据库:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=di
DB_USERNAME=root
DB_PASSWORD=mysql
现在, 我们需要为用户表添加种子
键入下面的命令:
php artisan make:seeder UsersTableSeeder
第二步: 编写查询和种子表
<?php
use Illuminate\Database\Seeder;
class UsersTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
DB::table('users')->insert([
'name' => str_random(10),
'email' => str_random(10).'@gmail.com',
'password' => bcrypt('secret'),
]);
DB::table('users')->insert([
'name' => str_random(10),
'email' => str_random(10).'@gmail.com',
'password' => bcrypt('secret'),
]);
DB::table('users')->insert([
'name' => str_random(10),
'email' => str_random(10).'@gmail.com',
'password' => bcrypt('secret'),
]);
DB::table('users')->insert([
'name' => str_random(10),
'email' => str_random(10).'@gmail.com',
'password' => bcrypt('secret'),
]);
DB::table('users')->insert([
'name' => str_random(10),
'email' => str_random(10).'@gmail.com',
'password' => bcrypt('secret'),
]);
}
}
在你的终端中键入以下命令:
php artisan db:seed
它将为我们的表创建行。
第三步:依赖性注入代码
通过输入以下命令,建立一个名为UserController的控制器:
php artisan make:controller UserController --resource
此外,我们还需要为我们的应用程序制作一个web路由。
因此,在web.php文件中,写下以下一行代码:
Route::get('/users', 'UserController@index');
我们需要在UserController.php文件中包含我们的User.php模型:
use App\User;
我们还需要为该类写构造函数,以注入依赖关系:
/**
* The user repository implementation.
*
* @var UserRepository
*/
protected $users;
/**
* Create a new controller instance.
*
* @param User $users
* @return void
*/
public function __construct(User $users)
{
$this->users = $users;
}
在index()函数中,写下以下几行代码:
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$id = 2;
$user = $this->users->find($id);
return $user;
}
在现实生活中,我们需要传递**$id**作为该函数的参数,但这是一个演示,所以这里不需要。
现在, 通过输入以下命令来启动laravel服务器:
php artisan serve
点击下面的网址:
你会看到像这样的输出:
{
"id": 2,
"name": "qvzbXlneUl",
"email": "W4PvNyLAdX@gmail.com",
"created_at": null,
"updated_at": null
}
所以, 我们已经成功地将类注入到构造函数中, 并制作了一个该模型的对象, 通过这个对象, 我们现在可以访问它的方法并显示数据库中的数据。
在Laravel中, 你也可以直接将类注入到它的方法中, 在那个时候, 你甚至不需要建立对象; laravel会通过 Resolution API为你制作:
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index(User $users)
{
$id = 2;
$user = $users->find($id);
return $user;
}
本教程到此结束.