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 命令行工具, 可以为你创建一些需要的类等, 方便快速开发
  • 显示路由声明

你可能感兴趣的:(laravel5.5框架解析[1]——设计理念)