MVC框架案例代码(Composer):
1、目录构架:
2、composer.json代码
{
//自动加载映射
"autoload": {
"psr-4": {
"controllers\\": "app/controllers",
"models\\": "app/models",
"views\\": "app/views",
"core\\": "core"
}
},
//已加载组件版本信息
"require": {
"catfan/medoo": "^1.7",
"league/plates": "^3.3"
}
}
3、控制类代码:
<?php
namespace controllers;
use models\Model;
use views\View;
// 服务容器
// facades
//控制类
class Controller
{
//测试访问类
public function index(){
return "欢迎访问MVC(composer)框架";
}
//访问员工列表的方法
public function home(){
$db=new Model();
$staffs=$db->select('staffs',['id','name','age','sex','position','mobile'],['age[>=]'=>50,'LIMIT'=>[10,10]]);
// printf('<pre>%s</pre>',print_r($staffs,true));
$v=new View('public');
return $v->render('home',['staffs'=>$staffs]);
}
//如果类中没有此方法,直接调用index()方法
public function __call($name, $arguments)
{
return $this->index();
}
}
4、核心类路由类
<?php
namespace core;
use controllers\Controller;
//路由解析器
class Route
{
public function get(){
//判断有误“PATH_INFO”
if(@$_SERVER['PATH_INFO']){
$cm=array_values(array_filter(explode('/',$_SERVER['PATH_INFO'])));
$c=ucfirst(array_shift($cm));
// echo '$class:输出的:'.$class;
$method=array_shift($cm);
//提示:如果用变量来表示类名,实列化前需要加上类的命名空间
$b = 'controllers\\'. $c;
$obj = new $b;
return $obj->$method();
//如果没有PATH_INFO则直接输出默认类和方法
}else{
return (new Controller())->index();
}
}
}
5、入口文件
<?php
use core\Route;
require 'vendor/autoload.php';
echo (new Route())->get();
6、代码运行结果
相关知识总结;
1、composer手撸流程:
手动创建:composer.json 写入`{}`空
运行`composer install`命令,生成vendor文件(中包含自动加载器autoload.php)
安装composer组件:`composer require catfan/medoo`和`composer require league/plates`;同时生成composer.lock文件把组件的相关信息写入;
创建core核心类和app(MVC模型);
2、composer项目组件:
两个文件:composer.json、composer.lock;
一个文件夹vendor(autoload.php)
3、composer.json文件(composer dump
运行注册映射):
{
//自动加载映射(手动创建类需要写入映射)
"autoload": {
"psr-4": {
"controllers\\": "app/controllers",
"models\\": "app/models",
"views\\": "app/views",
"core\\": "core"
}
},
//已加载组件版本信息
"require": {
"catfan/medoo": "^1.7",
"league/plates": "^3.3"
}
}
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
生成映射;