不使用第三方框架,基于PHP8+Mysql+PSR-4,使用依赖注入容器,设计一个安全稳定可扩展的多应用PHP开发框架
设计一个安全、稳定且可扩展的多应用PHP开发框架是一个复杂的任务。以下是一个基本的框架设计思路,基于PHP 8、MySQL和PSR-4自动加载标准,并使用依赖注入容器。
/my-framework
/app
/Controllers
/Models
/Views
/config
config.php
/core
/Container
Container.php
/Database
Database.php
/Http
Request.php
Response.php
Router.php
/Support
Helpers.php
/public
index.php
/vendor
/autoload.php
composer.json
首先,创建一个 composer.json
文件来管理依赖和自动加载。
{
"autoload": {
"psr-4": {
"App\\": "app/",
"Core\\": "core/"
}
},
"require": {
"php": "^8.0"
}
}
运行 composer install
来生成 vendor/autoload.php
文件。
创建一个简单的依赖注入容器。
// core/Container/Container.php
namespace Core\Container;
class Container
{
protected array $bindings = [];
public function bind(string $abstract, callable $concrete)
{
$this->bindings[$abstract] = $concrete;
}
public function make(string $abstract)
{
if (!isset($this->bindings[$abstract])) {
throw new \Exception("No binding found for {$abstract}");
}
return call_user_func($this->bindings[$abstract], $this);
}
}
创建一个简单的数据库连接类。
// core/Database/Database.php
namespace Core\Database;
use PDO;
class Database
{
protected PDO $pdo;
public function __construct(string $dsn, string $username, string $password)
{
$this->pdo = new PDO($dsn, $username, $password);
$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
public function getPdo(): PDO
{
return $this->pdo;
}
}
创建简单的请求和响应类。
// core/Http/Request.php
namespace Core\Http;
class Request
{
public array $get;
public array $post;
public array $server;
public function __construct()
{
$this->get = $_GET;
$this->post = $_POST;
$this->server = $_SERVER;
}
}
// core/Http/Response.php
namespace Core\Http;
class Response
{
public function send(string $content)
{
echo $content;
}
}
创建一个简单的路由类。
// core/Http/Router.php
namespace Core\Http;
class Router
{
protected array $routes = [];
public function addRoute(string $method, string $path, callable $handler)
{
$this->routes[$method][$path] = $handler;
}
public function dispatch(Request $request, Response $response)
{
$method = $request->server['REQUEST_METHOD'];
$path = $request->server['REQUEST_URI'];
if (isset($this->routes[$method][$path])) {
call_user_func($this->routes[$method][$path], $request, $response);
} else {
$response->send('404 Not Found');
}
}
}
创建一个简单的配置文件。
// config/config.php
return [
'db' => [
'dsn' => 'mysql:host=localhost;dbname=test',
'username' => 'root',
'password' => ''
]
];
创建引导文件来初始化应用。
// public/index.php
require_once __DIR__ . '/../vendor/autoload.php';
use Core\Container\Container;
use Core\Database\Database;
use Core\Http\Request;
use Core\Http\Response;
use Core\Http\Router;
// 加载配置
$config = require __DIR__ . '/../config/config.php';
// 创建依赖注入容器
$container = new Container();
// 绑定数据库
$container->bind(Database::class, function($container) use ($config) {
return new Database(
$config['db']['dsn'],
$config['db']['username'],
$config['db']['password']
);
});
// 创建请求和响应对象
$request = new Request();
$response = new Response();
// 创建路由器
$router = new Router();
// 添加路由
$router->addRoute('GET', '/', function($request, $response) {
$response->send('Hello, World!');
});
// 处理请求
$router->dispatch($request, $response);
app/Controllers
目录中添加控制器类。app/Models
目录中添加模型类。app/Views
目录中添加视图文件。这个框架只是一个基础的实现,实际项目中可能需要更多的功能和优化。希望这个示例能为你提供一个良好的起点。