路由和控制器以及模型之间的联系

路由

路由规定了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包含了一组服务接口,使用契约的好处是松耦合