Blogger Information
Blog 30
fans 0
comment 1
visits 22019
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
0221 利用composer组件手撸一个简单的PHP框架
Admin
Original
762 people have browsed it

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
Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:其实路由,模板,视图都有现成组件的, 所以,你只需要一个简单的调用入口就可以组装出一个php框架的
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post