服务容器、依赖注入、门脸模式

  • 服务容器

容器概念

  用来装一个个实例的对象,比如邮件类。 

IOC控制反转

  IOC(Inversion of Control)控制反转,面向对象,可降低代码之间的耦合度,借助第三方实现具有依赖关系的集合。

  laravel 容器位置:bootstrap/app.php 中

$app = new Illuminate\Foundation\Application(
realpath(__DIR__.'/../')
);
//可通过 public/index.php $app = require_once __DIR__.'/../bootstrap/app.php'; 获取该路径

绑定  $this->app->bind('HelpSpot\API',function($app){return new HelpSpot\API\($app->make('HttpClient'))});
$this->app->singleton('HelpSpot\API',function($app){return new HelpSpot\API\($app->make('HttpClient'))});
解析 $this->app->make('HelpSpot\API');

DI依赖注入

DI依赖注入是一种设计思想,将实例遍历到对象中,laravel通过反射来完成。eg:

public function edit(Post $post){
  return view("post/edit",compact('post'));
}
  • 服务提供者

服务提供注册方法:

  1. register() //所有提供者提供服务之前提供
  2. boot() //所有提供者提供服务之后提供

延迟服务提供配置:

  protected $defer = true;

服务提供位置:

  1. 配置文件:config/app.php providers=>[...]
  2. 框架中固定写好的:eg:注册服务 registerBaseServiceProviders() //position: vendor/laravel/framework/src/Illuminate/Foundation/Application.php
  • 门脸模式

为容器中可用的类提供一种静态的调用方法  eg:\Request::all()

位置:config/app.php

eg:

aliases=>[
'Request' => Illuminate\Support\Facades\Request::class,
...
]

其实,所有的门脸类中只有一个方法,即返回对应的IOC控制反转中的标签

namespace Illuminate\Support\Facades;

/**
* @see \Illuminate\Http\Request
*/
class Request extends Facade
{
/**
* Get the registered name of the component.
*
* @return string
*/
protected static function getFacadeAccessor()
{
return 'request';
}
}
  • 示例分析日志类

查看日志:

tail -f storage/logs/laravel.log

  • 1.容器

vendor/laravel/framework/src/Illuminate/Foundation/Application.php 中找到 registerBaseServiceProviders()方法,追踪到下面方法register(),可看出绑定到 log 字符串

public function register()
{
$this->app->singleton('log', function () {
return $this->createLogger();
});
}
code:
$app = app();               //获取容器
$log = $app->make('log'); //从容器中获取日志类,并解析(找到绑定的过程确定容器中字符串
$log->info("post_index",['data'=>'hello log!']);
  • 2.依赖注入

服务注册名字叫log可在当前文件找出设置的别名,其对应的三个别名都相当于获取log,position:vendor/laravel/framework/src/Illuminate/Foundation/Application.php,

            'log'                  => [\Illuminate\Log\Writer::class, \Illuminate\Contracts\Logging\Log::class, \Psr\Log\LoggerInterface::class],

code:

public function index(\Illuminate\Log\Writer $log){
$log->info('post_index',['data'=>'hello log!']);
}
  • 3.门脸模式:

通过 config/app.php 设置 aliases

 'Request' => Illuminate\Support\Facades\Request::class,

code:

public function index(){
\Log::info('post_info',['data'=>'hello menlian!']);
}

laravel核心思想的更多相关文章

  1. laravel生命周期和核心思想

    工欲善其事,必先利其器.在开发Xblog的过程中,稍微领悟了一点Laravel的思想.确实如此,这篇文章读完你可能并不能从无到有写出一个博客,但知道Laravel的核心概念之后,当你再次写起Larav ...

  2. Laravel 核心概念

    工欲善其事,必先利其器.在开发Xblog的过程中,稍微领悟了一点Laravel的思想.确实如此,这篇文章读完你可能并不能从无到有写出一个博客,但知道Laravel的核心概念之后,当你再次写起Larav ...

  3. 《深入理解Spark:核心思想与源码分析》——SparkContext的初始化(叔篇)——TaskScheduler的启动

    <深入理解Spark:核心思想与源码分析>一书前言的内容请看链接<深入理解SPARK:核心思想与源码分析>一书正式出版上市 <深入理解Spark:核心思想与源码分析> ...

  4. 《深入理解Spark:核心思想与源码分析》(前言及第1章)

    自己牺牲了7个月的周末和下班空闲时间,通过研究Spark源码和原理,总结整理的<深入理解Spark:核心思想与源码分析>一书现在已经正式出版上市,目前亚马逊.京东.当当.天猫等网站均有销售 ...

  5. 《深入理解Spark:核心思想与源码分析》(第2章)

    <深入理解Spark:核心思想与源码分析>一书前言的内容请看链接<深入理解SPARK:核心思想与源码分析>一书正式出版上市 <深入理解Spark:核心思想与源码分析> ...

  6. 《深入理解Spark:核心思想与源码分析》一书正式出版上市

    自己牺牲了7个月的周末和下班空闲时间,通过研究Spark源码和原理,总结整理的<深入理解Spark:核心思想与源码分析>一书现在已经正式出版上市,目前亚马逊.京东.当当.天猫等网站均有销售 ...

  7. 《深入理解Spark:核心思想与源码分析》正式出版上市

    自己牺牲了7个月的周末和下班空闲时间,通过研究Spark源码和原理,总结整理的<深入理解Spark:核心思想与源码分析>一书现在已经正式出版上市,目前亚马逊.京东.当当.天猫等网站均有销售 ...

  8. Hibernate核心思想—ORM机制(一)

    转:http://blog.csdn.net/wanghuan203/article/details/7566518 hibernate是一个采用ORM(Object/Relation Mapping ...

  9. hadoop的核心思想

    hadoop的核心思想 1.1.1. hadoop的核心思想 Hadoop包括两大核心,分布式存储系统和分布式计算系统. 1.1.1.1. 分布式存储 为什么数据需要存储在分布式的系统中哪,难道单一的 ...

随机推荐

  1. Navicat——如何导出所有的查询数据

    前言 很简单就是通过Navicat的查询来查询~ 步骤 真的不要太简单了~ 打开Navicat并点击查询 新建查询 选择对应的连接和库 写入SQL并运行 导出结果 1.选择导出当前的结果 2.选择保存 ...

  2. MYSQL进阶学习笔记八:MySQL MyISAM的表锁!(视频序号:进阶_18-20)

    知识点九:MySQL MyISAM表锁(共享读锁)(18) 为什么会有锁: 打个比方,我们到淘宝买一件商品,商品只有一件库存,这时候如果还有另外一个人也在买,那么如何解决是你买到还是另一个人买到的问题 ...

  3. 让th里面的东西自动换行

    让th里面的东西自动换行 html中的TH里面的文字不管多长,始终是一行,很烦 <th style="word-wrap:break-word;">aaaaaaaaaa ...

  4. 基于jQuery仿淘宝产品图片放大镜特效

    在开发商城的时候,往往会用到图片的放大功能,这里把自己在近期项目中使用的放大镜特效做一下总结(非插件). 放大镜效果 常用的js组件jquery.imagezoom,jquery.jqzoom,jqu ...

  5. Android Studio自动生成带系统签名的apk

    介绍签名的两种方式: 1.signapk.jar命令行方式: 如果你需要开发一个带有系统权限的app,往往需要配置SharedUserId,比如: </pre><pre name=& ...

  6. 【213】IDL函数汇总

    名称 功能说明 类型  语法&举例 IDL_VALIDNAME 判断变量名是否有效,无效返回值为空或者自动修改 函数   DEFSYSV 自定义系统变量,全局变量 过程   MAKE_ARRA ...

  7. GC 和 Full GC 有什么区别?

    GC(或Minor GC):收集 生命周期短的区域(Young area). Full GC (或Major GC):收集生命周期短的区域(Young area)和生命周期比较长的区域(Old are ...

  8. C#(KeyChar和KeyCord值,KeyDown/KeyPress事件区别)

    1. 首先将窗口属性KeyPreview设为true,如果属性对话框中找不到,就直接在代码里添加:2. 添加KeyPress / KeyDown事件: KeyPress 和KeyDown .KeyPr ...

  9. E20180412-hm

    overflow  vt. 溢出,淹没; 挤满,充满; 洋溢; 资源过剩;   n. 泛滥,溢出物; 溢流管; 充溢,过多; 超出额;   vi. 泛滥,溢出; 充溢;

  10. Codeforces686C【dfs】

    题意: n,m<=1e9 设定一天n小时,一小时m分钟, 显示时间的是一个7进制的表, 问你在一天里出现多少个时刻,表中的数字要都不相同. 思路: 因为7进制,显示的数字肯定是0-7之间的. 然 ...