关于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或者lumen门面和服务提供者使用的更多相关文章

  1. laravel门面和服务提供者使用

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

  2. Laravel 核心--Facades 门面

    Laravel 核心--Facades 门面 伊Summer 关注  0.1 2017.08.12 19:07* 字数 2017 阅读 1089评论 0喜欢 5 介绍 Facades 为应用的 IoC ...

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

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

  4. laravel and lumen 软删除操作

    知识都是有联系的,这绝对是真理.作为一名小白,看了一点官方文档,把我自己理解的软删除操作给大家讲讲.有些就是套用官方文档的话. 定义:什么是软删除呢,所谓软删除指的是数据表记录并未真的从数据库删除,而 ...

  5. 【laravel VS lumen】

    读取项目的配置信息 读取config文件database.php中的default属性信息 laravel:config('database.default'); lumen:app()->co ...

  6. laravel和lumen数据库链接错误_FatalErrorException Call to a member function connection

    FatalErrorException in Model.php line 3339: Call to a member function connection() on null 挺简单的一个lum ...

  7. Laravel源码解析--看看Lumen到底比Laravel轻在哪里

    在前面一篇<Laravel源码解析--Laravel生命周期详解>中我们利用xdebug详细了解了下Laravel一次请求中到底做了哪些处理.今天我们跟 Lumen 对比下,看看 Lume ...

  8. lumen或者laravel安装指定版本

    方法一 安装器安装:缺点不能安装指定版本 composer global require "laravel/lumen-installer" lumen new blog comp ...

  9. laravel的核心概念:服务提供者provider解析

    我们知道laravel和核心就是一个IoC容器, 被称之为服务容器. 那么作为IoC容器, 就必须要有绑定对象生成器的工作.  在laravel中是服务提供者来项服务容器中绑定对象生成器的. 百牛信息 ...

随机推荐

  1. os.walk模块查找目录下的所有txt文件

  2. 蒲公英 · JELLY技术周刊 Vol.22: npm i react-router@6.0.0-beta.0

    蒲公英 · JELLY技术周刊 Vol.22 近期 React Router 已经释出了 6.x 的 beta 版本,正式版本已经不远了,作为 React 生态中的重要组成部分,React Route ...

  3. java事件触发

    工作遇到一个问题:用netty实现服务和设备的交互,服务发送了一组指令,需要再等待时间内获取结果,如果结果提前全部返回,就进一步处理,如果等待时间内没有全部返回,就视为失败处理. 这个场景我遇到的困难 ...

  4. spring boot 源码之SpringApplicationRunListeners

    SpringApplicationRunListeners SpringApplicationRunListener的集合,内部存储了SpringApplicationRunListener的集合,提 ...

  5. 龙芯3A4000-Debian 10上常用软件记录

    所用平台 硬件:龙芯3a4000 (MIPS64el) 操作系统:Debian 10(buster)+ MATE桌面 内核版本:4.19.90 以下所有软件同样适用于x86体系结构的Linux发行版. ...

  6. Spring学习(九)Spring 和数据库编程【了解】

    一.传统 JDBC 回顾 用一个大佬的demo来简单看一下 /** * 使用jdbc,根据id查询单个Student的信息 */ public class JdbcManage { public St ...

  7. 有没有异常处理翻车过的,绩效还被打了C

    絮叨 因为程序异常处理问题,就在前几天龙叔的服务挂了几秒钟. 完了,马上季度末打绩效,竟然在这里翻车了,心如刀绞啊. 虽然没有影响到用户体验,但是找到问题并解决掉问题是工程师日常追求之一. 作为一个优 ...

  8. 系统模块sys的常用方法

    sys.argv参数 sys.argv  等价于是一个列表,argv[0] 代表当前脚本程序路径名,可以通过在外部获取多个参数传递给脚本程序执行,按照列表的取值方式第二个数据就是sys.argv[1] ...

  9. Appium 用途和特点

    Appium 是一个移动 App (手机应用)自动化工具. 手机APP 自动化有什么用? 自动化完成一些重复性的任务 比如微信客服机器人 爬虫 就是通过手机自动化爬取信息. 为什么不通过网页.HTTP ...

  10. 项目里出现两个配置类继承WebMvcConfigurationSupport时,为什么只有一个会生效(源码分析)

    为什么我们的项目里出现两个配置类继承WebMvcConfigurationSupport时,只有一个会生效.我在网上找了半天都是说结果的,没有人分析源码到底是为啥,博主准备讲解一下,希望可以帮到大家! ...