使用Laravel服务容器的优点(框架的核心)
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前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。