利用 composer 快速搭建一个框架
Framework Interoperability Group(框架可互用性小组),简称 FIG,成立于 2009 年。FIG 最初由几位知名 PHP 框架开发者发起,在吸纳了许多优秀的大脑和强健的体魄后,提出了 PSR-0 到 PSR-4 五套 PHP 非官方规范:
PSR-0 (Autoloading Standard) 自动加载标准
PSR-1 (Basic Coding Standard) 基础编码标准
PSR-2 (Coding Style Guide) 编码风格向导
PSR-3 (Logger Interface) 日志接口
PSR-4 (Improved Autoloading) 自动加载优化标准
1. 命令解释
1.1 初始化
composer init
,按照提示一步一步操作,首先是包名,描述,作者,附加信息,包的内容,协议(是否免费),是否需要安装依赖,是否需要开发者的依赖
PS C:\Users\admin\Desktop\php11\PHP\5.18> composer init
Welcome to the Composer config generator
This command will guide you through creating your composer.json config.
Package name (<vendor>/<name>) [admin/5.18]: nicola/php
Description []: 这是我的第一个框架开发,希望一切顺利
Author [, n to skip]: nicola <1228994040@qq.com>
Minimum Stability []:
Package Type (e.g. library, project, metapackage, composer-plugin) []: library
License []: MIT
Define your dependencies.
Would you like to define your dependencies (require) interactively [yes]? no
Would you like to define your dev dependencies (require-dev) interactively [yes]? no
{
"name": "nicola/php",
"type": "library",
"license": "MIT",
"authors": [
{
"name": "nicola",
"email": "1228994040@qq.com"
}
],
"require": {}
}
Do you confirm generation [yes]? yes
1.2 依赖安装
composer install
:从当前目录读取 composer.lock 文件,处理依赖关系,并安装到 vendor 目录下。如果没有这个文件,就安装 json 的包,并创建 lock
1.3 依赖更新
- composer update:获取依赖的最新版本,升级更新 composer.json 文件;并将这些包的信息写入到 lock 文件
1.4 申明依赖
require
命令增加新的依赖包到当前目录的 composer.json 文件中,生成 vender 文件和 lock
1.5 创建项目
composer create-project laravel/laravel
,在当前目录下创建一个项目,命令后面可以增加自定义的目录,例如composer create-project laravel/laravel blogs
1.6 生成类库映射文件
composer dump-autoload
当修改项目下的 composer.json 的文件,并不一定要运行 composer update 命令进行更新,有的时候可以使用该命令来更新加载器,比如要引用本地自定义的包(不是来自于packagist
)。
{
"autoload": {
"psr-4": {
"controllers\\": "app/controllers"
}
}
}
命令简写
composer dump
2. 快速搭建一个框架
- 框架,就是遵照一定的规范(PHP-FIG),借助他人的轮子,实现快速业务,安全等附加价值。
- 基础准备,创建文件 composer.json 内容如下,进入项目目录下 然后 composer update 或者 composer installe,这样会自动加载
autoload
组件。注意composer.json只能用双引号!
2.1 设计 MVC
- 规划文件夹,在 app 中创建 controllers、models、views 三个文件夹,开始正式踏上 MVC 的征程。
测试控制器
<?php
//命名空间,包名称
namespace controllers;
class StaffsController
{
public function index()
{
return 'Hello,Nicola,php.cn';
}
}
- 访问入口文件测试是否成功
<?php
require 'app/controllers/StaffsController.php';
use controllers\StaffsController;
//控制器已经测试好了
echo (new StaffsController)->index();
echo '<hr>';
测试模型
<?php
namespace models;
class StaffsModel
{
public function index()
{
return 'nicola';
}
}
- 访问入口文件测试是否成功
<?php
require 'vendor/autoload.php';
use controllers\StaffsController;
use models\StaffsModel;
//控制器已经测试好了
echo (new StaffsController)->index();
echo '<hr>';
//测试模型
echo (new StaffsModel)->index();
echo '<hr>';
测试视图
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>员工管理系统</title>
</head>
<body>
<h3>员工管理系统</h3>
</body>
</html>
- 访问入口文件测试是否成功
<?php
require 'vendor/autoload.php';
use controllers\StaffsController;
use core\View;
use models\StaffsModel;
//控制器已经测试好了
echo (new StaffsController)->index();
echo '<hr>';
//测试模型
echo (new StaffsModel)->index();
echo '<hr>';
//视图
echo (new StaffsController)->display();
类库映射composer dump-autoload
- 遵循 psr-4 约定,当前命名空间和当前类所在的文件路径是一一对应的,上面的每一步都需要执行
composer dump-autoload
,让其读取自动加载生效!(关键!关键!关键!)
{
"autoload": {
"psr-4": {
"controllers\\": "app/controllers",
"models\\": "app/models",
"views\\": "app/views",
"core\\": "core"
}
}
}
2.2 引入第三方的模型,视图和组件
模型组件 Medoo
- 申明依赖安装
composer require catfan/medoo
视图组件 plates
- 申明依赖安装
composer require league/plates
熟悉所加载第三方组件的技术文档
- 用别人的东西,第一需要看作者的使用说明书,一般组件都会有相应的说明,或者是官网,作者会介绍具体如何使用。
继承思想,创建核心类库
- 模型和视图需要做成公共类库
- 公共模型,将模型文件直接继承 medoo,然后再调一下父类的初始化方法,在这里须要有一些参数 ,这些参数我们可以通过前面的配置文件来将它直接加载进去。观看官方文档看如何初始化这个类,我们可以直接复制过来进行使用例如:
<?php
namespace core;
use Medoo\Medoo;
//公共模型
class Model extends Medoo
{
//构造方法
public function __construct()
{
$options = [
'database_type' => 'mysql',
'database_name' => 'php',
'server' => 'localhost',
'username' => 'root',
'password' => 'root123456'
];
parent::__construct($options);
}
}
在控制器中初始化 model 类,看一下控制器中是否将模型 use 进去,然后将初始化的 model 类放入一个变量当中,然后输出看看是否能输出数据库的信息,如果有说明链接成功了
如果有报错,记得检查是否已经处理类库映射
- 公共视图,与公共模型同样的操作过程
<?php
namespace core;
use League\Plates\Engine;
//公共视图
class View extends Engine
{
private $templates;
public function __construct($path)
{
$this->$templates = parent::__construct($path);
}
}
- 控制器调用
<?php
//命名空间,包名称
namespace controllers;
class StaffsController
{
public $model;
public $view;
public function __construct($model, $view)
{
$this->model = $model;
$this->view = $view;
}
public function index()
{
return 'Hello,Nicola,php.cn';
}
public function display()
{
include 'app/views/staffs/list.php';
}
public function select()
{
$staffs = $this->model->select('staffs', ['id', 'name', 'position', 'mobile'], ['id[>=]' => 5, 'LIMIT' => 10]);
return $this->view->render('staffs/list', ['staffs' => $staffs]);
}
}
测试框架
<?php
require 'vendor/autoload.php';
use controllers\StaffsController;
use core\View;
use models\StaffsModel;
// 模型处理
$model = new StaffsModel();
// var_dump($model);
//视图
$view = new View('app/views');
// var_dump($view);
//查询
$controller = new StaffsController($model, $view);
// var_dump($controller);
echo $controller->select();
3. 总结
Composer
就是 PHP 框架的未来,框架是为了提升我们的应用开发效率。PHP 语言本身就带有强大的网络功能、文件管理功能和丰富的系统 API,Composer 也只是一段 PHP 脚本而已。从使用框架是为了提高开发效率的角度来看,框架的本质就是路由。