本文仅供自学记录,参考JohnLui原文章:https://segmentfault.com/a/11...随着PHP标准和Composer包管理的出现工具,普通开发者搭建框架不再难。无论是路由管理,ORM管理,还是视图渲染,都有很多优秀的包可以使用。我们用composer把这些包像搭积木一样一个一个堆叠起来。下面简单实现一个MVC框架,加深对框架的理解。composer创建一个空的composer.json文件。{}或者在空目录下执行:composerinit可以生成如下类型的文件:{"name":"charlie/my_first_framework","description":"MyFirstFramework","type":"project","license":"MIT","authors":[{"name":"Charlie","email":"demo@qq.com"}],"minimum-stability":"dev","require":{}}安装第一个包接下来我们安装一个管理路由的包:noahbuscher/macaw。比这个强大的路由包还有很多,但是为了简单起见,我们选择安装这个包。composerrequirenoahbuscher/macaw当前目录结构为:?demotree.├──composer.json├──composer.lock└──vendor├──autoload.php├──composer│├──ClassLoader.php│├──许可证│├──autoload_classmap.php│├──autoload_namespaces.php│├──autoload_psr4.php│├──autoload_real.php│├──autoload_static.php│└──installed.json└──noahbuscher└──macaw├──LICENSE.md├──Macaw.php├──README.md├──composer.json├──composer.lock└──config├──Web.config└──nginx.confpublic/index.php我们在根目录下新建一个public文件夹,在这个文件夹下新建一个index.php。index.php文件就像一个建筑入口,我们所有的请求都运行index.php。以下是index.php文件的代码://自动加载vendor目录下的包require'../vendor/autoload.php';routes.php此时我们观察index.php,只是vendor下的包都是必须的。除此之外,我什么都没做。那么如何响应各种请求呢?我们需要定义路线。路由有点像快递分拣站,将不同地址的请求分配给不同的控制器处理。然后我们在根目录下创建一个routes文件夹,在这个文件夹下创建一个web.php文件。文件内容:cdpublic>php-Slocalhost:8001当我们访问http://localhost:8001/hello时,就可以看到我们期待的“helloworld”了。在MVC上面,我们只实现了访问一个地址,返回一个字符串。让我们实际构建MVC框架。MVC其实就是Model、View、Controller的缩写。不管怎样,我们先创建三个文件夹,分别是views、models和controllers。使用以下代码创建一个新的controllersHomeController.php文件:这是主页";此外,我们在routes/web.php中添加一个路由:Macaw::get('','App\\Controllers\\HomeController@home');整体代码是:\HomeController@home');金刚鹦鹉::调度();这时候我们的某个controller方法已经绑定了一个route,但是当我们去访问http://localhost:8001的时候,会出现UncaughtError:Class'App\Controllers\HomeController'notfoundinerror。为什么?因为我们还没有加载控制器,所以程序不知道控制器在哪里。我们可以使用composer的classmap方法加载进去。修改composer.json,添加:"autoload":{"classmap":["app/controllers","app/models"]}我们也顺便加载模型。Composerdump-autoload刷新并自动加载模型以连接到数据库。我们创建一个ArticleModel,对应数据库中的一张表。此时,我们首先使用mysql命令行工具创建一个demo_database数据库,其中包含一个articles表。表的结构大致如下:mysql>descarticles;+--------+--------------+------+-----+--------+----------------+|领域|类型|空|键|默认|额外|+--------+------------+-----+-----+--------+--------------+|编号|整数(11)|否|优先级|空|自动递增||标题|变种(256)|是||空|||内容|变种(256)|是||空||+--------+------------+------+-----+--------+---------------+3rowsinset(0.00sec)我们在表中填写数据:mysql>select*fromarticles;+----+-------+------------+|编号|标题|内容|+----+--------+------------+|1|啊啊啊|嘿嘿嘿嘿||2|hhhhh2|heheheheh2eh|+----+--------+------------+2rowsinset(0.00sec)当然我们现在是在填充数据直接通过MySQL的insert命令,我们后续可以通过我们的框架创建一个新的模型。接下来我们要做的就是如何在Model中连接数据库,获取数据库中的数据!本文使用的php7.1,我们使用mysqli连接数据库查询数据:connect_errno){echo"无法连接到Mysql:(".$mysqli->connect_errno.")".$mysqli->connect_error();}$mysqli->set_charset('utf-8');$result=$mysqli->query("SELECT*FROMarticleslimit0,1");$article=$result->fetch_array();如果($文章){回声“
”。$文章['标题']."
";回声“”。$文章['内容']."
";}$mysqli->close();这样我们就可以在controller中使用`Article::first();`查询articles表中的第一篇文章数据,然后通过echo返回给浏览器。"。$文章['标题']."";回声""。$文章['内容']."
";再重写Article.php,去掉echo那两行,直接返回article;然后我们指定要在HomeController中使用的视图:需要目录名(__FILE__)。“/../views/home.php”;}}我们这里的视图层只是和PHPHTML拼接,后面需要实现更复杂的视图时,可以引入模板引擎。对于ORM,我们从一个空文件夹开始,构建了自己的框架。感觉我们没写多少代码。写了好几行代码,唯一觉得麻烦的就是连接数据库查询数据。我们有很多模型。如果我们要增删改查,难道不是要重复连接、查询、插入、删除、更新、关闭连接吗?我们应该将这些功能分包。如何包装?有别人写的包,直接用~当然如果你想自己造轮子,也可以自己实现。我们这里使用illuminate/database:composerrequireilluminate/database然后我们在public/index.php中引入:useIlluminate\Database\Capsule\ManagerasCapsule;require'../vendor/autoload.php';//EloquentORM$capsule=newCapsule();$capsule->addConnection(require'../config/database.php');$capsule->bootEloquent();//路由配置需要'../routes/web.php';当我们连接数据时,我们使用config/database.php这个数据库配置文件。'mysql','host'=>'localhost','database'=>'demo_database','username'=>'root','password'=>'secret','charset'=>'utf8','collat??ion'=>'utf8_general_ci','prefix'=>''];接下来我们可以删除models/Article.php文件中我们写的大部分代码,只需要继承IlluminateDatabaseEloquentModel就可以使用EloquentORM函数: