laravel或者lumen门面和服务提供者使用
关于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.php的aliases属性中追加下面的代码:
'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门面和服务提供者使用的更多相关文章
- laravel门面和服务提供者使用
关于laravel门面和服务提供者使用的一点见解,门面之词,不足之处,还请多多指教. 在laravel中,我们可能需要用到自己添加的类时,可以建立一个文件夹专门存放类文件,也可以使用laravel ...
- Laravel 核心--Facades 门面
Laravel 核心--Facades 门面 伊Summer 关注 0.1 2017.08.12 19:07* 字数 2017 阅读 1089评论 0喜欢 5 介绍 Facades 为应用的 IoC ...
- laravel门面与服务提供者区别
laravel门面模式与服务提供者区别 以 Laravel 自带的文件系统为例,在 config/app.php 的配置文件的 providers 数组中,注册了一个服务提供者: Illuminate ...
- laravel and lumen 软删除操作
知识都是有联系的,这绝对是真理.作为一名小白,看了一点官方文档,把我自己理解的软删除操作给大家讲讲.有些就是套用官方文档的话. 定义:什么是软删除呢,所谓软删除指的是数据表记录并未真的从数据库删除,而 ...
- 【laravel VS lumen】
读取项目的配置信息 读取config文件database.php中的default属性信息 laravel:config('database.default'); lumen:app()->co ...
- laravel和lumen数据库链接错误_FatalErrorException Call to a member function connection
FatalErrorException in Model.php line 3339: Call to a member function connection() on null 挺简单的一个lum ...
- Laravel源码解析--看看Lumen到底比Laravel轻在哪里
在前面一篇<Laravel源码解析--Laravel生命周期详解>中我们利用xdebug详细了解了下Laravel一次请求中到底做了哪些处理.今天我们跟 Lumen 对比下,看看 Lume ...
- lumen或者laravel安装指定版本
方法一 安装器安装:缺点不能安装指定版本 composer global require "laravel/lumen-installer" lumen new blog comp ...
- laravel的核心概念:服务提供者provider解析
我们知道laravel和核心就是一个IoC容器, 被称之为服务容器. 那么作为IoC容器, 就必须要有绑定对象生成器的工作. 在laravel中是服务提供者来项服务容器中绑定对象生成器的. 百牛信息 ...
随机推荐
- Docker镜像下载很慢,各种加速无效
mcr.microsoft.com/dotnet/...... 改成: dockerhub.azk8s.cn/dotnet/...... 或 mcr.azk8s.cn/dotnet/......
- JWT伪造攻击
JWT修改伪造攻击 什么是JWT? JSON Web Token(JSON Web令牌)是一种跨域验证身份的方案.JWT不加密传输的数据,但能够通过数字签名来验证数据未被篡改(但是做完下面的WebGo ...
- USB 设备驱动(写给自己看的)
集线器与控制器(USB地址7bit) 设备,配置,端点,接口 USB1.0(低速1.2),1.1(全速450m),2.0(高速,电流传输)区别 引脚4根(V,D-,D+,gnd),miniUSB增加 ...
- 实验 3:Mininet 实验——测量路径的损耗率
实验目的 在实验 2 的基础上进一步熟悉 Mininet 自定义拓扑脚本,以及与损耗率相关的设 定:初步了解 Mininet 安装时自带的 POX 控制器脚本编写,测试路径损耗率. 实验任务 h0 向 ...
- mac电脑,charles,安卓手机如何配置代理,以及配置代理之后无法上网。已解决
设备: 电脑:mac book pro 手机:小米10 charles:4.5.6 方法一: 步骤: 首先确保电脑,手机在同一局域网, 1. charles设置代理:proxy -> proxy ...
- 细嚼JS闭包知识点及案例分析
闭包是js开发惯用的技巧,什么是闭包? 闭包指的是:能够访问另一个函数作用域的变量的函数.清晰的讲:闭包就是一个函数,这个函数能够访问其他函数的作用域中的变量.默认闭包的this指向windows. ...
- django_apscheduler 0.4.0删除了name字段
使用django_apscheduler时默认使用了最新版本,为0.4.2版本,但是在这个版本中,使用migrate 生成定时任务模型时没有了name字段,导致之前写的定时任务不能执行. 翻了下 dj ...
- java多线程:线程池原理、阻塞队列
一.线程池定义和使用 jdk 1.5 之后就引入了线程池. 1.1 定义 从上面的空间切换看得出来,线程是稀缺资源,它的创建与销毁是一个相对偏重且耗资源的操作,而Java线程依赖于内核线程,创建线程需 ...
- P3118 [USACO15JAN]Moovie Mooving G
P3118 [USACO15JAN]Moovie Mooving G Link 题目描述 Bessie is out at the movies. Being mischievous as alway ...
- Linux系统编程—有名管道
▋****1. 管道的概念 管道,又名「无名管理」,或「匿名管道」,管道是一种非常基本,也是使用非常频繁的IPC方式. 1.1 管道本质 管道的本质也是一种文件,不过是伪文件,实际上是一块内核缓冲区, ...