设计一个可商用的PHP API开发架构,方便复用
设计一个可商用的PHP API开发架构需要考虑多个方面,包括代码组织、性能、安全性、可扩展性和易用性。以下是一个高层次的设计方案,涵盖了这些方面:
/project-root
/app
/Controllers
/Models
/Services
/Repositories
/config
/public
index.php
/routes
api.php
/storage
/tests
/vendor
.env
composer.json
README.md
在项目根目录下创建composer.json
文件,并添加必要的依赖:
{
"require": {
"php": ">=7.4",
"slim/slim": "^4.0",
"slim/psr7": "^1.0",
"monolog/monolog": "^2.0",
"vlucas/phpdotenv": "^5.0",
"illuminate/database": "^8.0"
},
"autoload": {
"psr-4": {
"App\\": "app/"
}
}
}
然后运行composer install
来安装依赖。
在routes/api.php
中定义API路由:
use Slim\Factory\AppFactory;
require __DIR__ . '/../vendor/autoload.php';
$app = AppFactory::create();
$app->addRoutingMiddleware();
$errorMiddleware = $app->addErrorMiddleware(true, true, true);
require __DIR__ . '/../app/Controllers/UserController.php';
$app->group('/api', function ($group) {
$group->get('/users', 'App\Controllers\UserController:getAllUsers');
$group->get('/users/{id}', 'App\Controllers\UserController:getUserById');
$group->post('/users', 'App\Controllers\UserController:createUser');
$group->put('/users/{id}', 'App\Controllers\UserController:updateUser');
$group->delete('/users/{id}', 'App\Controllers\UserController:deleteUser');
});
$app->run();
在app/Controllers/UserController.php
中定义控制器:
namespace App\Controllers;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use App\Services\UserService;
class UserController {
private $userService;
public function __construct() {
$this->userService = new UserService();
}
public function getAllUsers(Request $request, Response $response, $args) {
$users = $this->userService->getAllUsers();
$response->getBody()->write(json_encode($users));
return $response->withHeader('Content-Type', 'application/json');
}
// 其他方法类似
}
在app/Services/UserService.php
中定义服务层:
namespace App\Services;
use App\Repositories\UserRepository;
class UserService {
private $userRepository;
public function __construct() {
$this->userRepository = new UserRepository();
}
public function getAllUsers() {
return $this->userRepository->getAllUsers();
}
// 其他方法类似
}
在app/Repositories/UserRepository.php
中定义仓储层:
namespace App\Repositories;
use Illuminate\Database\Capsule\Manager as DB;
class UserRepository {
public function __construct() {
$this->db = new DB();
$this->db->addConnection([
'driver' => 'mysql',
'host' => getenv('DB_HOST'),
'database' => getenv('DB_DATABASE'),
'username' => getenv('DB_USERNAME'),
'password' => getenv('DB_PASSWORD'),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
]);
$this->db->setAsGlobal();
$this->db->bootEloquent();
}
public function getAllUsers() {
return $this->db->table('users')->get();
}
// 其他方法类似
}
在config
目录下创建配置文件,并使用vlucas/phpdotenv
加载环境变量。在项目根目录下创建.env
文件:
DB_HOST=localhost
DB_DATABASE=your_database
DB_USERNAME=your_username
DB_PASSWORD=your_password
在public/index.php
中加载环境变量:
require __DIR__ . '/../vendor/autoload.php';
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__ . '/../');
$dotenv->load();
require __DIR__ . '/../routes/api.php';
使用monolog/monolog
进行日志记录。在app/Services/UserService.php
中添加日志记录:
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
class UserService {
private $userRepository;
private $logger;
public function __construct() {
$this->userRepository = new UserRepository();
$this->logger = new Logger('user_service');
$this->logger->pushHandler(new StreamHandler(__DIR__ . '/../../storage/logs/app.log', Logger::DEBUG));
}
public function getAllUsers() {
$this->logger->info('Fetching all users');
return $this->userRepository->getAllUsers();
}
// 其他方法类似
}
在tests
目录下编写单元测试,使用PHPUnit进行测试。
使用Swagger或API Blueprint生成API文档,方便开发者使用。
通过以上步骤,你可以构建一个可商用的PHP API开发���构,方便复用和扩展。