Correcting teacher:天蓬老师
Correction status:qualified
Teacher's comments:其实路由,模板,视图都有现成组件的, 所以,你只需要一个简单的调用入口就可以组装出一个php框架的
composer search 包名称
例如 composer search laravel
composer require
| composer install
会自动生成composer文档和目录,并且将包信息写到配置文件中
composer requrie 包
composer require laravel/laravel
composer.json
: 配置文件composer.lock
: 版本锁定vender
目录: 包/依赖包所在的目录实际上只需要拥有composer.json即可使用install
手工修改一个composer.json
composer update
composer remove 包
composer remove gregwar/captcha
composer archive
compposer.json
:自动加载配置项发生了变化的时候,生成新的类库映射关系composer dump-autoload
| composer dump
files
: 系统启动时自动加载的文件composer.json
composer init
composere require
composer create-project laravel/laravel 项目目录
composer create-project laravel/laravel blog
composer install
autoload
中的psr-4
是用来是自动加载器的映射,命名空间中的路径与项目路径所对应。files
可以用来加载公共函数库然后利用核心类库中的Bootstrap来运行这个小框架
//框架入口文件
//先引入composer的自动加载器
require __DIR__.DIRECTORY_SEPARATOR.'vendor'.DIRECTORY_SEPARATOR.'autoload.php';
core\Bootstrap::run();
之后便是MVC的经典操作,控制器去找模型要数据,再叫视图渲染。
namespace core;
use core\View;
use core\Model;
class Bootstrap
{
public static function run()
{
// echo 'hello';
static::parseUrl();
}
//我们需要解析控制器方法以及参数
//路由c为控制器a为控制器方法
protected static function parseUrl()
{
//如果有控制器传入那么就解析
if(filter_has_var(INPUT_GET,'c')){
//如果需要使用公共函数库我们需要在composer.json里面写一个自动加载文件
//获取一下查询字符串
$zfc = filter_input(INPUT_SERVER,'QUERY_STRING');
// $controller = $zfc['c'];
// $action = $zfc['a'];
parse_str($zfc,$params);
// dump($params);
$controller = "web\controller\\".ucfirst($params['c']);
$action = $params['a'];
// array_slice($params,2);
extract(array_slice($params,2));
}else{
//如果没有传入就默认
$controller = "web\controller\Index";
$action = "index";
}
echo call_user_func([(new $controller(new View,new Model('mysql:host=localhost;dbname=xiaoyu', 'root', 'root'))),$action],$id);
}
}
View首先找到视图模板->传参->渲染
<?php
namespace core;
//自动加载
use Nette\Database\Connection;
use Nette\Database\Table\Selection;
class Model
{
//数据库连接对象
private $database;
//数据库默认表
private $table;
public function __construct($dsn,$user,$psd)
{
$this->database =new Connection($dsn, $user, $psd);
}
//选择数据表
public function table(string $table)
{
$this->table = $table;
//返回对象方便链式结构调用
return $this;
}
//多条数据查询
public function selectAll($table)
{
return $this->table($table)->database->query('SELECT * FROM ' . $this->table);
}
public function getOne($table, $id)
{
return $this->table($table)->database->query('SELECT * FROM ' . $this->table . ' where id=?',$id)->dump();
}
//删除数据
public function delete($table, $id)
{
$this->table($table)->database->query('DELETE FROM ' . $this->table . ' where id=?',$id);
// $this->table($table)->database->where('id',10)->delete();
}
//更新数据
public function update($table,$data,$id)
{
return $this->table($table)->database->query('UPDATE users SET',$data, 'WHERE id = ?', $id);
}
//添加数据
public function insert($table,$data)
{
return $this->table($table)->database->query('INSERT INTO ' . $this->table,$data);
}
}
controller这是我的控制器部分
namespace core;
class View
{
//视图模板
protected $viewFile;
//视图变量
protected $params = [];
//获取模板位置
public function make($filename) : object
{
$this->viewFile = 'view\\'.$filename.'.php';
//返回一个对象方便链式调用
return $this;
}
//分配模板变量
public function with(string $name, $value) : object
{
$this->params[$name] = $value;
return $this;
}
//加载并且渲染模板
public function __toString() : string
{
extract($this->params);
require $this->viewFile;
//欺骗toString使用
return '';
}
}
给大家看一下我的完整目录
namespace web\controller;
use core\View;
use core\Model;
class Test
{
protected $view;
protected $datap;
public function __construct(View $view,Model $data)
{
$this->view = $view;
$this->datap = $data;
}
public function index($params='')
{
return "访问的控制器是".__METHOD__.'你还带了个参'.$params;
}
public function go()
{
$this->datap->delete('users',10);
$people = $this->datap->selectAll('users');
//使用视图进行渲染
return $this->view->make('sjk')->with('people',$people);
}
}
composer require nette/database
即可安装