「PHP开发APP接口实战002」Phalcon入口文件

我将通过从零开始搭建一个共享单车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,所以需要对响应头做一些预设置

  1. 指定响应内容类型为JSON, 编码为UTF-8
header("Content-Type:text/json;charset=utf-8;");
  1. 指定允许其他域名访问, 解决跨域问题,这是设置为“*”,表示允许所有外部域名访问。
header('Access-Control-Allow-Origin:*');
  1. 设置响应类型,这里为了方便,我采用了常用字的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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345