不使用第三方开发框架,基于php8+mysql+psr-4,设计一个多应用的PHP开发框架
设计一个多controller =应用的PHP开发 $params框架是一个复杂的['任务,但我们可以controller']; 从基本的结构和核心组件开始。以下是一个 $method简单的框架设计思路,基于PHP = $8、params['method']; $MySQL和PSR-4自动加载标准。
首先,我们controller = "App需要定义一个合理的目录结构:
/my-framework
/\\{$params['app']}\\Controllers\\$controller";
app
/Application1
/Controllers
/Models
/Views
/Application2
/ if (class_exists($controller)) {
Controllers
/Models
/Views
/config
database.php
routes $controller_object = new $.php
/core
/Database
/Http
/Routing
/Support
controller();
/public
if index.php
/ (isvendor
composer.json
_callable([$ .controller_object, $methodhtaccess
使用 Composer 来管理自动])) {
加载和 $依赖controller。在 composer.json
文件_object->$method();
中定义 PSR-4 } 自 else {
动加载:
$method{
not found in "autoloadcontroller $controller";
": {
}
"psr } else {
-4": {
"Core\\": "core/",
"App\\": "app/"
}
},
echo "Controller class "require": {
"php": "^ $controller not found";
}
8. return;
0"
}
}
`` }
}
echo "No`
运行 `composer dump-autoload` 生成自动加载文件。
### 核心组件
#### 1. 数据库连接
在 `core/Database/Connection.php` 中创建一个简单 route matched.";
}
}
<?phpDatabase)
namespace创建一个简单的 Core\Database数据库连接;
use PDO;
use PDOException;
class Connection
{
类。
```php
// core/ private static $instance = null;
private $connection;
private function __construct()
{
$config = require __DIR__ .Database.php
namespace Core;
'/../../config/databaseuse PDO;
use.php';
PDOExceptiontry {
$this;
class->connection = new PDO(
Database {
"mysql: private static $instance = null;
host={$config['host']};dbname={$config['database']}",
$ private $pdo;
privateconfig['username'],
$config['password']
);
$this->connection function __construct->setAttribute(PDO::() {
ATTR_ERRMODE, PDO:: $ERRMODE_EXCEPTION);
config = } catch ( require __PDOException $eDIR__) {
. '/../ dieconfig/config("Database connection faile.php';
d: " try . $e->getMessage {
());
}
$this }
public static function getInstance()->pdo = new PDO($config['
{
if (self::$instance === null) {
selfdsn'], $config['username'], $::$instance = new self();
}
return self::$instance;
}
config[' publicpassword']);
function getConnection()
{
return $this $this->->connection;
pdo-> }
}
在 core/Routing/Router(PDO::ATTR_ERR.php
中创建一个简单的路MODE, PDO::ERRMODE_EXCEPTION);
由类:
<?php } catch (PDOException $e
namespace Core\Routing;
class Router
{
private $routes =) {
[];
public function add($ emethod, $uricho "Database connection failed: " . $e->getMessage();
}
, $action)
{
$this->routes }
public static function getInstance() {
if (self::$[] = compact('method', 'uri', 'action');
}
instance === null) public function dispatch($method, $uri)
{
foreach ($ {
self::$instance = new self();
}
return self::$instance;
}
public function getConnection() {
returnthis->routes as $route) {
if ($route['method'] === $this->pdo;
}
}
创建一个基础控制器类,所有应用 $method && $route['uri'] === $uri) { list($controller, $method) = explode('@', $route['action']); $controller = "App\Controllers\{$controller}"; if (class_exists($controller)) { $controller = new $controller(); if (method_exists($controller, $method)) { return $controller->$method(); } 的控制器都 } } } http_response_code(将继承这个类。
// core/404);
echo "404 Not Found";
}
}
####Controller.php 3 . 控namespace Core;
制器abstract class
在 Controller app/Application1 { protected/Controllers function render($view, $data = []) { extract($data); require __/HomeController.php
中创建一个简单的控制器:
<?DIR__php
. "/../app/{$namespace App\Application1this->app}/Views/$view.php";
}
}
创建一个基础模型类,所有应用\Controllers;
class HomeController { public function index() { echo "Welcome to Application 1!"; } }
#### 的模型都将继承这个类。
```php
4. 配置文件
在 `config/database.php`// core 中/Model.php
定义数据库配置:
```php
<?php
return [
namespace Core;
abstract class Model 'host' => '127 {
protected $db;
public function __construct() {
$.0.0.1',
'database' => 'mythis->db = Database::getInstance()->getConnection();
}
}
_database',
'username' => 'root',
'password'```
=> ''
### 配置文件];
在 `
创建一个简单config/routes的配置.php` 中定义文件来存储路由数据库连接:
php
<?php
use Core\Routing\Router;
$```php
// config/config.php
return [
'router =dsn' => ' new Routermysql:();
$host=router->localhost;dbname=my_database;charset=utf8',
'usernameadd('GET', '/', 'HomeController@index');
return $router;
在 public/index.php' => 'root', 'password' => '' ];
中引导```
创建一个公共入口文件应用:
<?php
来处理所有请求。
```php
// public/indexrequire __DIR__ . '/../vendor/autoload.php';
$router = require __DIR__ . '/../.php
require __DIR__ . '/../vendor/autoload.php';
use Core\Router;
config/routes.php';
$method$router = $_SERVER['REQUEST_METHOD'];
$uri = $_SERVER['REQUEST_URI'];
$router->dispatch($method, $ = new Router();
// 添加路由
$router->add('/', ['app'uri);
为了将 => 'Application1', 'controller' => 'Home所有请求Controller', '重定method'向到 => ' public/index.phpindex']); $router->add('/about', ['app' => '
,在 public/.htaccess
中添加以下内容:
Application1', '```apache RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-fcontroller' => 'HomeController', 'method' => 'about'] Rewrite);
// 解析 URL 并调用相应的控制Cond %{REQUEST_FILENAME} !器和方法 $url = $_SERVER['REQUEST_URI']; $router-d->dispatch RewriteRule ^ index.php($url [Q);
### 示例应用
创建SA,L]
###一个示 总结例应用
以上的控制器和视图是一个。
多应用// appPHP开发/Application1框架的基本/Controllers/结构和HomeController.php
核心组件。这个namespace App\Application1框架可以根据\Controllers;
use Core需要进行\Controller;
class HomeController extends Controller {
protected $app = 'Application1';
public function index() {
$this->render('home', ['message' => '扩展和优化,例如添加中间件、Welcome to Application1!']);
}
public function about() {
视图 $this->渲染render('about',、更多的路 ['message' => 'About Application1']);
}
}
// app由功能等。希望这个示例能帮助你开始构建自己的PHP框架。