本站的 Laravel 教程对服务容器和服务提供者有介绍吗?

我在前三个教程的目录里搜了一下“服务”,没搜到。不知道是不是分散在教程的各部分了,没有专门讲。我对“我对服务容器的理解”一直不太满意,如果教程里有的话那我会更愿意买。

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 3
sanders

可能是关键词用错了。框架采用的模式叫“依赖注入”(DI)模式,是“控制反转”(IoC)思想的一种实现方式。你搜索论坛里有很多帖子在解释这个问题,其中我认为比较好的一篇是:博客:Laravel 核心——IoC 服务容器

很多文章比较老了,你可能需要结合最新的文档来看。如果你接触设计模式时间不久也不用对模式的名字太纠结,你只需要知道设计模式是专门为了降低某一类问题代码维护的成本而发明的编码模式。

1年前 评论
  1. 服务是什么?Route::get()中的这个Route它就是个服务,因为它提供了路由相关的东西,或者你在控制器里调用的Request或自定义的Request来验证东西,储如这些都可以被称为”服务“它是由多个Composer组件组成的。
  2. 第一个服务解释清楚了,服务容器:你可以把它相象成装东西的碗或坛子,里面的”服务“就是写好的东西。因为Laravel的容器本质就是一个服务定位器(一种设计模式),你用的这些Route,Request,在我们在前端向后端发送请求时,Laravel最先就会启动这个叫容器的类,然后把这个称为服务的东西给你 new 好,再放到它容器内。避免在本次请求的生命周期你在其它地方调用这些服务还要去手动new
  3. 如果没有服务容器,你在控制器里调用某些你自己写的东西每次都需要 new 一次
  4. 服务提供者就是:把你写好的一些组件(你可以称为包),或者是一个抽象接口同时拥有多个实现类。这些写好的东西就可以通过服务提供者这种东西给你硬编码至容器中,你在其它地方就能随意的调用这些服务了,并且你都根本不需要new操作,就像下面这样的代码
class UserController 
{
    protected UserService $userService;

     public function __construct(UserService $userService)
    {
    }

    public function index()
    {
        // 我都不用new UserService()了,直接就通过构造器实现自动注入了
        $this->userService->do();
    }

    public function store()
    {
        // 我在这里也能随便调
        $this->userService->do();
    }
}

PS:至于为什么它可以自己帮你把这个类注入进来,是因为所有编程语言都有一个叫 “反射” 的工具,PHP的容器就会在解析构造函数时帮你自动去找这些依赖,然后再通过反射工具进行分析,如果这个类有其它依赖,就递 归一层层往下的找,直到,它的依赖的依赖的依赖的构造函数没有任务参数就一层一层的返回,直到实例化这个叫UserService的类。然后容器会把这个由反射工具实例化好的UserSerivce放到它的储存数组里,只要在本次生命周期内你的其它地方有调这个UserService类,容器会在它的类数组里找有没有实例化好实例,有就给你返回,没有实例化。

总结:
建议先用用框架,有点基础了再回头看这些概念你就会豁然开朗

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!