0

0

用Composer构建属于你的PHP框架

Guanhui

Guanhui

发布时间:2020-05-02 10:09:23

|

3013人浏览过

|

来源于juejin

转载

为什么要构建自己的 php 框架?

现在的 PHP 框架很多,当然不止 PHP ,即使是其他编程语言也有很多框架,这篇文章讲 PHP 框架构建是因为我对 PHP 的生态最为熟悉,但这个方法同样也适用于其他编程语言框架的构建。

框架是为了提升我们的应用开发效率,市面上有很多开源免费的框架给我们使用,我们尽可以拿来用,为什么还要自己构建一个自己的框架呢?原因就在于市面上的开源框架,是给大部分人用的,给通用项目用的,作为框架的开发者是不知道自己的框架使用者的具体业务的,所以开源框架一定是满足大部分人的需求,而且力求能够为开发者提供所有可能用到的功能。

但是对于一个商业项目或者是一个你自己要做的项目也许只能用到框架的很少一部分功能,或者是框架给你提供的东西并不是最符合你自己的需求的,你使用了框架的一部分功能,另一部分根本没用,这样使用框架首先是性能上的损失,一些你根本用不到的功能却要降低你应用的性能显然不合适的。再就是也许框架提供的功能不是你想要的,或者这个功能这个框架提供的并不是符合你需求的,又或者要使用这部分功能必须按照框架开发者制定的规范来使用,这个规范并符合你的开发哲学。

从哪开始?

立即学习PHP免费学习笔记(深入)”;

各种现代编程语言都有自己的包管理工具,PHP 就是 composer ,利用它我们就可以构建属于自己的框架了,并能很好的组织我们的框架。

怎么开始?

我们该怎么开始构建我们自己的框架呢?从零开始吗?这个问题没有标准答案,如果你要做的项目要求很严格,从底层开始就要保证项目架构的最稳定可控,那么建议你从零开始。如果要求不是非常严格那么我们就从那些开发一个应用最基本需要的功能开始,这样的功能谁提供呢?PHP 有很多微框架,这些框架提供开发一个应用最基础的功能,我们可以从这里开始。

首先我们通过 composer init 初始化一个项目:

{
    "name": "dongm2ez/m2ez-framework",
    "description": "a dongm2ez's framework",
    "keywords": ["framework", "m2ez-framework"],
    "license": "MIT",
    "authors": [
        {
            "name": "dongm2ez",
            "email": "dongm2ez@163.com"
        }
    ],
    "require": {}
}

复制代码这就是我得到的一个 composer.json 的描述文件,现在我们就从这里开始。我的目标是构建一个最符合我开发习惯的框架,让我的开发效率最高。

我选择 Slim 框架作为我的框架基础框架,这是一个微框架,我喜欢它,它足够简单,提供了 web 开发 和 API 开发最基础的功能,而且还有一个原因开发这个框架的作者写了一本名为《Modern PHP》的书,这本书颠覆了我对 PHP 这个语言的认知,开始喜欢并乐于使用它。

在引入这个框架之前我还要对 PHP 版本做个限制,从我使用 PHP 从 5.2 开始到现在,PHP 已经发展到 PHP 7.2 了,但是我不想再去使用低版本的 PHP,一个是 PHP 低版本马上将失去官方的支付,另一个是一些 PHP 的新特性我不能使用,而且低版本的性能也是不好的。所以我要将我的框架限制在 PHP 7.0 以上,同时我希望我的框架对中文有更好的支持。

那么我将更新我的框架 composer.json 文件:

{
    "name": "dongm2ez/m2ez-framework",
    "description": "a dongm2ez's framework",
    "keywords": ["framework", "m2ez-framework"],
    "license": "MIT",
    "authors": [
        {
            "name": "dongm2ez",
            "email": "dongm2ez@163.com"
        }
    ],
    "require": {
        "php": ">=7.0.0",
        "ext-mbstring": "*",
        "slim/slim": "^3.0"
    }
}

复制代码这样我就获得了一个最基础的我的框架版本,但是我还没完成,因为我们没有定义我的框架目录结构。我觉得 laravel 框架的目录划分是挺让我喜欢的,但我又不完全喜欢 laravel 的目录结构,我需要对它进行改造。

├── app

│   ├── Helpers.php

│   ├── Http

│   │   └── Controllers

│   └── Models

├── composer.json

└── tests复制代码我这样设置我的目录结构,并更新我的 composer.json:

{
    "name": "dongm2ez/m2ez-framework",
    "description": "a dongm2ez's framework",
    "keywords": ["framework", "m2ez-framework"],
    "license": "MIT",
    "type": "project",
    "authors": [
        {
            "name": "dongm2ez",
            "email": "dongm2ez@163.com"
        }
    ],
    "require": {
        "php": ">=7.0.0",
        "slim/slim": "^3.0"
    },
    "require-dev": {
        "phpunit/phpunit": "~6.0"
    },
    "autoload": {
        "classmap": [
            "app/Models"
        ],
        "psr-4": {
            "App\": "app/"
        },
        "files": [
            "app/Helpers.php"
        ]
    },
    "autoload-dev": {
        "psr-4": {
            "Tests\": "tests/"
        }
    }
}

复制代码这样的框架可以访问吗,显然是不行的,我们还要加一些东西让我们的框架真正可以跑起来,然后在来迭代它。

├── app

│   ├── Helpers.php

│   ├── Http

│   │   └── Controllers

│   └── Models

├── bootstrap

│   ├── app.php

│   └── autoload.php

├── composer.json

├── config

├── public

LangChain
LangChain

一个开源框架,用于构建基于大型语言模型(LLM)的应用程序。

下载

│   └── index.php

├── routers

└── tests复制代码我们将目录结构改造成这样,并编写一些启动框架的代码到相应的文件

// public/index.php

<?php
require __DIR__.'/../bootstrap/autoload.php';
$app = require_once __DIR__.'/../bootstrap/app.php';
$app->run();
// bootstrap/app.php
<?php
$app = new SlimApp;
return $app;
// bootstrap/autoload.php
<?php
define('M2EZ_START', microtime(true));
require __DIR__.'/../vendor/autoload.php';

复制代码然后运行 composer install 安装框架的依赖包,安装完成后我们的目录中就会多出一个 vendor 的目录和 composer.lock 的文件,此时运行 php -S 0.0.0.0:8080 -t public public/index.php 利用 PHP 自带的 web 服务器进行测试,为了这个命令更简单使用,我们可以将这个命令加到 composer.json 的 script 中。

此时访问 127.0.0.1:8080 或 localhost:8080 就可以看到如下的页面:

file

这说明框架正确启动了,那么我们怎么确定框架工作正常呢,这里有个简单方法:

<?php
use SlimHttpRequest;
use SlimHttpResponse;
require __DIR__.'/../bootstrap/autoload.php';
$app = require_once __DIR__.'/../bootstrap/app.php';
$app->get('/hello/{name}', function (Request $request, Response $response) {
    $name = $request->getAttribute('name');
    $response->getBody()->write("Hello, $name");
    return $response;
});
$app->run();

复制代码对 public/index.php 的代码进行修改,此时访问 http://localhost:8080/hello/dongm2ez,那么我们就会看到:

file

测试是成功了,但是我们不能把路由和逻辑都写到 index.php 文件里,因此我们需要代码更好的组织。要让我们的目录规划发挥正在的作用。

为了单独管理路由,我将路由单独写在 routers 文件夹中,在文件夹中我们新建两个 PHP 脚本文件,然后在 public/index.php 中加入两行代码:

<?php
require __DIR__ . '/../bootstrap/autoload.php';
$app = require_once __DIR__ . '/../bootstrap/app.php';
require __DIR__ . '/../routers/web.php';
require __DIR__ . '/../routers/api.php';
$app->run();

复制代码变成这样,这样我就可以单独管理 API 和 WEB 项目的路由了,如果有其他路由就也可以 require 更多路由。

<?php
$app->get('/', 'AppHttpControllersWelcomeController:index');复制代码而我们的控制器长什么样呢,是这个样子的:
<?php
namespace AppHttpControllers;
use SlimHttpRequest;
use SlimHttpResponse;
class WelcomeController extends Controller
{
    public function index(Request $request, Response $response)
    {
        $response->getBody()->write("Hello, world");
        return $response;
    }
}

复制代码我们知道在现代化的框架中,容器会让我们很方便,我们的基础框架 Slim 提供一个容器的实现,当然你也可以使用其他的第三方的,那么这显然是我们想要的结果,不是只能使用框架提供的,我们可以随时换掉框架的功能,换成我们想要的同样功能组件。

使用也很简单,在 app.php 文件中初始化 Slim 框架时将容器实例传递给它就可以了。

<?php
$container = new SlimContainer;
$app = new SlimApp($container);
return $app;

复制代码还记得上面那个控制器继承的基类控制器吗,那也是我自己写的,里面可以做一些所有控制器都有可能用的的操作封装。比如我为了更方便的使用容器,我在基类里初始化了一个容器实例。

<?php
namespace AppHttpControllers;
use InteropContainerContainerInterface;
abstract class Controller
{
    protected $ci;
    public function __construct(ContainerInterface $ci)
    {
        $this->ci = $ci;
    }
}

复制代码现在我已经有了 路由功能,有了控制器功能,还有请求响应的操作,那么作为一个完整的框架那么必须有访问数据库的方法。

我很喜欢 Laravel 提供的数据库 ORM 组件,那么我就决定使用它了,执行 composer require illuminate/database "~5.5",我选择了最新的 Laravel 长期支持版 ORM 。

我们需要此时在 config 文件夹中新添加一个文件 databases.php 文件:

<?php
return [
    'settings' => [
        'db' => [
            'driver' => 'mysql',
            'host' => 'localhost',
            'database' => 'database',
            'username' => 'user',
            'password' => 'password',
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
        ]
    ],
];

复制代码然后修改 public/index.php:

<?php
require __DIR__ . '/../bootstrap/autoload.php';
$config = require __DIR__ . '/../config/databases.php';
$app = require_once __DIR__ . '/../bootstrap/app.php';
require __DIR__ . '/../routers/web.php';
require __DIR__ . '/../routers/api.php';
$app->run();

复制代码修改 bootstrap/app.php:

<?php
$container = new SlimContainer($config);
$app = new SlimApp($container);
// Service factory for the ORM
$container['db'] = function ($container) {
    $capsule = new IlluminateDatabaseCapsuleManager;
    $capsule->addConnection($container['settings']['db']);
    $capsule->setAsGlobal();
    $capsule->bootEloquent();
    return $capsule;
};
return $app;

复制代码然后我们就可以在控制器中使用 ORM 功能了。

<?php
namespace AppHttpControllers;
use AppModelsUser;
use IlluminateDatabaseDatabaseManager;
use IlluminateSupportFacadesDB;
use InteropContainerContainerInterface;
use SlimHttpRequest;
use SlimHttpResponse;
class WelcomeController extends Controller
{
    public function index(Request $request, Response $response)
    {
        /** @var DatabaseManager $db */
        $db = $this->ci->get('db');
        $user = $db->table("user")->first();
        var_dump($user);
        $response->getBody()->write("Hello, world");
        return $response;
    }
}

复制代码那么此时这个框架已经是一个可以开发 API 功能的框架了,如果要开发 Web 站我可能还需要加入渲染模板组件,无论是 twig、Smarty、Haml 还是 Blade,全都看你的喜好了。当然我觉得我做到这里就可以了,够我用了,因为对于前端我更喜欢用 React 或者是 Vue 去实现它。

需要更简便的操作 session、cookie 那么我们也可以添加相应的组件,各种已经有的框架了都提供这样的组件,看看你更喜欢哪一个了,现在你的框架你做主,你想添加什么就可以添加什么组件,经过这样的定制的框架一定是最符合你开发需求的。

我这里只是对已有的组件进行了配置组装,一旦哪天你发现所有的开源组件都满足不了你的需求的时候,因为你对你的框架了解,你可以自己造个轮子给自己的框架用,如果你写的好那么你也会创造出一个极好用的框架,现在最流行的 PHP 框架,你可以看看它的 composer.json 文件,它就是在前人的基础上进行开发维护的,已经有的功能他拿来直接用,觉得别人做的不完善的地方自己造一个轮子给大家用。

而且我这里也没有用到太多的设计模式,你还可以改造你的框架,利用PHP的魔术方法,反射,SPL 等等让你的框架更好,更容易扩展,更容易配置。

总结

框架很神秘吗?看过这篇文章我相信你不会这样觉得了。

造一个框架很难吗,是的很难,因为从 0 到 1 任何事都难,但是我们现在还需要从 0 到 1 吗,基本不需要了!站在巨人身上做事更容易,而且要记住,任何事只有行动起来你就会发现尝试比踌躇不前更好,从小处开始,做小事,有一天这个小事就变成了大事。不积跬步无以至千里。

Laravel 为什么流行,因为作者本是一名 .net 开发者,在使用 CI 框架时萌生了想法要做一个更简洁、灵活的框架,他的思想真的很先进吗,不一定的,其他开发语言早就有了 Laravel 中的功能,它只是在 PHP 中实现了它们。

以上例子其实告诉我们,不要给自己贴标签,人生不设限,你不是 PHP 程序员,你就是开发者,任何开发相关的东西我们都该去了解和掌握,标签只能别人给你贴,不要自己给自己贴。

推荐教程:《PHP教程

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
laravel组件介绍
laravel组件介绍

laravel 提供了丰富的组件,包括身份验证、模板引擎、缓存、命令行工具、数据库交互、对象关系映射器、事件处理、文件操作、电子邮件发送、队列管理和数据验证。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

339

2024.04.09

laravel中间件介绍
laravel中间件介绍

laravel 中间件分为五种类型:全局、路由、组、终止和自定。想了解更多laravel中间件的相关内容,可以阅读本专题下面的文章。

293

2024.04.09

laravel使用的设计模式有哪些
laravel使用的设计模式有哪些

laravel使用的设计模式有:1、单例模式;2、工厂方法模式;3、建造者模式;4、适配器模式;5、装饰器模式;6、策略模式;7、观察者模式。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

772

2024.04.09

thinkphp和laravel哪个简单
thinkphp和laravel哪个简单

对于初学者来说,laravel 的入门门槛较低,更易上手,原因包括:1. 更简单的安装和配置;2. 丰富的文档和社区支持;3. 简洁易懂的语法和 api;4. 平缓的学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

385

2024.04.10

laravel入门教程
laravel入门教程

本专题整合了laravel入门教程,想了解更多详细内容,请阅读专题下面的文章。

140

2025.08.05

laravel实战教程
laravel实战教程

本专题整合了laravel实战教程,阅读专题下面的文章了解更多详细内容。

85

2025.08.05

laravel面试题
laravel面试题

本专题整合了laravel面试题相关内容,阅读专题下面的文章了解更多详细内容。

79

2025.08.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

392

2026.03.04

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

4

2026.03.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 13.2万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.3万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号