前言:
在自己手撸之前,看了视频4遍,还是觉得逻辑不清晰,有点乱,可能是以为接触得少加上基础不行,所以又去搜索了一些相关资料,最后将框架撸出来后,再把逻辑理一下,发现其实都是有规律存在的,并不难
所以,大家一定要:多看多练多去理解,很重要
———————————————————————————
正题:用composer手撸MVC框架(还是用老师的流程)
一,在用composer之前,首先要知道composer的常用指令
1,搜索一个包composer search
2,安装一个包composer require
丨composer install
3,更新一个包composer update
4,删除一个包composer remove
5,依赖打包composer archive
(本次未用)
6,类库映射composer dump
(很重要)
7,生成/更新composer.jsoncomposer init
8,从composer创建项目composer create-project 包 项目目录
二,详细步骤
-创建首页文件,生成composer.json文档,再利用终端指令composer install
生成composer相关文档和目录,其中的autoload.php
就是非常重要的composer自动加载器
-创建核心文件夹,新建文档Bootstrap.php
,在里面设置与文档路径一致的命名空间,并且生成一个和文档名一样的类名
-在composer.json
中设置类库映射,并且执行composer dump
-在Bootstrap.php
这个文档中,进行URL解析,解析出相对应的控制器和方法
-再新建控制器,在控制里面测试视图类和模型类
同时就要新建控制器文件、视图文件类、模型类文件
注意:
-在视图类文件中,需要有以下几步:
1,模板文件
2,模板变量(建立数组)
3,读取模板文件(make方法):给模板文件赋值
4,分配模板变量(with方法):将参数传进数组中,成为关联数组
5,加载模板文件:__toString()
流程:// make —> with —> toString
-在模板类文件里面,需要以下几步:
1,连接对象
2,设置数据表
3,连接数据库:__construct()
4,设置数据表
5,进行是数据库操作
以上是大体的框架流程:
最主要的是要理解composer自动加载原理,这个框架执行顺序和MVC框架的原理
因为代码量较大,以下是关键代码:Bootstrap.php
<?php
//框架启动器
namespace core;
use web\controller\Controller;
use web\controller\Undefined;
class Bootstrap
{
public static function run()
{
// echo '我是框架启动器';
// echo '<hr>';
Bootstrap::parseUrl();
}
// 解析URL里面的控制器和方法
public static function parseUrl()
{
// 获取URL中的字符串
$_SERVER['QUERY_STRING'];
// 以数组的形式解析出来
parse_str($_SERVER['QUERY_STRING'], $url);
// 判断解析出来的URL数据,是自定义控制器还是默认控制器
if (isset($_GET['c'])){
// 生成自定义控制器的类名
$controller = 'web\controller\\' . ucfirst($url['c']);
// 生成自定义控制器的方法名
$action = $url['a'];
// 解析URL中的其他参数
$other = array_filter(array_slice($url, 2));
//$site = php.cn;
extract($other);
}else{
// 如果URL中没有解析到自定义的控制器和方法,则使用默认的控制器和方法
// 默认控制器的类名
$controller = 'web\controller\Undefined';
// 默认控制器的方法名
$action = 'action';
}
// 测试控制器
echo (new $controller)::$action($site);
}
}
Controller.php
<?php
namespace web\controller;
use core\View;
use core\Model;
use function core\dump;
class Controller
{
public static function action()
{
echo '自定义的控制器:' . __METHOD__;
}
public static function study($site)
{
echo '我在:' . $site . ',学习PHP';
}
// 测试视图模板
public static function index()
{
// 实例化视图类
$view = new View();
return $view->make('View')->with('site', 'php.cn');
}
// 测试模型模板
public static function modelTest()
{
// 获取数据
// 实例化模型类
$model = new Model('mysql:host=localhost;dbname=phpedu', 'root', 'root');
// 进行多条查询
$datas= $model->select('staffs');
// 渲染模板
// 实例化视图类
$view = new View();
return $view->make('Model')->with('datas', $datas);
}
}
View
<?php
namespace core;
class View
{
// 模板文件
protected $file;
// 模板变量
protected $params= [];
// 读取模板文件
public function make(string $data) : object
{
$this->file = 'view/' . $data . '.php';
return $this;
}
// 分配模板变量
public function with(string $name, $values) : object
{
$this->params[$name] = $values;
return $this;
}
// 加载并渲染模板
public function __toString() : string
{
// 解析出变量
extract($this->params);
// 加载模板文件
require $this->file;
return ' ';
}
// make --> with --> toString
}
Model
<?php
namespace core;
use Nette\Database\Connection;
class Model
{
// 连接对象
private $database;
// 数据表名称
private $table;
// 连接数据库
public function __construct($dsn, $user, $password)
{
return $this->database = new Connection($dsn, $user, $password);
}
// 设置数据表
public function table(string $table) : object
{
$this->table = $table;
return $this;
}
// 查询数据库信息,多条查询
public function select($table)
{
return $this->table($table)->database->query( 'SELECT * FROM ' . $this->table);
}
// 单条查询
public function one($table, $id)
{
return $this->table($table)->query('SELECT * FROM ' . $this->table. ' WHERE id=? ', $id)->dump();
}
}
谢谢老师审阅!