如何扩展Laravel
时间:2022-06-20
本文章向大家介绍如何扩展Laravel,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
注册服务
向容器中注册服务
// 绑定服务
$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,如:Auth
、Cache
、Log
、Notification
、Queue
、Redis
等等,每个组件都有一个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底层,有一个名为Macroable
的Trait
,凡是引入了Macroable
的类,都支持Macro
和Mixin
的方式扩展,比如Request
、Response
、SessionGuard
、View
、Translator
等等。
Macroable
提供了两个方法,macro
和mixin
,macro
方法可以给类增加一个方法,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');
- Python爬虫(九)_非结构化数据与结构化数据
- Python爬虫(十)_正则表达式
- python爬虫(四)_urllib2库的基本使用
- 投资人榴莲又卖出一枚三拼域名
- python爬虫(五)_urllib2:Get请求和Post请求
- python爬虫(七)_urllib2:urlerror和httperror
- 双拼市场好!米友售出域名chuijia.com
- Elasticsearch--数据索引
- python爬虫(一)_爬虫原理和数据抓取
- 域名tbw.vip一口价58888元交易
- Tomcat服务器+JSP页面+MySQL数据库网站部署
- 一步步教你理解LSTM
- 2017下半年IT行业快速发展的趋势
- 2018年人工智能和机器学习路在何方?听听美国公司怎么做
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC
- HBase NotServingRegionException
- Flink SQL 写入 Hive表的性能问题
- 文件系统索引extent 和 bitmap区别
- MySQL的Bugs
- 对复制实施主键约束
- MySQL如何管理客户端的连接?
- 鸿蒙 Ability 讲解(页面生命周期、后台服务、数据访问)
- MySQL如何管理客户端连接?线程池篇
- 让python装饰器不再晦涩难懂
- Android开发3年,九月份面试12家大厂跳槽成功,我有一些面试经验想分享给你们
- MySQL的防火墙功能
- Java中线程池的参数有几个?
- MySQL企业版备份工具MEB
- python生成器函数的应用场景举例---为copy过程添加进度条显示
- 短网址程序YOURLS安装及配置教程与设置中文