Blogger Information
Blog 145
fans 7
comment 7
visits 164687
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP实战案例:利用Composer组件写简单的一个MVC框架
李东亚¹⁸⁰³⁹⁵⁴⁰¹²⁰
Original
1196 people have browsed it

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生成映射;

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:不要重复提交
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
1 comments
李**¹⁸⁰³⁹⁵⁴⁰¹²⁰ 2020-05-21 14:00:02
没有重复提交,是因为我是第十期的学生,第十期作业没完成,跟着第十一期现在学到这里了,就把它补完整,所以才造成两次作业重叠
1 floor
Author's latest blog post