博客列表 >PHP实战案例:利用Composer组件写简单的一个MVC框架

PHP实战案例:利用Composer组件写简单的一个MVC框架

李东亚¹⁸⁰³⁹⁵⁴⁰¹²⁰
李东亚¹⁸⁰³⁹⁵⁴⁰¹²⁰原创
2020年05月20日 23:13:491195浏览

MVC框架案例代码(Composer):

1、目录构架:

2、composer.json代码

  1. {
  2. //自动加载映射
  3. "autoload": {
  4. "psr-4": {
  5. "controllers\\": "app/controllers",
  6. "models\\": "app/models",
  7. "views\\": "app/views",
  8. "core\\": "core"
  9. }
  10. },
  11. //已加载组件版本信息
  12. "require": {
  13. "catfan/medoo": "^1.7",
  14. "league/plates": "^3.3"
  15. }
  16. }

3、控制类代码:

  1. <?php
  2. namespace controllers;
  3. use models\Model;
  4. use views\View;
  5. // 服务容器
  6. // facades
  7. //控制类
  8. class Controller
  9. {
  10. //测试访问类
  11. public function index(){
  12. return "欢迎访问MVC(composer)框架";
  13. }
  14. //访问员工列表的方法
  15. public function home(){
  16. $db=new Model();
  17. $staffs=$db->select('staffs',['id','name','age','sex','position','mobile'],['age[>=]'=>50,'LIMIT'=>[10,10]]);
  18. // printf('<pre>%s</pre>',print_r($staffs,true));
  19. $v=new View('public');
  20. return $v->render('home',['staffs'=>$staffs]);
  21. }
  22. //如果类中没有此方法,直接调用index()方法
  23. public function __call($name, $arguments)
  24. {
  25. return $this->index();
  26. }
  27. }

4、核心类路由类

  1. <?php
  2. namespace core;
  3. use controllers\Controller;
  4. //路由解析器
  5. class Route
  6. {
  7. public function get(){
  8. //判断有误“PATH_INFO”
  9. if(@$_SERVER['PATH_INFO']){
  10. $cm=array_values(array_filter(explode('/',$_SERVER['PATH_INFO'])));
  11. $c=ucfirst(array_shift($cm));
  12. // echo '$class:输出的:'.$class;
  13. $method=array_shift($cm);
  14. //提示:如果用变量来表示类名,实列化前需要加上类的命名空间
  15. $b = 'controllers\\'. $c;
  16. $obj = new $b;
  17. return $obj->$method();
  18. //如果没有PATH_INFO则直接输出默认类和方法
  19. }else{
  20. return (new Controller())->index();
  21. }
  22. }
  23. }

5、入口文件

  1. <?php
  2. use core\Route;
  3. require 'vendor/autoload.php';
  4. echo (new Route())->get();

6、代码运行结果

相关知识总结;

1、composer手撸流程:

  1. 手动创建:composer.json 写入`{}`
  2. 运行`composer install`命令,生成vendor文件(中包含自动加载器autoload.php
  3. 安装composer组件:`composer require catfan/medoo``composer require league/plates`;同时生成composer.lock文件把组件的相关信息写入;
  4. 创建core核心类和app(MVC模型);

2、composer项目组件:

  1. 两个文件:composer.jsoncomposer.lock;
  2. 一个文件夹vendor(autoload.php)

3、composer.json文件(composer dump 运行注册映射):

  1. {
  2. //自动加载映射(手动创建类需要写入映射)
  3. "autoload": {
  4. "psr-4": {
  5. "controllers\\": "app/controllers",
  6. "models\\": "app/models",
  7. "views\\": "app/views",
  8. "core\\": "core"
  9. }
  10. },
  11. //已加载组件版本信息
  12. "require": {
  13. "catfan/medoo": "^1.7",
  14. "league/plates": "^3.3"
  15. }
  16. }

5、composer命令:

命令 作用
composer clear-cache 清除缓存
composer selfupdate 升级composer
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ 切换阿里镜像
composer search包名 搜索(很少使用,一般从网站搜索:)
composer install/require 包名 安装(install从composer.json中加载安装)
composer update 包名 更新组件包
composer remove 包名 移除包
composer dump 自动加载映射
composer create-project 包名 安装目录 安装项目到目录
composer archive 打包组件

关于利用composer组件构建一个框架的总结:

1、关于composer组件是对PHP代码模块化的一种形式,代码封装,再利用;
2、MVC框架整体构架没有变化,只是在MVC的架构中添加了composer组件管理器,来方便添加组件功能;
3、对于框架可以整体理解为三部分:MVC框架部分{app和core}和组件部分{vendor和composer.json、composer.lock}以及入口文件;
4、MVC框架重点理解:命名空间和自动加载之间的关系;往往出问题都在自动加载这块,自动加载出问题:往往跟命名空间、类名称和文件路径不一致导致;注意:\/ 的使用场景
5、MVC框架大体可分为model、view、controller,这三块主要都是类、对象的应用和扩展
6、在使用自动加载时:用变量来表示类名,来实例化类需要加上类的命名空间;
7、类对象中函数return不等同于输出,所有在调用函数时,需要输出函数才能显示在客户端页面中
8、MVC框架中的类,自动加载要依赖composer组件中的自动加载器,所以需要把类(空间名信息)写入composer.json中的autoload字段中psr-4的里面;并执行composer dump生成映射;

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议
李**¹⁸⁰³⁹⁵⁴⁰¹²⁰2020-05-21 14:00:021楼
没有重复提交,是因为我是第十期的学生,第十期作业没完成,跟着第十一期现在学到这里了,就把它补完整,所以才造成两次作业重叠