如今的 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 就能够看到以下的页面:
file
这阐明框架正确启动了,那末咱们怎样确定框架工作失常呢,这里有个简略办法:
<?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,那末咱们就会看到:
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('/', '\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教程》
以上就是用Composer构建属于你的PHP框架的具体内容,更多请存眷资源魔其它相干文章!
标签: php php开发教程 php开发资料 php开发自学 框架
抱歉,评论功能暂时关闭!