用 Composer 开源组件构建本人的 PHP 框架
为什么要构建本人的 PHP 框架?
引荐视频教程:《大型公益实战天龙八部之开发Mini版MVC框架仿糗事百科网站》
此刻的 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 │ └── 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 \Slim\App; 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
就可以看到如下的页面:
这说明框架准确启动了,那么我们如何肯定框架工作正常呢,这里有个简便办法:
<?php use Slim\Http\Request; use Slim\Http\Response; 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
,那么我们就会看到:
测试是成功了,但是我们不克不及把路由和逻辑都写到 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('/', '\App\Http\Controllers\WelcomeController:index');
而我们的操纵器长什么样呢,是这个模样的:
<?php namespace App\Http\Controllers; use Slim\Http\Request; use Slim\Http\Response; 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 \Slim\Container; $app = new \Slim\App($container); return $app;
还记得上面阿谁操纵器继承的基类操纵器吗,那也是我本人写的,里面可以做一些所有操纵器都有大概用的的操纵封装。比方我为了更利便的使用容器,我在基类里初始化了一个容器实例。
<?php namespace App\Http\Controllers; use Interop\Container\ContainerInterface; 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 \Slim\Container($config); $app = new \Slim\App($container); // Service factory for the ORM $container['db'] = function ($container) { $capsule = new \Illuminate\Database\Capsule\Manager; $capsule->addConnection($container['settings']['db']); $capsule->setAsGlobal(); $capsule->bootEloquent(); return $capsule; }; return $app;
然后我们就可以在操纵器中使用 ORM 功效了。
<?php namespace App\Http\Controllers; use App\Models\User; use Illuminate\Database\DatabaseManager; use Illuminate\Support\Facades\DB; use Interop\Container\ContainerInterface; use Slim\Http\Request; use Slim\Http\Response; 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》《PHP7》《PHP8》
以上就是用 Composer 开源组件构建本人的 PHP 框架的具体内容,更多请关注百分百源码网其它相关文章!