关于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. CSS -- 元素简介

    一.元素分类 在CSS中,html中的标签元素大体被分为三种不同的类型:块状元素.内联元素(又叫行内元素)和内联块状元素. 常用的块状元素有: <div>.<p>.<h1 ...

  2. 吴恩达《深度学习》-课后测验-第三门课 结构化机器学习项目(Structuring Machine Learning Projects)-Week1 Bird recognition in the city of Peacetopia (case study)( 和平之城中的鸟类识别(案例研究))

    Week1 Bird recognition in the city of Peacetopia (case study)( 和平之城中的鸟类识别(案例研究)) 1.Problem Statement ...

  3. python代码开发规范

    https://github.com/libo-sober/LearnPython/tree/master/day18 为什么要有模块? 拿来主义,提高开发效率. 便于管理维护. 什么是脚本呢? 脚本 ...

  4. 万字详解TDengine 2.0整体架构设计思路

    ​导读:涛思数据8月3日将TDengine 的集群功能开源,TDengine具有超强的性能和功能,为什么能做到?它到底有哪些技术创新?今将TDengine的整体设计文档分享出来. 1: 数据模型 物联 ...

  5. Docker实战(2):主从库搭建

    入门 基于Docker的Mysql主从复制搭建 首先安装docker 拉取mysql镜像:5.7版本 启动主从数据库容器 docker run -p 3339:3306 --name Maste -e ...

  6. ribbon源码之客户端

    客户端模块的核心功能是提供统一的用户请求操作接口. 接口定义 客户端模块的核心是IClient接口,定义了客户端网络请求的方法. public interface IClient<S exten ...

  7. PHP_Code_Challenge 1~30

    1. 1wMDEyY2U2YTY0M2NgMTEyZDQyMjAzNWczYjZgMWI4NTt3YWxmY= <?php error_reporting(0); require __DIR__ ...

  8. (一)jenkins+git+docker

    目录 一.发布流程设计 1.工作流程 2.环境规划如下 二.部署Git仓库 1.创建Git用户并设置密码 2.创建仓库 3.免密访问 4.在jenkins那台机上做ssh认证 三.准备Jenkins环 ...

  9. Java递归算法经典实例(兔子问题、阶乘、1到100累加)

    https://blog.csdn.net/isitman/article/details/61199070

  10. Python-迭代协议-__iter__ __next__ iter next yield

    iter 本质是for循环调用的实质,for循环通过调用这个函数返回可迭代对象生成器形式,开始迭代取值捕获StopIteration错误退出循环 for循环首先找__iter__方法,然后再找 __g ...