laravel核心思想
服务容器、依赖注入、门脸模式
服务容器
容器概念
用来装一个个实例的对象,比如邮件类。
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'));
}
服务提供者
服务提供注册方法:
- register() //所有提供者提供服务之前提供
- boot() //所有提供者提供服务之后提供
延迟服务提供配置:
protected $defer = true;
服务提供位置:
- 配置文件:config/app.php providers=>[...]
- 框架中固定写好的: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核心思想的更多相关文章
- laravel生命周期和核心思想
工欲善其事,必先利其器.在开发Xblog的过程中,稍微领悟了一点Laravel的思想.确实如此,这篇文章读完你可能并不能从无到有写出一个博客,但知道Laravel的核心概念之后,当你再次写起Larav ...
- Laravel 核心概念
工欲善其事,必先利其器.在开发Xblog的过程中,稍微领悟了一点Laravel的思想.确实如此,这篇文章读完你可能并不能从无到有写出一个博客,但知道Laravel的核心概念之后,当你再次写起Larav ...
- 《深入理解Spark:核心思想与源码分析》——SparkContext的初始化(叔篇)——TaskScheduler的启动
<深入理解Spark:核心思想与源码分析>一书前言的内容请看链接<深入理解SPARK:核心思想与源码分析>一书正式出版上市 <深入理解Spark:核心思想与源码分析> ...
- 《深入理解Spark:核心思想与源码分析》(前言及第1章)
自己牺牲了7个月的周末和下班空闲时间,通过研究Spark源码和原理,总结整理的<深入理解Spark:核心思想与源码分析>一书现在已经正式出版上市,目前亚马逊.京东.当当.天猫等网站均有销售 ...
- 《深入理解Spark:核心思想与源码分析》(第2章)
<深入理解Spark:核心思想与源码分析>一书前言的内容请看链接<深入理解SPARK:核心思想与源码分析>一书正式出版上市 <深入理解Spark:核心思想与源码分析> ...
- 《深入理解Spark:核心思想与源码分析》一书正式出版上市
自己牺牲了7个月的周末和下班空闲时间,通过研究Spark源码和原理,总结整理的<深入理解Spark:核心思想与源码分析>一书现在已经正式出版上市,目前亚马逊.京东.当当.天猫等网站均有销售 ...
- 《深入理解Spark:核心思想与源码分析》正式出版上市
自己牺牲了7个月的周末和下班空闲时间,通过研究Spark源码和原理,总结整理的<深入理解Spark:核心思想与源码分析>一书现在已经正式出版上市,目前亚马逊.京东.当当.天猫等网站均有销售 ...
- Hibernate核心思想—ORM机制(一)
转:http://blog.csdn.net/wanghuan203/article/details/7566518 hibernate是一个采用ORM(Object/Relation Mapping ...
- hadoop的核心思想
hadoop的核心思想 1.1.1. hadoop的核心思想 Hadoop包括两大核心,分布式存储系统和分布式计算系统. 1.1.1.1. 分布式存储 为什么数据需要存储在分布式的系统中哪,难道单一的 ...
随机推荐
- Html5--6-46 渐变效果
Html5--6-46 渐变效果 学习要点 掌握线性渐变和径向渐变的使用 线性渐变: 属性:linear-gradinet(开始位置 角度,起始颜色,终止颜色 ) 开始位置:渐变开始的位置,属性值可以 ...
- 「LuoguP2014」 选课
Description 在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习.现在有N门功课,每门课有个学 ...
- 【JSOI 2014】序列维护
[题目链接] 点击打开链接 [算法] 线段树 注意标记下传 [代码] #include<bits/stdc++.h> using namespace std; #define MAXN 5 ...
- Python实现的一个简单LRU cache
起因:我的同事需要一个固定大小的cache,如果记录在cache中,直接从cache中读取,否则从数据库中读取.python的dict 是一个非常简单的cache,但是由于数据量很大,内存很可能增长的 ...
- bzoj 2836 魔法树 —— 树链剖分
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2836 树链剖分裸题: 写码五分钟,调码两小时,RE不断,狂交二十五遍,终于找到一处小细节—— ...
- 设计模式——模板模式(Template Pattern)
在读Spring源码的时候,发现Spring代码中运用了大量的模板模式,比如根据文件系统目录加载配置文件(FileSystemXmlApplicationContext),类路径加载配置文件(Clas ...
- Java简单高精度合集
第一个Java的算法程序.记得可以使用Alt+'/'自动补全sysout和main之类的. BigInteger在java.math.BigInteger中. import java.math.Big ...
- 洛谷 - P1225 - 黑白棋游戏 - bfs
神奇bug,没有记录pre就show了,找了1个小时. #include <bits/stdc++.h> using namespace std; #define ll long long ...
- hihoCoder扩展欧几里得
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h&g ...
- 用AntDeploy如何更新Agent
AntDeploy AntDeploy是一款开源的一键发布部署工具,目的是代替重复性的发布动作,提高部署效率 1.一键部署iis 2.一键部署windows服务 3.一键部署到Docker 4.支持增 ...