如何扩展Laravel

栏目: 编程语言 · PHP · 发布时间: 6年前

内容简介:向容器中注册服务扩展已有服务Manager实际上是一个工厂,它为服务提供了驱动管理功能。

注册服务

向容器中注册服务

// 绑定服务
$container->bind('log', function(){
    return new Log();
});
// 绑定单例服务
$container->singleton('log', function(){
    return new Log();
});

扩展绑定

扩展已有服务

$container->extend('log', function(Log $log){
    return new RedisLog($log);
});

Manager

Manager实际上是一个工厂,它为服务提供了驱动管理功能。

Laravel中的很多组件都使用了Manager,如: AuthCacheLogNotificationQueueRedis 等等,每个组件都有一个 xxxManager 的管理器。我们可以通过这个管理器扩展服务。

比如,如果我们想让 Cache 服务支持 RedisCache 驱动,那么我们可以给 Cache 服务扩展一个 redis 驱动:

Cache::extend('redis', function(){
    return new RedisCache();
});

这时候, Cache 服务就支持 redis 这个驱动了。现在,找到 config/cache.php ,把 default 选项的值改成 redis 。这时候我们再用 Cache 服务时,就会使用 RedisCache 驱动来使用缓存。

Macro和Mixin

有些情况下,我们需要给一个类动态增加几个方法, Macro 或者 Mixin 很好的解决了这个问题。

Laravel 底层,有一个名为 MacroableTrait ,凡是引入了 Macroable 的类,都支持 MacroMixin 的方式扩展,比如 RequestResponseSessionGuardViewTranslator 等等。

Macroable 提供了两个方法, macromixinmacro 方法可以给类增加一个方法, mixin 是把一个类中的方法混合到 Macroable 类中。

举个例子,比如我们要给 Request 类增加两个方法。

使用 macro 方法时:

Request::macro('getContentType', function(){
    // 函数内的$this会指向Request对象
    return $this->headers->get('content-type');
});
Request::macro('hasField', function(){
    return !is_null($this->get($name));
});

$contentType = Request::getContentstType();
$hasPassword = Request::hasField('password');

使用 mixin 方法时:

class MixinRequest{
    
    public function getContentType(){
        // 方法内必须返回一个函数
        return function(){
            return $this->headers->get('content-type');
        };
    }
    
    public function hasField(){
        return function($name){
            return !is_null($this->get($name));
        };
    }
}

Request::mixin(new MixinRequest());

$contentType = Request::getContentType();
$hasPassword = Request::hasField('password');

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

C专家编程

C专家编程

Peter Van Der Linden / 徐波 / 人民邮电出版社 / 2008-2 / 45.00元

《C专家编程》展示了最优秀的C程序员所使用的编码技巧,并专门开辟了一章对C++的基础知识进行了介绍。 书中C的历史、语言特性、声明、数组、指针、链接、运行时、内存以及如何进一步学习C++等问题进行了细致的讲解和深入的分析。全书撷取几十个实例进行讲解,对C程序员具有非常高的实用价值。 本书可以帮助有一定经验的C程序员成为C编程方面的专家,对于具备相当的C语言基础的程序员,本书可以帮助他们......一起来看看 《C专家编程》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具