一、使用composer中的自动加载功能
1.composer.json的files: 可以加载任意位置的类文件
2. 注册类别名,比如:use blog\Order;
- 在app下的controller下的创建User.php
<?php
namespace app\controller;
class User
{
public static function hello()
{
return __METHOD__;
}
}
- 在lib文件夹里创建Order.php
<?php
namespace blog;
class Order
{
public static function hello()
{
return __METHOD__. '你好';
}
}
- 在lib文件夹里创建Goods.php
<?php
namespace blog;
class Goods
{
public static function hello()
{
return __METHOD__. '商品';
}
}
3.autoload: psr-4: 类的命名空间: 类所在的路径目录 进行绑定, 命名空间最后必须以”\“空间分隔符结尾,这样可以把同名空间下的所有类统一路径
- 同文件夹lib里面的两个php文档,同名空间blog下的不同类,写法:”blog\“: “lib”
- composer.json里面的内容
{
"autoload": {
"psr-4": {
"app\\controller\\": "app/controller",
"blog\\": "lib"
}
},
"require": {
"gregwar/captcha": "^1.1"
}
}
4.composer.json: autoload: classmap: 类映射 , 实现类的批量注册
- 创建demo3.php
<?php
require_once __DIR__ . '/vendor/autoload.php';
// 注册类别名[可选]
use app\controller\User;
use blog\Order;
use blog\Goods;
// 调用类成员
echo User::hello();
echo '<hr>';
// 调用lib/Order::hello()
echo Order::hello();
echo '<hr>';
echo Goods::hello();
二、如何在项目中使用第三方的依赖库/组件,比如登录界面实时生成验证码
1. 创建demo4.php
<?php
// composer自动加载器
require_once __DIR__.'/vendor/autoload.php';
// 注册类,命名空间
use Gregwar\Captcha\CaptchaBuilder;
// 创建验证器类实例/对象
// 生成一个验证码
$captcha = new CaptchaBuilder;
$captcha
->build()
->save('out.jpg')
;
// 获取到验证码
$_SESSION['phrase'] = $captcha->getPhrase();
// 查看一下验证码:
echo '验证码是: ' , $_SESSION['phrase'];
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h3>用户登录</h3>
<div>
<label for="">邮箱:</label>
<input type="email" name="" id="">
</div>
<div>
<label for="">密码:</label>
<input type="password" name="" id="">
</div>
<div>
<label for="">验证码:</label>
<img src="<?php echo $captcha->inline(); ?>" onclick="location.reload()" />
</div>
<div>
<button>提交</button>
</div>
</body>
</html>
2.从第三方https://packagist.org拿到指令
- 复制composer require gregwar/captcha
- 放入VSCode新终端,运行,就会自动生成gregwar文件夹及其它依赖,并在composer.json里自动生成以下代码
"require": {
"gregwar/captcha": "^1.1"
}
三.使用composer快速实现一个迷你的php开发框架,比如数据库列表信息
1.在根目录下创建frame项目,用MVC来做
- M:
Model
使用第三方包实现 - V:
View
使用第三方实现 - C:
Controller
业务逻辑主要是写到控制器中
2.模型与视图包复制与安装,网站:https://packagist.org
- Model指令:
composer require catfan/medoo
- View指令:
composer require league/plates
3.vendor,model, view, composer.json都已经安装准备好了
4.在frame目录下,封装一个框架的核心,名叫core,里面有两个类:Model.php, View.php
- Model.php
<?php
// 模型类
namespace core;
use Medoo\Medoo;
// 继承第三方包:vendor/catfan/src/Medoo.php,在此查看空间
// 创建一个入口文件index.php
class Model extends Medoo
{
// 构造方法: 连接数据库
public function __construct()
{
$options = [
'database_type' => 'mysql',
'database_name' => 'phpedu',
'server' => 'localhost',
'username' => 'root',
'password' => 'melinda123'
];
// 调用父类方法,需要参数是数组,Medoo.php查看
parent::__construct($options);
}
// 自己可以封装一些方法,创建自己的模型方法库
// 获取满足条件的集合中的第一条数据
public function first()
{
}
}
- View.php
<?php
// 视图类
namespace core;
use League\Plates\Engine;
// 继承第三方包:vendor/league/src/Engine.php,在此查看空间
class View extends Engine
{
public $templates;
public function __construct($path)
{
$this->templates = parent::__construct($path);
}
}
5.需要一个入口文件,在frame下创建index.php
<?php
use controllers\UsersController;
use models\UsersModel;
use core\View;
require_once __DIR__ . '/vendor/autoload.php';
// 测试模型
$model =new UsersModel();
// var_dump($model);
// 测试视图
$view = new View('app/views');
// var_dump($view);
// 测试控制器,传参
$controller = new UsersController($model, $view);
// var_dump($controller);
// echo $controller->index();
print_r($controller->select());
6.在frame下创建app文件夹,在这里面写MVC,创建三个文件夹model, view, controllers
- 模型要对应数据表,在文件夹model下创建UsersModel.php
<?php
namespace models;
use core\Model;
// 用户自定义模型通常与一张数据表对应,继承自定义的Model
class UsersModel extends Model
{
public function __construct()
{
parent::__construct();
}
}
- 在文件夹controllers下创建UsersController.php
- 并测试控制器:app/controllers/UsersController.php里面的index()方法
- 得到:controllers\UsersController::index
<?php
namespace controllers;
class UsersController
{
// 将依赖的外部模型和视图对象,使用依赖注入到构造方法中,使它在控制器中共享
public $model = null;
public $view = null;
//构造方法,初始化
public function __construct($model, $view)
{
$this->model = $model;
$this->view = $view;
}
// 用于测试
public function index()
{
return __METHOD__;
}
public function select()
{
// 通过模型获取数据
$users = $this->model->select('users', ['id', 'name','email'], ['id[>=]'=>5, 'LIMIT'=>5]);
// return $users;
// 将数据渲染到模板上(模板赋值),返回结果到模板引擎里了
return $this->view->render('users/list', ['users'=> $users]);
}
}
- 测试的时候,还要在composer.json做映射,共4个映射,用psr-4规则,并用指令composer dumpautoload进行生效
{
"require": {
"catfan/medoo": "^1.7",
"league/plates": "^3.3"
},
"autoload": {
"psr-4": {
"models\\": "app/models",
"views\\": "app/views",
"controllers\\": "app/controllers",
"core\\": "core"
}
}
}
7.在views下面创建users目录,在此下面创建list.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>用户信息</title>
<style>
body {
display: flex;
flex-direction: column;
align-items: center;
}
table {
border-collapse: collapse;
border: 1px solid;
width: 50%;
text-align: center;
}
th,
td {
border: 1px solid;
padding: 5px;
}
tr:first-child {
background-color: #eee;
}
</style>
</head>
<body>
<h3>用户管理系统</h3>
<table>
<tr>
<th>id</th>
<th>姓名</th>
<th>邮箱</th>
<th>操作</th>
</tr>
<!-- 数据渲染 -->
<?php foreach ($users as $user): ?>
<tr>
<td><?=$this->e($user['id'])?></td>
<td><?=$this->e($user['name'])?></td>
<td><?=$this->e($user['email'])?></td>
<td><button>编辑</button><button>删除</button></td>
</tr>
<?php endforeach ?>
</table>
<p>
<a href="">1</a>
<a href="">2</a>
<a href="">3</a>
<a href="">4</a>
<a href="">5</a>
<a href="">6</a>
</p>
</body>
</html>
大体文档结构如下:
总结:
- 创建自己的框架核心代码
core
Model
和View
分别继承第三方的包- 创建自己的应用,按 MVC 框架,并创建属于这个应用的
model, view, controller
- 更新
composer.json
中类的自动映射关系,用autoload,psr-4
规则 - 创建入口文件, 使用
composer
自动加载器进行测试:测试模型,测试视图,测试控制器