laravel5.5框架解析[1]——设计理念

laravel5.5框架解析系列文章属于对laravel5.5框架源码分析,如有需要,建议按顺序阅读该系列文章, 不定期更新,欢迎关注

了解框架的一些设计理念,对于快速了解框架实现原理有很大帮助. 这篇文章就来谈一谈吧.

使用容器Container

后面的文章会详细讲解. 容器, 其实就是字面上的意思,用来盛东西的. 这里是用来盛对象的,容器里几乎存了所有你需要全局共享的对象, 你可以随时从容器当中取出使用. 容器能够帮助你自动实例化一些类并保存, 你需要做的只是定义好类,在类的构造函数中声明类所依赖的其他类(通常是一个接口), 当你需要创建这个类的时候, 你不必手动去创建, 框架会传递依赖, 为你new出来. 如果你的类依赖的是一个接口, 你需要事先向框架注册, 你的接口默认用哪个实现类. 这样做的好处是, 当你日后需要更换实现类时,只需要修改注册的部分. 通过容器, 实现了很大程度上的解耦. 举个吃饭的例子

class Person 
{
     function eat()
    {
         $tool = new Chopsticks();
         echo 'eating with ' . $tools->name;
    }
}

interface EatingTool
{
    public $name;
}

class Chopsticks implements EatingTool
{
   public $name = "中国筷子";
}

class Scoop implements EatingTool
{
   public $name = "大勺子";
}

很显然, Person 类对 Chopsticks 类构成了依赖关系, 作为一个person, 你必须要知道筷子是如何创建的, 如果筷子的构造方法发生变更, 那,人必须做出变更. 如果你想换成勺子吃饭, 还得修改 eat 方法, wtf. 那么使用容器的姿势是怎样的呢?

// 修改Person
class Person
{
    protected $eatingTool;
    function __construct(EatingTool $tool)
    {
         $this->eatingTool = $tool;
    }
    function eat()
    {
         echo 'eating with ' . $this->eatingTool->name;
    }
}
// 绑定接口到实现
$container->bind(EatingTool::class, Scoop::class);
//获取实例
$person = $container->make(Person::class);
$person->eat();

可以看到, 使用容器后,Person已经和具体的吃饭工具解耦了, 而且很重要的是, 在后面的流程中, 你也没有创建吃饭工具的实例.这意味着, 你的业务逻辑也将和吃饭工具解耦.

模块化

作为一个web框架, 路由, 认证系统, orm , 视图模板渲染,等基本的东西当然是必不可少的. laravel 把这些拆分为一个个的service, 通过一个叫service provider的类添加到容器当中,组成了完整的web应用. 由于容器的解耦作用, 各模块之间没有依赖. 如果你想要将框架中的某个模块替换成自己实现方式, 你只需要修改service provider. 把你的服务模块加入容器. laravel的模块, 你甚至可以在其他项目中单独使用其中某一个.模块的独立性给框架的构建和框架源码阅读带来了很大的方便

灵活性

模块化其实就是灵活性的体现, 你可以方便地更改框架的核心部分. 如果你读过框架源码. 你会发现它往往把一个逻辑处理过程分得特别细,每一步都写一个方法. 为什么这样做? 为了方便替换逻辑实现. 当某一个步骤(对应到某个类的某个方法)不符合你的需求时, 你可以创建一个继承自这个类的新类, 然后覆盖你想要替换的方法, 最后把你的类绑定到容器

应用类

一个基于laravel构建的项目, 在一次请求中, 首先就会创建一个Application实例,继承自Container类, 包含各种基础服务. 所以说构建一个项目,就是在完成一个Application. 一个应用的生命周期大概就是, index.php被访问->创建容器->注册服务->启动服务-> 创建Request->创建http kernel->调用kernel的handle方法->handle方法把Request经中间件发送到控制器->控制器返回response->response发送到浏览器->后置处理->请求结束.

laravel/framework 目录结构

.
└── Illuminate
    ├── Foundation // 框架核心,最基本的东西,也包含了一些trait
    ├── Support // 帮助性的类,如字符串处理,数组处理等
    ├── Contracts // 框架接口类, 这是框架所依赖的东西, 具体实现模块时不依赖的
    ├── Hashing // 下面这些是独立的服务模块
       .
       .
       .
    └── View

其他

  • 单点入口
  • MVC, 视图模型控制器.不是什么新鲜东西了.
  • Orm 对象关系映射, 把数据库表映射为类, 方便操作数据库.
  • 中间件, 在请求到达控制器之前,先经过中间件, 用来拦截请求或作其他处理
  • artisan 命令行工具, 可以为你创建一些需要的类等, 方便快速开发
  • 显示路由声明
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,656评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,117评论 25 707
  • 原文链接 必备品 文档:Documentation API:API Reference 视频:Laracasts ...
    layjoy阅读 8,607评论 0 121
  • 《一万小时天才理论》里面说,天才是通过激情,精深练习和伯乐指引这三个要素组成,三者缺一不可。那么今天我们就谈谈第一...
    missrainyday阅读 925评论 3 12
  • 我是一个客服,在这个城市最大众的职业,没有之一。我工资不高,没房没车,没有晋升的欲望也没有那条件。我上班路上往返需...
    俞米阅读 437评论 6 11