0221 利用composer组件手撸一个简单的PHP框架
Composer常用指令
1。搜索一个包
composer search 包名称
例如
composer search laravel
2.安装一个包
composer require
|composer install
2.1 composer require
会自动生成composer文档和目录,并且将包信息写到配置文件中
composer requrie 包
- 例如
composer require laravel/laravel
- 在当前项目目录中
composer.json
: 配置文件composer.lock
: 版本锁定vender
目录: 包/依赖包所在的目录
- 如果不是第一次, 会将包/依赖包信息写入composer.json
2.2 composer install
- 前提: 当前目录中存在composer.json, composer.lock
- 直接从composer.json/composer.lock获取依赖包信息并安装/下载它
实际上只需要拥有composer.json即可使用install
3. 更新一个包
手工修改一个
composer.json
composer update
4. 删除一个包
composer remove 包
- 例如:
composer remove gregwar/captcha
5. 依赖打包
composer archive
6. 类库映射
compposer.json
:自动加载配置项发生了变化的时候,生成新的类库映射关系composer dump-autoload
|composer dump
files
: 系统启动时自动加载的文件
7. 生成/更新composer.json
- 手工生成/更新:
composer.json
- 交互方式:
composer init
- 自动方式:
composere require
8. 从composer创建项目
composer create-project laravel/laravel 项目目录
composer create-project laravel/laravel blog
- 项目目录,如果为空,自动将它下载到当前默认的WEB目录
- 如果项目目录不存在 ,会自动创建
这是我的目录
首先我们需要用到的是composer的自动加载器,所以我们需要先在根目录
创建一个composer.json,里面可以什么都木有。然后调用终端输入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);
}
}
Model
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);
}
}
接下来我们只需要访问地址
传参c=test&a=go即可
Model是利用了一个组件名叫nettecomposer require nette/database
即可安装
核心使用方法完整简介:https://doc.nette.org/en/3.0/database-core