Laravel 源码分析系列 —— 单一入口

单一入口

单一入口的概念其实很好理解,我们可以把整个应用想象为一个黑色的盒子,整个盒子只有一个入口,这个入口由一个文件把守,它要求所有的请求必须通过这个入口文件检验才能进入。

在聊单一入口的应用之前,我们先来看一看传统应用的多入口模式,这里我们参考一下 ECSHOP 的网站根目录的部分目录结构:

- article.php 文章内容          
- article_cat.php文章分类     
- auction.php 拍卖前台文件    
- brand.php 品牌列表     
- captcha.php 生成验证码     
- catalog.php 列出所以分类及品牌   
- category.php 商品分类 
- comment.php 提交用户评论          
- compare.php 商品比较程序      
- cycle_image.php   轮播图片程序        
- feed.php RSS Feed 生成程序   
- flow.php 购物流程      
- gallery.php 商品相册          
- goods.php 商品详情     
- goods_script.php 生成商品列表          
- group_buy.php 团购商品前台文件    
- index.php 首页文件         
- myship.php 支付配送DEMO       
- pick_out.php 选购中心  
- receive.php 处理收回确认的页面
- index.php 首页文件 

你可以看到上述目录就是网站的根目录,这个目录下存放着相应页面的响应代码,如果我们想要访问首页,我们就在网址中访问 index.php,如果我们想要访问商品页,那么我们就需要访问 goods.php 文件,这就是传统应用的多入口模式,我们可以通过不同的文件入口来得到应用响应。

谈到这里,你应该意识到了 网站的根目录应用的根目录 是两个不同的定义,我们还是回到 Laravel 中吧,Laravel 应用的根目录下包含了多个目录,其目录结构如下:

- app
- bootstrap
- config
- database
- public
  - index.php
- resources
- storage
- tests
- vendor

这其中 public 目录才是网站的根目录,index.php 就是整个应用的守卫,它需要视察所有进入应用的请求。

单一入口的优势

聊到这里,你一定会有所疑惑,Laravel 为何要采用单一入口的模式,这种单一入口有什么优势?ok,别着急,我们将会一一谈起。

如果说这种单一入口目录结构的优势,那么我们不得不提及应用核心代码与静态资源的分离,你看,使用这种方式,我们可以非常完美的将服务端核心代码与静态资源完全分离开来,这就意味着如果你想要访问 public 目录外的资源都必须要经过守卫的审查。这就为统一的安全性提供了便利。

我曾经见到过这么一个有趣的情况,某人在 ECSHOP 程序的配置文件目录下拷贝了一份配置并重命名为 config.php.bak,原意可能是为了防止自己忘记数据库的密码,但是这就意味着任何用户都可以通过浏览器访问到这个文件了,因为对于 Nginx 或者 Apache 来说这些 HTTP 请求只要路径正确,如果不是 PHP 程序的话,他们就会以静态资源的方式进行输出,当然,这只是个个例,但却足以让你明白动静分离的好处了。

那么我们现在穿透到黑盒的内部看一下,如果说黑盒是一个工厂,守卫把一个请求交由工厂来处理,那么它一定需要通过一定的流程来产出一个响应。那么它的流程一般是这样的:

  • 初始化应用所需的模块资源
  • 根据不同的请求类型将其导向相应的业务
  • 业务处理
  • 返回响应

那么我们应该可以看出,其实单一入口最大的优势就是规范了开发流程。

我们可能很难想象规范化的流程能带来多大的开发效率上的提升,但是它确实能最大化的提升效率。还记得 DRY(Don't Repeat Yourself) 原则吗?

基于传统的多入口应用中,如果我们想要保存一个用户的认证状态,那么我们一定会使用服务端的 session 功能。所以你会在这些应用的每个牵涉到用户相关的入口页面的 PHP 文件中发现被引入了相关的 session 实现。这样,每次我们增加一个页面就要手动的引入一次,这完全背离的 DRY 原则。

而在单入口应用中,如果抽象度非常高的话,那么我们完全可以把 session 实现抽象为其中的一个中间件,这样,我们也完全可以在请求被守卫进行分发时由程序自动的判断是否需要启用 session 功能,这完全可以是自动化的。

再比如说,如果我们想对应用的请求启用日志功能,那么基于传统的多入口应用,我们需要在每一个入口中都加入日志功能,才能达到记录所有日志的效果,而在单入口应用中我们只需要添加一个日志中间件就可以让它来记录所有的日志了。

你能想象的到吗,对于多入口的应用每当我增加一个入口页面时,我一定不能忘记引入基层的组件库。

PS: 欢迎关注简书 Laravel 专题,也欢迎 Laravel 相关文章的投稿 :)

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

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,662评论 18 139
  • 原文链接 必备品 文档:Documentation API:API Reference 视频:Laracasts ...
    layjoy阅读 8,607评论 0 121
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,170评论 25 707
  • 很久之前,就答应读者推一篇有关对异地恋看法的文章,没有时间,只是借口,没有心情,这倒是个好理由。 说实话,之前做了...
    江南少城主阅读 1,814评论 19 21
  • 今天的行程:可可托海,然后驱车前往北屯 由于昨天连夜赶到可可托海,今天不用早起再赶路,入住的酒店也还算可以,...
    秋果果阅读 103评论 2 3