路由和控制器以及模型之间的联系
路由
路由规定了url匹配的控制器方法以及url中参数的位置,同时规定了匹配的请求类型。在路由中同样可以将模型注入到模板,Laravel 会自动处理在路由或控制器方法中,与类型提示的变量名相匹配的路由段名称的的 Eloquent 模型。
//隐式绑定
Route::get('api/users/{user}', function (App\Models\User $user) {
return $user;
});
//在provider中进行显式绑定
/**
* 定义你的路由模型绑定, pattern 过滤器等
*
* @return void
*/
public function boot()
{
Route::model('user', \App\Models\User::class);
// ...
}
//绑定之后定义一个路由
Route::get('profile/{user}', function (App\Models\User $user) {
//
});
模型
Laravel 的 Eloquent ORM 提供了一个漂亮、简洁的 ActiveRecord 实现来和数据库交互。每个数据库表都有一个对应的「模型」用来与该表交互。你可以通过模型查询数据表中的数据,以及在数据表中插入新记录。
laravel中文手册 8.x对于模型的描述
一个包含了许多数据库交互方法的类,同时也包含了相关表中的数据
模型关联
当我们定义了一个方法返回一个关联
例如
class Comment extends Model
{
public function user()
{
return $this->belongsTo(User::class);
}
}
如果我们调用user()方法,返回的是一个Eloquent模型关联实例,而使用魔法方法user调用获得的则是User模型实例
控制器
包含了用户自定义方法的类,在这里通过view将模型传入模板
服务容器
Laravel 服务容器是一个用于管理类依赖以及实现依赖注入的强有力工具。依赖注入这个名词表面看起来花哨,实质上是指:通过构造函数,或者某些情况下通过「setter」方法将类依赖「注入」到类中。
laravel中文手册 8.x对于服务容器的描述
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use App\Repositories\UserRepository;
use App\Models\User;
class UserController extends Controller
{
/**
* user仓储的实现
*
* @var UserRepository
*/
protected $users;
/**
* 创建一个新的控制器实例
*
* @param UserRepository $users
* @return void
*/
public function __construct(UserRepository $users)
{
$this->users = $users;
}
/**
* 展示给定用户的信息
*
* @param int $id
* @return Response
*/
public function show($id)
{
$user = $this->users->find($id);
return view('user.profile', ['user' => $user]);
}
}
服务容器使用绑定来实现接口或类的实例,并且通过反射自动解析依赖
反转控制
IoC 是 Inversion of Control 的简写,通常被称为控制反转。
实现控制反转时,通过将原先在模块内部完成具体实现类的实例化,移至模块的外部,然后再通过「依赖注入」的方式将具体实例「注入」到模块内即完成了对控制的反转操作。
「依赖注入」的结果就是控制反转的目的,也就说控制反转的最终目标是为了实现项目的高内聚低耦合,而实现这种目标的方式则是通过依赖注入这种设计模式。
依赖注入
「依赖注入」通过以构造函数参数,设值方法或属性字段等方式将具体组件传递给依赖方。比如上例中将UserRepository实例作为控制器的构造函数参数传入到控制器类的属性$users
反射
在PHP中,反射是指在PHP运行状态中,扩展分析PHP程序,导出或者提取出关于类、属性、方法、参数等的详细信息,包括注释。这种动态获取信息以及动态调用对象方法的功能,被称为反射API。
Facades
Facades 为应用的 服务容器 提供了一个 『静态』 接口。Laravel 自带了很多 Facades,可以访问绝大部分功能。Laravel Facades 实际是服务容器中底层类的 『静态代理』 ,相对于传统静态方法,在使用时能够提供更加灵活、更加易于测试、更加优雅的语法。
laravel中文手册 8.x对于Facades的描述
facades通过魔术方法__callStatic()将静态方法映射到真正调用的方法上,从服务容器中解析出服务的对应方法
contracts
Laravel 的契约是一组接口,它们由框架提供并定义了核心服务。例如,illuste\Contracts\Queue\Queue 契约定义了排队作业所需的方法,而 illuste\Contracts\Mail\Mailer 契约定义了发送邮件所需的方法。
每个契约都有由框架提供的相应实现。例如,Laravel 提供了一个包含各种驱动程序的队列实现,还有一个由 SwiftMailer 提供支持的邮件程序实现等等。
laravel中文手册 8.x对于contracts的描述
contracts包含了一组服务接口,使用契约的好处是松耦合