关于laravel门面和服务提供者使用的一点见解,门面之词,不足之处,还请多多指教。

在laravel中,我们可能需要用到自己添加的类时,可以建立一个文件夹专门存放类文件,也可以使用laravel的服务提供者的方式来使用。

这两者其实区别不大,主要是前者使用的话,会跟业务代码产生依赖,想象一下,如果一个控制器之中引用了很多自定义的类文件的话,那么可以想像会产生多少依赖,所以我们可以使用服务提供者的方式,向laravel的容器内注册类,这样的话,就能够在一个单独的配置文件里面来管理依赖,逻辑和后期维护也会方便不少。

使用门面主要是可以不需要去实例化类,可以使用静态方法的方式去访问类的方法,用起来也比较方便,不过这样其实也有缺点,比如不能够直接跳转到对应的方法内部,也不能直观的去了解这个方法的用法,个人开发可能影响不大,不过如果团队开发的,其实用起来可能会让人有点晕晕的吧。

好了,话不多说,还是用代码来说话吧。

此代码是建立在laravel5.3的基础上

一、建立一个需要用到类

app目录下面见一个lib\Tools\FooBar.php文件,这是我们的工具类,里面是我们定义的代码。

<?php
namespace App\Lib\Tools; class FooBar
{
public function get()
{
return 'hello facade';
}
}

二、建立一个服务提供者

使用php artisan make:provider FooServiceProvider创建一个服务提供者,并将我们刚才编写的工具类注册到容器里面,

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\Lib\Tools\FooBar; class FooServiceProvider extends ServiceProvider
{
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
//
} /**
* Register the application services.
*
* @return void
*/
public function register()
{
$this->app->bind('foo',function(){
return new FooBar();
});
}
}

如果需要慢加载的话,则需要添加在改服务提供者中添加一个$defer属性。并定义一个provides方法。如下所示:

protected $defer = true;

public function provides()
{
return [FooBar::class];
}

三、注册服务提供者

config\app.php文件中的providers属性里面注册我们刚添加的服务提供者,如下所示:

/*
* Application Service Providers...
*/
App\Providers\AppServiceProvider::class,
App\Providers\AuthServiceProvider::class,
// App\Providers\BroadcastServiceProvider::class,
App\Providers\EventServiceProvider::class,
App\Providers\RouteServiceProvider::class,
App\Providers\FooServiceProvider::class,

这样我们就可以在项目中的任何地方使用我们刚才定义的工具类,可以直接在某个类的方法里面注入,然后就可以直接调用了。如果想要使用门面的话,可以往下看。

四、创建一个门面类

app目录下面创建一个门面类,App\CustomFacades\Foo.php,目录这里是我自己建立的,这个可以随便创建。只要在后面注册的时候一致就可以。代码如下:

<?php

namespace App\CustomFacades;

use Illuminate\Support\Facades\Facade;

class Foo extends Facade
{
protected static function getFacadeAccessor()
{
return 'foo';
}
}

五、注册门面

config\app.phpaliases属性中追加下面的代码:

 'Foo' => App\CustomFacades\Foo::class,

以上步骤就注册完成了,我们可以调用测试一下是否可用。
routes\console.php里面添加下面的代码:

Artisan::command('testFacade',function(){
dd(Foo::get());
});

然后在项目根目录的终端里面,调用下面的命令:

php artisan testFacade

如果输出 hello facade则说明都注册成功,接下来,我们可以在项目的任何地方使用该自定义门面啦。

lumen方法:app里面添加

class_alias('App\CustomFacades\Foo', 'Foo'); //添加别名

结束语

本篇文章主要介绍了怎么在laravel中使用自定义的服务提供者和门面类,基本上都是参照的官方文档,如果有什么错误或者其他的地方,还望各位多指点指点。

laravel门面和服务提供者使用的更多相关文章

  1. laravel门面与服务提供者区别

    laravel门面模式与服务提供者区别 以 Laravel 自带的文件系统为例,在 config/app.php 的配置文件的 providers 数组中,注册了一个服务提供者: Illuminate ...

  2. laravel或者lumen门面和服务提供者使用

      关于laravel门面和服务提供者使用的一点见解,门面之词,不足之处,还请多多指教.    在laravel中,我们可能需要用到自己添加的类时,可以建立一个文件夹专门存放类文件,也可以使用lara ...

  3. Laravel修炼:服务提供者

    前言   上一篇博客文章收集了关于Laravel服务容器的相关知识(传送门),我们知道了服务容器主要有绑定和解析两个重要功能,那么Laravel这个框架集齐了如此多功能,我们项目可能还需要另外引入一些 ...

  4. Laravel 门面实例教程 —— 创建自定义 Facades 类

    我们首先创建一个需要绑定到服务容器的Test类: <?php namespace App\Facades; class Test { public function doSomething() ...

  5. laravel 门面的介绍和使用

    #上文讲述了laravel中怎么用容器依赖注入类的示例.其实在服务提供者上面在封装一层静态调用,这就是门面.静态调用门面,返回了容器中注册的别名和实例. #下面是测试的示例 #先创建要操作的类 < ...

  6. laravel扩展包服务提供者的注册的两种方式

    一. 包自动发现 在 Laravel 应用的配置文件 config/app.php 中,providers 配置项定义了一个会被 Laravel 加载的服务提供者列表.当安装完新的扩展包后,在老版本中 ...

  7. PHP重载以及Laravel门面Facade

    目录 重载的概念 魔术方法中的重载 属性重载 方法重载 Laravel中的Facade 扩展 谈谈__invoke Laravel提供了许多易用的Facade,让我们用起来特步顺手,那么这些Facad ...

  8. laravel门面DB返回数组配置

    在数据库配置文件中添加 'fetch' => PDO::FETCH_ASSOC, //但是这个配置好像是全局的,不能针对单个数据库连接进行配置 也可以在方法内使用php内置函数get_objec ...

  9. laravel 服务提供者

    服务提供者,在laravel里面,其实就是一个工厂类.它最大的作用就是用来进行服务绑定.当我们需要绑定一个或多个服务的时候,可以自定义一个服务提供者,然后把服务绑定的逻辑都放在该类的实现中.在lara ...

随机推荐

  1. Python开发【第二篇】:基本数据类型

    运算符 1.算数运算 2.比较运算 3.赋值运算 4.逻辑运算 5.成员运算 基本数据类型 所有对象所具备的方法都保存在类中.对象和类的关系,举个例子:哺乳动物是类:此类下有两个对象,一个为狗.一个为 ...

  2. Django-rest-framework 接口实现 Serializer 使用

    Django接口实现 DRF 使用 以下模块 实现 json数据 序列化 博客: https://www.cnblogs.com/liwenzhou/p/9959979.html Django RES ...

  3. C#事件の事件访问器

    在真实的项目中,有的对象有相当多的事件,例如一个窗体就有好多种事件.默认情况下,当声明事件时,编译器将内存分配给一个事件字段,一存储事件信息.如果类中有好多事件未使用,则他们会不必要的占用内存. 这种 ...

  4. 关于 chrome canary X64 在 win7 64bit 下面缺少openvr_api.dll的解决方法

    在github上下载openvr_api.dll放到chrome的安装目录下就可以. 其实放到系统目录下最好,以后其他程序要使用的时候也能使用的到. https://github.com/ValveS ...

  5. python入门学习:2.列表简介

    python入门学习:2.列表简介 关键点:列表 2.1 列表是什么2.2 修改.添加和删除元素2.3 组织列表 2.1 列表是什么   列表,是由一系列按特定顺序排列的元素组成.你可以创建包含字母表 ...

  6. 配置DispatcherServlet应该写/还是/*

    相亲怎么做 web应用需要放在Tomcat容器中才能启动,Tomcat容器内有一个默认的web.xml文件,在自己项目中配置的XML文件都是继承自Tomcat中的全局XML文件并重写其中相应配置,这种 ...

  7. 當 Alexa 遇上 ESP8266 (一)

    https://www.birdandgua.net/bird/2017/12/when_alexa_meets_esp8266-1/ 去年的 AWS 的 re:Invent 上,我見識了 Alexa ...

  8. ORA-00600: internal error code, arguments: [2662]

    转自 http://www.eygle.com/archives/2005/12/oracle_diagnostics_howto_deal_2662_error.html 在ORA-00600 22 ...

  9. XtraDB引擎

    https://mariadb.com/kb/en/library/xtradb-and-innodb/ https://mariadb.com/kb/en/library/about-xtradb/ ...

  10. 环境变量配置的作用和区别:Path、Classpath、JAVA_HOME

    环境变量配置的作用和区别:Path.Classpath.JAVA_HOME 一个是零时配置,另一个是永久性配置. 零时配置的方法: 打开cmd窗口——>输入set命令,回车——>输入set ...