首页 > 其他分享 >Laravel中的基本概念

Laravel中的基本概念

时间:2022-11-21 13:35:20浏览次数:69  
标签:Laravel 容器 Illuminate app class user IOC 基本概念

一.什么是 DI依赖注入/IOC控制反转

DI依赖注入

啥都不说,直接上代码

<?php
class UserController
{
private $user;

function __construct(UserModel $user) {
$this->user = $user;
}
}

$user = new UserController(new UserModel());
?>

User控制器依赖UserModel,实例化的时候,直接注入。

IOC控制反转

先说IOC和DI的区别吧!

  • IOC是一种设计思想
  • DI是一种设计模式

所以两者有本质上的区别。DI是IOC的一种实现方法(还有ServiceLocator等其他设计模式)。 所谓的反转,主要指由 主动依赖 到 被动依赖 。

//主动依赖
function __construct() {
$this->user = new UserModel();
}

//被动依赖
function __construct(UserModel $user) {
$this->user = $user;
}

参考 ​​浅谈IOC--说清楚IOC是什么​​

二.什么是IOC容器

IOC容器 是Laravel的核心设计模式,对于laravel的应用和理解是非常有必要深入学习的!

IOC思想实现了高度解耦,那么,问题来了,如何管理这些分散的模块呢?这就是容器的任务了!

可以想象成,在IOC容器中,装着(注册)很多模块。当用户需要一个模块的时候,可以从中拿出来。当提取的模块依赖另一个模块的时候,容器会自动注入,再返回给用户(反射机制实现)。

是不是碉堡了?大批互相依赖的模块被完美解耦并统一管理了!

三.什么是服务提供者(ServiceProvider)

假设模块一多,那么容器不是越来越大?每次加载,岂不是加载好久? 能不能弄一条管子,连接着模块,插在容器上,需要再通过管道获取呢?这样子,容器只是装着管头而已,就不怕被撑大了!

这条管子就是 服务提供者。

Laravel中的基本概念_laravel

 

服务提供者本身也是一个类,不过这个类只有启动和注册两个函数。


/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
//
}

/**
* Register the application services.
*
* @return void
*/
public function register()
{
//绑定到容器
$this->app->singleton(
'Riak\Contracts\Connection',
function ($app) {
return new Connection($app['config']['riak']);
}
);
}

服务提供者在config/app.php中配置,laravel自动注册到容器中。


'providers' => [

/*
* Laravel Framework Service Providers...
*/
Illuminate\Auth\AuthServiceProvider::class,
Illuminate\Broadcasting\BroadcastServiceProvider::class,
...

/*
* Application Service Providers...
*/
app\Providers\AppServiceProvider::class,
app\Providers\AuthServiceProvider::class,
...
]

四.什么是门面(Facade).​​#​

程序猿总是偷懒的,每次要模块,都要去容器里面拿,多麻烦啊!找个人代拿行不?这送货小哥就叫Facade门面。文档中叫静态代理。

送货小哥都是在config/app.php 中注册的。

'aliases' => [
'App' => Illuminate\Support\Facades\App::class,
'Config' => Illuminate\Support\Facades\Config::class,
'Cookie' => Illuminate\Support\Facades\Cookie::class,
'Crypt' => Illuminate\Support\Facades\Crypt::class,
'DB' => Illuminate\Support\Facades\DB::class,
'Route' => Illuminate\Support\Facades\Route::class,
...
],

 

查看Illuminate\Support\Facades\Route代码,可以发现只有getAccessFacade()方法,这就是交代送啥货的函数,继承了Facade这个小哥基类。


class Route extends Facade
{
/**
* Get the registered name of the component.
*
* @return string
*/
protected static function getFacadeAccessor()
{
return 'router';
}
}

注册了Facade门面后,就可以在任意地方使用了!

文档有详细的使用方式 

五.Application和Kernel

不难发现,在引导程序开始初始化的时候,也就是在boostrap\app.php文件,里面一来就new了一个 Illuminate\Foundation\Application。下面分别注册了 Http\Kernel、Console\Kernel、Exceptions\Handler等。

这里可以这么理解,new一个Application,可以看作是创造了一个空间,这个空间初始化的时候,就会为自己注入一个容器,也就是在空间中放了一个容器。

在 Illuminate\Foundation\Application.php 中的 registerBaseBindings() 函数可以查看到容器注入源码。

至于kernel,可以看成是这个空间的工人,有各种各样的工人,每个工人都有自己的工作。好比HttpKernel,负责处理http请求以及控制整个请求流程。

 

标签:Laravel,容器,Illuminate,app,class,user,IOC,基本概念
From: https://blog.51cto.com/u_6353447/5873669

相关文章

  • Laravel神奇的IoC容器
    Laravel的核心就是一个 IoC容器,根据文档,称其为“服务容器”通过举例来让读者去理解什么是 IoC(控制反转) 和 DI(依赖注入)超人和超能力,依赖的产生! 我们把一个“超人”作......
  • lumen项目集成laravelS后sentry无法上报的问题
    背景 公司项目严重依赖lumen系列,代码众多,重构困难,虽然访问量变大,性能问题越来越严重,急需要提升性能,于是找到了这个项目 laravelSgithub:​​https://github.com/hhxsv......
  • php中使用swoole加速lumen项目-laravelS实战
    ​背景 公司项目严重依赖lumen系列,代码众多,重构困难,虽然访问量变大,性能问题越来越严重,急需要提升性能,于是找到了这个项目 ​​https://github.com/hhxsv5/laravel-s​​ ......
  • php – Laravel – 从附带where子句的另一个表中不存在的记录中获取记录
    1.存在一个商户表id  name 2.存在一个会员表idadmin_idname3.查询还没有添加会员的商户信息DB::table('admin_users')->leftJoin('admin_ext','admin_ext.adm......
  • 博弈论扩展 CFR算法 一 基本概念
    扩展扩展性博弈与CFR算法目录扩展扩展性博弈与CFR算法CFR算法的发展算法应用强化学习的结合学习资料:扩展型博弈——知识回顾表示形式——博弈树信息集informati......
  • Laravel:whereIn子查询
    文档​​https://learnku.com/docs/laravel/9.x/queries/12246#08034f​​示例如下$users=User::whereNotIn('id',function($query)use($user){$query->se......
  • 计算机网络:广域网的基本概念
    广域网通常是指覆盖范围很广(远超一个城市的范围)的长距离网络。广域网是因特网的核心部分,其任务是长距离运送主机所发送的数据。连接广域网各结点交换机的链路都是高速链路,它......
  • 67:函数的基本概念_内存分析_函数的分类_定义和调用
    ###函数简介###函数的基本概念1.一个程序由一个个任务组成;函数就是代表一个任务或者一个功能。2.函数是代码复用的通用机制。###Python函数的分类Python中函数分为......
  • laravel构建多语言系统
    多语言切换 config/app.php  中locale中默认为‘en’  'locale'=>'zh_CN',建立LanguageControllernamespaceApp\Http\Controllers;classLanguageCo......
  • laravel 查询构建器
    $query=DB::connection($conn)->table($table)->select('*',DB::raw("CONCAT(date,'',time)ASdttm"))->where('P',$p)->whereIn('status',$status)->whereRa......