Code前端首页关于Code前端联系我们

使用Laravel服务容器的优点(框架的核心)

terry 2年前 (2023-09-25) 阅读数 65 #后端开发

Laravel框架的核心是什么,那么毫无疑问就是服务容器。理解服务容器的概念对于我们使用laravel非常重要。不得不说,理解服务容器的概念是区分是否入手 Laravel 的重要条件。因为整个框架是建立在服务容器的基础上的。

laravel 服务容器就像一个高度自动化的工厂。无论您需要什么,您都可以自定义模型并使用特定的接口来生成它。

由于使用了服务容器,laravel 中大部分对象的实例化方式如下:

$obj1 = $container->make('class1', 'class2');

$obj2 = $container->make( 'class3', 'class4');

但不使用服务容器也可以使用以下方法:

$obj1 = new class1(new class2()) ;

$obj2 = new class3(new class4( ));

那么使用服务容器有什么好处呢?我们用具体的例子来分析一下它的优点:

例1、发送电子邮件

我们将发送电子邮件的功能封装在一个类中。如有必要,创建一个实例并调用 send 方法。

以下是不使用laravel服务容器的常见方式:

/**

*发送电子邮件服务类

*/

class EmailService{

public function send(){

//todo邮件发送方法

}

}

//如果你想发送邮件到任何地方,我们复制下面两行代码

$emailService = new EmailService();

$emailService ->send();

使用laravel服务容器后:

$this->app->bind('emailService', function ($app) {

return new EmailService() ;

} );

//如果你想向任何地方发送电子邮件,我们复制以下两行代码

$emailService = app('emailService');

$emailService->send ( );

这使得我们的代码更加简洁,中间层提高了(解耦)灵活性,所以无论是测试(测试时我们可以mock一个类来替换EmailService类)还是优化EmailService类,都变得更加方便。

//就改这一个地方

$this->app->bind('emailService', function ($app) {

return new SupperEmailService();

});

我们根本不需要接触其他调用部分。如果我们没有这个绑定操作,我们就必须在每个使用邮政服务的地方进行更改。

//每个使用EamilSerice类的地方都要改

$emailService = new SupperEmailService();

$emailService->send();

示例2、单例模式实现

还是上面的例子,出于性能原因需要 SupperEamilService 类来实现单例模式,所以在不使用 laravel 服务容器的情况下,将 SupperEmailService 类更改如下:

class SupperEamilService{

// 创建静态私有变量为存储该类型的对象

static private $instance;

//防止直接创建对象

private function __construct(){

}

//防止克隆对象

private function __clone(){

}

static public function getInstance(){

//判断$instance是否为Uni对象

//如果不是,则创建它

if ( !self:: $instance instanceof self) {

self::$instance = new self();

}

return self::$instance;

}

//邮件发送方法

public函数发送(){

}

}

另外,由于SupperEamilService类的构造函数现在是私有的,无法使用new关键字创建对象,所以每个实例化SupperEmailService类的地方都必须改为:

$emailService=SupperEmailService::getInstance() ;

$emailService->send();

laravel 服务容器本质上支持单例。 Laravel 实现如下:

//只需将绑定改为 singleton

$this->app->singleton('emailService', function ($app) {

return new SupperEmailService();

} );

实现单例只需要改一行代码,将原来的绑定方式替换为单例,通过容器提取出来的就是单例,真是方便。

例3:旅行者去旅行

这个例子假设旅行者要去西藏。他可以乘火车(火车)或步行(步行)。

不要使用 laravel 服务容器:

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门