博客列表 >0221 利用composer组件手撸一个简单的PHP框架

0221 利用composer组件手撸一个简单的PHP框架

Admin
Admin原创
2020年03月01日 15:34:09770浏览

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可以用来加载公共函数库

    接下来正式开始

    在根目录中创建一个入口文件
    1. //框架入口文件
    2. //先引入composer的自动加载器
    3. require __DIR__.DIRECTORY_SEPARATOR.'vendor'.DIRECTORY_SEPARATOR.'autoload.php';
    4. core\Bootstrap::run();
    然后利用核心类库中的Bootstrap来运行这个小框架
    1. namespace core;
    2. use core\View;
    3. use core\Model;
    4. class Bootstrap
    5. {
    6. public static function run()
    7. {
    8. // echo 'hello';
    9. static::parseUrl();
    10. }
    11. //我们需要解析控制器方法以及参数
    12. //路由c为控制器a为控制器方法
    13. protected static function parseUrl()
    14. {
    15. //如果有控制器传入那么就解析
    16. if(filter_has_var(INPUT_GET,'c')){
    17. //如果需要使用公共函数库我们需要在composer.json里面写一个自动加载文件
    18. //获取一下查询字符串
    19. $zfc = filter_input(INPUT_SERVER,'QUERY_STRING');
    20. // $controller = $zfc['c'];
    21. // $action = $zfc['a'];
    22. parse_str($zfc,$params);
    23. // dump($params);
    24. $controller = "web\controller\\".ucfirst($params['c']);
    25. $action = $params['a'];
    26. // array_slice($params,2);
    27. extract(array_slice($params,2));
    28. }else{
    29. //如果没有传入就默认
    30. $controller = "web\controller\Index";
    31. $action = "index";
    32. }
    33. echo call_user_func([(new $controller(new View,new Model('mysql:host=localhost;dbname=xiaoyu', 'root', 'root'))),$action],$id);
    34. }
    35. }
    之后便是MVC的经典操作,控制器去找模型要数据,再叫视图渲染。
    Model
    1. <?php
    2. namespace core;
    3. //自动加载
    4. use Nette\Database\Connection;
    5. use Nette\Database\Table\Selection;
    6. class Model
    7. {
    8. //数据库连接对象
    9. private $database;
    10. //数据库默认表
    11. private $table;
    12. public function __construct($dsn,$user,$psd)
    13. {
    14. $this->database =new Connection($dsn, $user, $psd);
    15. }
    16. //选择数据表
    17. public function table(string $table)
    18. {
    19. $this->table = $table;
    20. //返回对象方便链式结构调用
    21. return $this;
    22. }
    23. //多条数据查询
    24. public function selectAll($table)
    25. {
    26. return $this->table($table)->database->query('SELECT * FROM ' . $this->table);
    27. }
    28. public function getOne($table, $id)
    29. {
    30. return $this->table($table)->database->query('SELECT * FROM ' . $this->table . ' where id=?',$id)->dump();
    31. }
    32. //删除数据
    33. public function delete($table, $id)
    34. {
    35. $this->table($table)->database->query('DELETE FROM ' . $this->table . ' where id=?',$id);
    36. // $this->table($table)->database->where('id',10)->delete();
    37. }
    38. //更新数据
    39. public function update($table,$data,$id)
    40. {
    41. return $this->table($table)->database->query('UPDATE users SET',$data, 'WHERE id = ?', $id);
    42. }
    43. //添加数据
    44. public function insert($table,$data)
    45. {
    46. return $this->table($table)->database->query('INSERT INTO ' . $this->table,$data);
    47. }
    48. }
    View首先找到视图模板->传参->渲染
    1. namespace core;
    2. class View
    3. {
    4. //视图模板
    5. protected $viewFile;
    6. //视图变量
    7. protected $params = [];
    8. //获取模板位置
    9. public function make($filename) : object
    10. {
    11. $this->viewFile = 'view\\'.$filename.'.php';
    12. //返回一个对象方便链式调用
    13. return $this;
    14. }
    15. //分配模板变量
    16. public function with(string $name, $value) : object
    17. {
    18. $this->params[$name] = $value;
    19. return $this;
    20. }
    21. //加载并且渲染模板
    22. public function __toString() : string
    23. {
    24. extract($this->params);
    25. require $this->viewFile;
    26. //欺骗toString使用
    27. return '';
    28. }
    29. }
    controller这是我的控制器部分
    1. namespace web\controller;
    2. use core\View;
    3. use core\Model;
    4. class Test
    5. {
    6. protected $view;
    7. protected $datap;
    8. public function __construct(View $view,Model $data)
    9. {
    10. $this->view = $view;
    11. $this->datap = $data;
    12. }
    13. public function index($params='')
    14. {
    15. return "访问的控制器是".__METHOD__.'你还带了个参'.$params;
    16. }
    17. public function go()
    18. {
    19. $this->datap->delete('users',10);
    20. $people = $this->datap->selectAll('users');
    21. //使用视图进行渲染
    22. return $this->view->make('sjk')->with('people',$people);
    23. }
    24. }
    给大家看一下我的完整目录

    接下来我们只需要访问地址
    传参c=test&a=go即可

    Model是利用了一个组件名叫nette
    composer require nette/database即可安装
    核心使用方法完整简介:https://doc.nette.org/en/3.0/database-core
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议