我将通过从零开始搭建一个共享单车APP项目接口为基础,由浅入深的讲解如果快速地系统地开发一个APP接口
本教程的宗旨是,教大家如何快速开发一个完整项目,对于一些基础或不涉及的知识不会做过多详情讲解,如需详细了解,建议去看相关官方文档
基础框架Phalcon 3.2,官网地址:https://phalconphp.com
文件结构
Phalcon不会强制要求应用程序的开发遵循特定的文件结构。因为它是松散耦合的,你可以实现Phalcon驱动的应用程序,以及使用对你来说最舒服的文件结构。
本教程的目的以此为起点,我们使用以下结构:
API/
├─app // 应用目录
│ ├─config // 配置目录
│ │ config.ini
│ │ config.php
│ │
│ ├─controllers // 控制器目录
│ │ BaseController.php
│ │ IndexController.php
│ │
│ ├─library // 类库目录
│ │ Authentication.php
│ │ Config.php
│ │ Output.php
│ │ Sign.php
│ │ Utils.php
│ │
│ ├─models // 数据库模型目录
│ │ Users.php
│ │
│ └─views // 视图模板目录
│ │ index.phtml
│ │
│ ├─index
│ │ h5.phtml
│ │
│ └─layouts
│ index.phtml
│
├─log // 日志目录
└─public // 入口目录(站点配置根目录)
│ exception.php // 异常处理文件
│ index.php // 入口文件
│
├─css
│ style.css
│
├─fonts
├─images
├─js
└─uploads
demo.png
入口文件(index.php)
你需要创建的第一个文件是public下的index.php文件。这个文件很重要; 因为它作为你的应用程序的基础,用它来控制应用程序的各个方面。 在这个文件中,你可以实现组件的初始化和应用程序的行为。
在这项目中,它负责做以下几件事:
- 设置响应头信息
- 定义常量
- 设置自动加载器
- 配置依赖注入
- 处理应用请求
设置响应头信息
我们接口返回数据类型为JSON,所以需要对响应头做一些预设置
- 指定响应内容类型为JSON, 编码为UTF-8
header("Content-Type:text/json;charset=utf-8;");
- 指定允许其他域名访问, 解决跨域问题,这是设置为“*”,表示允许所有外部域名访问。
header('Access-Control-Allow-Origin:*');
- 设置响应类型,这里为了方便,我采用了常用字的RESTful API的响应设置
header('Access-Control-Allow-Methods:GET,POST,PUT,DELETE,OPTIONS');
定义绝对路径常量
// 定义项目所在目录路径
define('BASE_PATH', dirname(__DIR__));
// 定义日志文件目录路径
define('LOG_PATH', BASE_PATH . '/log');
// 定义应用目录路径
define('APP_PATH', BASE_PATH . '/app');
// 定义应用配置目录路径
define('CONFIG_PATH', APP_PATH . '/config');
// 定义INI配置文件路径
define('INI_CONFIG_PATH', CONFIG_PATH . '/config.ini');
// 定义PHP配置文件路径
define('PHP_CONFIG_PATH', CONFIG_PATH . '/config.php');
异常处理
这里我们引用了一个自己异常处理文件,统一输出错误信息和记录错误日志。详细教程: 自定义异常处理
// 导入自定义异常处理代码
require_once "exception.php";
自动加载器Autoloaders
在引导程序的第一步我们注册一个自动加载器。自动加载器在应用中被用于将类加载为控制器和数据模型。 这里我还加载了自定义类库library。
use Phalcon\Loader;
// 注册自动加载器
$loader = new Loader();
$loader->registerDirs([
APP_PATH . '/controllers/',
APP_PATH . '/models/',
APP_PATH . '/library/', // 加载自定义类库
]);
$loader->register();
依赖管理
这个容器注册phalcon内置的大部分的组件。这样我们就不用一个个去注册这些常用组件了。
use Phalcon\Di\FactoryDefault;
use Phalcon\Mvc\View;
// 创建容器
$di = new FactoryDefault();
在接下来的部分,我们注册了“view”服务向框架指明要从那个目录加载我们的视图文件。因为视图和类不一致,所以我们无法通过一个自动加载器加载视图。
// 设置视图组件
$di->set(
'view',
function () {
$view = new View();
$view->setViewsDir(APP_PATH . '/views/');
return $view;
}
);
初始化请求环境,路由进来的请求,然后分配解析到的动作,最后汇聚所有的返回结果在所有流程结束后将结果返回。
use Phalcon\Mvc\Application;
$application = new Application($di);
// 初始化请求环境
$response = $application->handle();
完整代码
路径:/public/index.php
<?php
// 指定编码
header("Content-Type:text/json;charset=utf-8;");
// 指定允许其他域名访问
header('Access-Control-Allow-Origin:*');
// 响应类型
header('Access-Control-Allow-Methods:GET,POST,PUT,DELETE,OPTIONS');
// 定义绝对路径常量
define('BASE_PATH', dirname(__DIR__));
define('LOG_PATH', BASE_PATH . '/log');
define('APP_PATH', BASE_PATH . '/app');
define('CONFIG_PATH', APP_PATH . '/config');
define('INI_CONFIG_PATH', CONFIG_PATH . '/config.ini');
define('PHP_CONFIG_PATH', CONFIG_PATH . '/config.php');
// 导入自定义异常处理代码
require_once "exception.php";
// 注册自动加载器
use Phalcon\Loader;
$loader = new Loader();
$loader->registerDirs([
APP_PATH . '/controllers/',
APP_PATH . '/models/',
APP_PATH . '/library/',
]);
$loader->register();
// 创建容器
use Phalcon\Di\FactoryDefault;
use Phalcon\Mvc\View;
$di = new FactoryDefault();
// 设置视图组件
$di->set(
'view',
function () {
$view = new View();
$view->setViewsDir(APP_PATH . '/views/');
return $view;
}
);
// 设置基础URL
use Phalcon\Mvc\Url as UrlProvider;
$di->set(
'url',
function () {
$url = new UrlProvider();
$url->setBaseUri('/');
return $url;
}
);
// 初始化请求环境
use Phalcon\Mvc\Application;
$application = new Application($di);
$response = $application->handle();
$response->send();
示例代码下载
链接:https://pan.baidu.com/s/1sm4fdHb 密码:qj7n