Skip to content
本页内容

使用Slim快速构建应用

Slim 是一个用于 PHP 的微框架,适用于构建小型 Web 应用程序和 API。它轻量、简单,并提供了路由、请求处理和响应等基本功能。下面是 Slim 的基本使用介绍:

1. 安装 Slim

首先,你需要使用 Composer 来安装 Slim。确保你已经安装了 Composer,然后在你的项目目录中运行以下命令:

bash
composer require slim/slim:"4.*" slim/psr7

2. 创建基本应用

创建一个基本的 Slim 应用程序非常简单。以下是一个基本示例:

php
<?php

require 'vendor/autoload.php';

use Slim\Factory\AppFactory;

// 创建 Slim 应用实例
$app = AppFactory::create();

// 添加一个示例路由
$app->get('/hello/{name}', function ($request, $response, $args) {
    $name = $args['name'];
    $response->getBody()->write("Hello, $name");
    return $response;
});

// 运行应用
$app->run();

在这个示例中,我们创建了一个简单的应用程序,并定义了一个 GET 路由 /hello/{name}。当用户访问这个路由时,应用程序将返回 "Hello, {name}" 的响应。

3. 路由

Slim 提供了多种 HTTP 方法的路由支持,例如 GET、POST、PUT、DELETE 等。以下是一些路由示例:

php
// GET 路由
$app->get('/users', function ($request, $response, $args) {
    // 获取所有用户的逻辑
    return $response->withJson(['users' => []]);
});

// POST 路由
$app->post('/users', function ($request, $response, $args) {
    // 创建新用户的逻辑
    return $response->withStatus(201);
});

// PUT 路由
$app->put('/users/{id}', function ($request, $response, $args) {
    $id = $args['id'];
    // 更新用户的逻辑
    return $response->withStatus(200);
});

// DELETE 路由
$app->delete('/users/{id}', function ($request, $response, $args) {
    $id = $args['id'];
    // 删除用户的逻辑
    return $response->withStatus(204);
});

4. 中间件

Slim 允许你在请求和响应的过程中添加中间件。中间件可以用于身份验证、日志记录等。

php
// 添加一个全局中间件
$app->add(function ($request, $handler) {
    $response = $handler->handle($request);
    return $response->withHeader('X-Developer', 'YourName');
});

// 仅针对特定路由添加中间件
$app->get('/admin', function ($request, $response, $args) {
    // 管理员页面逻辑
    return $response->getBody()->write("Admin Area");
})->add(function ($request, $handler) {
    // 身份验证逻辑
    $response = $handler->handle($request);
    return $response->withHeader('X-Admin', 'true');
});

5. 请求和响应处理

你可以使用 PSR-7 标准的请求和响应对象来处理 HTTP 请求和响应。

php
$app->post('/upload', function ($request, $response, $args) {
    $uploadedFiles = $request->getUploadedFiles();
    // 处理上传文件的逻辑
    return $response->withStatus(201);
});

6. 错误处理

你可以自定义错误处理器来处理应用中的异常。

php
use Slim\Exception\HttpNotFoundException;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Log\LoggerInterface;

// 自定义404错误处理
$app->setBasePath("/my-app");
$app->addRoutingMiddleware();
$errorMiddleware = $app->addErrorMiddleware(true, true, true);

$errorMiddleware->setErrorHandler(HttpNotFoundException::class, function (Request $request, Throwable $exception, bool $displayErrorDetails, bool $logErrors, bool $logErrorDetails, LoggerInterface $logger) {
    $response = new \Slim\Psr7\Response();
    $response->getBody()->write('Custom 404 Not Found');
    return $response->withStatus(404);
});

小结

Slim 是一个强大且灵活的微框架,适用于快速构建 Web 应用和 API。通过了解和使用路由、中间件、请求和响应处理、错误处理等功能,你可以构建出功能强大的应用程序。更多详细信息可以参考 Slim 官方文档

获取请求参数

在 Slim 框架中,获取请求参数可以通过 PSR-7 标准的请求对象来实现。请求参数包括查询参数(URL 参数)、表单参数和 JSON 数据。下面详细介绍如何获取这些参数:

1. 获取查询参数(URL 参数)

查询参数是 URL 中的键值对,例如 ?name=John&age=30。在 Slim 中,可以通过请求对象的 getQueryParams 方法获取所有查询参数,或通过 getQueryParam 方法获取单个查询参数。

php
$app->get('/users', function ($request, $response, $args) {
    // 获取所有查询参数
    $queryParams = $request->getQueryParams();
    
    // 获取单个查询参数
    $name = $request->getQueryParam('name', 'default_name');
    
    $response->getBody()->write("Name: " . $name);
    return $response;
});

2. 获取表单参数

表单参数通常通过 POST 请求发送。在 Slim 中,可以通过请求对象的 getParsedBody 方法获取所有表单参数,或通过访问解析后的请求体数据来获取单个参数。

php
$app->post('/submit', function ($request, $response, $args) {
    // 获取所有表单参数
    $parsedBody = $request->getParsedBody();
    
    // 获取单个表单参数
    $username = $parsedBody['username'] ?? 'default_user';
    
    $response->getBody()->write("Username: " . $username);
    return $response;
});

3. 获取 JSON 数据

如果请求体是 JSON 数据,可以使用 getParsedBody 方法来解析 JSON 数据。

php
$app->post('/api/data', function ($request, $response, $args) {
    // 获取解析后的 JSON 数据
    $data = $request->getParsedBody();
    
    // 获取 JSON 中的某个字段
    $item = $data['item'] ?? 'default_item';
    
    $response->getBody()->write("Item: " . $item);
    return $response;
});

4. 获取路径参数

路径参数是 URL 路径中的动态部分,例如 /users/{id} 中的 {id}。在 Slim 中,可以通过 $args 参数获取路径参数。

php
$app->get('/users/{id}', function ($request, $response, $args) {
    // 获取路径参数
    $id = $args['id'];
    
    $response->getBody()->write("User ID: " . $id);
    return $response;
});

5. 获取请求头

可以通过 getHeadergetHeaders 方法获取请求头信息。

php
$app->get('/headers', function ($request, $response, $args) {
    // 获取所有请求头
    $headers = $request->getHeaders();
    
    // 获取单个请求头
    $userAgent = $request->getHeader('User-Agent')[0];
    
    $response->getBody()->write("User-Agent: " . $userAgent);
    return $response;
});

6. 获取上传文件

处理文件上传时,可以通过 getUploadedFiles 方法获取上传的文件。

php
$app->post('/upload', function ($request, $response, $args) {
    // 获取所有上传的文件
    $uploadedFiles = $request->getUploadedFiles();
    
    // 获取单个上传文件
    $uploadedFile = $uploadedFiles['file'];
    
    if ($uploadedFile->getError() === UPLOAD_ERR_OK) {
        $filename = moveUploadedFile($uploadedFile);
        $response->getBody()->write("Uploaded: " . $filename);
    } else {
        $response->getBody()->write("Failed to upload file.");
    }
    
    return $response;
});

function moveUploadedFile($uploadedFile)
{
    $baseDirectory = './uploads';
    $dateDirectory = date('Y-m-d');
    $directory = $baseDirectory . DIRECTORY_SEPARATOR . $dateDirectory;

    // 检查目录是否存在,如果不存在则创建
    if (!is_dir($directory)) {
        mkdir($directory, 0755, true);
    }

    $basename = bin2hex(random_bytes(8)); // 生成随机文件名
    $extension = pathinfo($uploadedFile->getClientFilename(), PATHINFO_EXTENSION);
    $filename = sprintf('%s.%0.8s', $basename, $extension);

    $uploadedFile->moveTo($directory . DIRECTORY_SEPARATOR . $filename);

    return '/uploads' . DIRECTORY_SEPARATOR . $dateDirectory . DIRECTORY_SEPARATOR . $filename;
}

通过这些方法,你可以轻松地在 Slim 应用中获取各种类型的请求参数,并进行相应的处理。