基于PHP SLIM 框架搭建 RESTful 风格API 示例

来源:互联网 发布:mysql还原数据库 编辑:程序博客网 时间:2024/05/01 23:36

PHP是快速搭建网站的利器,在中小网站有着广泛的应用。Slim是一个PHP微型框架,可以帮你快速创建强劲的Web应用和API。经常有人讨论说那种PHP框架更好,其实这个问题就像语言本身的争论一样,是没有什么标准答案的。就看合适不合适。看到有人说过这么一句话,说PHP的框架也可以按层次或者使用阶段来,比如

最精简系: 类似 Slim Framework    /     功能齐全:类似 CI YII Cake    /  更高级一点的:比如  Laravel 。

今天想简单介绍一下 Slim ,官网自己号称是一个 微型框架 ,就好比 Python 里的 Flask  。 官网原话:Slim is a PHP micro framework that helps you quickly write simple yet powerful web applications and APIs. 


代码片段:

<?phpuse \Psr\Http\Message\ServerRequestInterface as Request;use \Psr\Http\Message\ResponseInterface as Response;require 'vendor/autoload.php';$app = new \Slim\App;$app->get('/hello/{name}', function (Request $request, Response $response) {    $name = $request->getAttribute('name');    $response->getBody()->write("Hello, $name");    return $response;});$app->run();


1. 安装 

1)在系统上安装PHP、MySQL和应用服务器如 apache httpd

2)安装PHP应用包管理器 Composer(类似于自动构建工具,如 JAVA -- Maven Gradle, Python -- PIP Ruby -- GEM 等)

$ curl -sS https://getcomposer.org/installer | php$ mv composer.phar /usr/local/bin/composer#或者比如MAC 下用 brew $ brew tap josegonzalez/homebrew-php  $ brew install josegonzalez/php/composer  

3) 创建你应用所在的目录,然后下载相关slim包

如 /Users/aabb/source/php (或者 D:\phpwebroot) 下创建目录 如 slim 及下级目录 slim\src\public

4)在 slim\src 下执行如下命令,下载依赖包

composer require slim/slim "^3.0"

下载完成后,会看到如下文件

composer.jsoncomposer.lockpublicvendor

5)在 slim/src/public 目录下 创建 index.php ,写入

<?phpuse \Psr\Http\Message\ServerRequestInterface as Request;use \Psr\Http\Message\ResponseInterface as Response;require '../vendor/autoload.php';$app = new Slim\App();//slim application routes$app->get('/', function ($request, $response, $args) { $response->write("Hello, Welcome to Slim Framework!!!"); return $response;});$app->run();~                


6)如果你使用的是apache httpd 应用服务器,请在slim目录下创建 .htaccess, 写入

RewriteEngine onRewriteCond %{REQUEST_FILENAME} !-dRewriteCond %{REQUEST_FILENAME} !-fRewriteRule . index.php [L]

7)在slim/src 目录下执行如下命令

$ php -S localhost:7777  #后面的端口号可以任意设置,只要不冲突
(你也可以将其移动到应用服务器对应的目录,然后配置一个server,具体参见 这里 )

8)打开浏览器,输入 localhost:7777, 可以看到页面上输出了


2. 数据库准备

这里我们以一个简单的员工信息做为示例,在MySQL中某个数据库下创建表 employee ,如

CREATE TABLE IF NOT EXISTS `employee` (  `employee_id` int(11) NOT NULL,  `emp_name` varchar(100) NOT NULL,  `emp_contact` varchar(100) NOT NULL,  `emp_role` varchar(100) NOT NULL) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;  INSERT INTO `employee` (`employee_id`, `emp_name`, `emp_contact`, `emp_role`) VALUES(1, 'Hardik Vyas', '94085xxxxx', 'Web Developer'),(3, 'Raj K Joshi', '996633XXX', 'SEO Master'),(4, 'Ram D Rv', '55555XXX', 'Admin');

3. 程序文件 

1) slim\src\public\lib\mysql.php

<?phpfunction connect_db() {    $server = 'localhost'; // this may be an ip address instead    $user = 'root';    $pass = 'ds332527';    $database = 'rest'; // name of your database    $connection = new mysqli($server, $user, $pass, $database);    return $connection;}?>

2) slim\src\public\dboper.php 

<?phpuse \Psr\Http\Message\ServerRequestInterface as Request;use \Psr\Http\Message\ResponseInterface as Response;require '../vendor/autoload.php';require 'lib/mysql.php';$app = new Slim\App();$app->get('/', 'get_employee');$app->get('/employee/{id}', function($request, $response, $args) {    get_employee_id($args['id']);});$app->post('/employee_add', function($request, $response, $args) {    add_employee($request->getParsedBody());//Request object’s <code>getParsedBody()</code> method to parse the HTTP request });$app->put('/update_employee', function($request, $response, $args) {    update_employee($request->getParsedBody());});$app->delete('/delete_employee', function($request, $response, $args) {    delete_employee($request->getParsedBody());});$app->run(); function get_employee() {    $db = connect_db();    $sql = "SELECT * FROM employee ORDER BY `emp_name`";    $exe = $db->query($sql);    $data = $exe->fetch_all(MYSQLI_ASSOC);    $db = null;    echo json_encode($data);} function get_employee_id($employee_id) {    $db = connect_db();    $sql = "SELECT * FROM employee WHERE `employee_id` = '$employee_id'";    $exe = $db->query($sql);    $data = $exe->fetch_all(MYSQLI_ASSOC);    $db = null;    echo json_encode($data);} function add_employee($data) {    $db = connect_db();    $sql = "insert into employee (emp_name,emp_contact,emp_role)"            . " VALUES('$data[emp_name]','$data[emp_contact]','$data[emp_role]')";    $exe = $db->query($sql);    $last_id = $db->insert_id;    $db = null;    if (!empty($last_id))        echo $last_id;    else        echo false;} function update_employee($data) {    $db = connect_db();    $sql = "update employee SET emp_name = '$data[emp_name]',emp_contact = '$data[emp_contact]',emp_role='$data[emp_role]'"            . " WHERE employee_id = '$data[employee_id]'";    $exe = $db->query($sql);    $last_id = $db->affected_rows;    $db = null;    if (!empty($last_id))        echo $last_id;    else        echo false;} function delete_employee($employee) {    $db = connect_db();    $sql = "DELETE FROM employee WHERE employee_id = '$employee[employee_id]'";    $exe = $db->query($sql);    $db = null;    if (!empty($last_id))        echo $last_id;    else        echo false;} ?>

说明:

1)每个HTTP请求都有一个请求体,它可能是JSON、XML或者其他POST数据数组。这个函数用来机械这些请求参数。

2)看看这段代码,是不是相当简洁,可读性很好

3)use这一句,表示将请求和响应类导入我们的程序。这样我们不用写上长长的名字来引用它

4)接下来我们包含了 vendor/autoload.php -- 这个有Composer自动创建的目录和文件,引入后我们可以自动使用相关依赖文件。

5)最后我们创建 $app 对象, $app->get() 调用我们的第一个 路由 

6)不要忘记在最后调用 $app->run(), 告诉Slim我们已经完成配置,它可以启动和监听了


4. 启动和测试

1) 通过在 src\public 目录下 调用 $ php -S localhost:7777 来启动

2)调用 ,在浏览器栏中输入,测试GET所有员工信息

http://localhost:7777/dboper.php

3)通过其他接口测试工具来测试这些接口,比如postman soapUI 或者火狐浏览器的 RestClient 或 Chrome 的 Advanced Rest Client 插件。


0 0