大家好!!!我总是仇恨者谈论我不知道的语言。他们不知道他们在谈论的语言。为了向他们展示PHP8能够做什么的一些示例,我创建了一个简单的练习:具有PHP属性的PHP路由器。
创建public
文件夹。我的意思是..一个称为“公共”的文件夹。然后在内部创建一个index.php
文件。并按照本文中的步骤。
属性
首先,...您可以创建PHP类路由。属性很简单。属性语法从#[
和finisci从]
开始。您可以“标记”类,方法,属性,....带有属性。
#[Attribute]
class Route
{
public function __construct(
private string $method = 'GET',
private string $path = '/',
) { }
}
响应类
对于这篇文章而言,这是没有用的,但是我制作了一些视频(意大利语)。而且我刚刚在此处复制并粘贴了代码。该对象的目的是通过一些链接装饰JSON的通用响应。它使网站在帖子结束时变得容易。
class Response
{
public function __construct(private array $json = []) { }
public function getContent()
{
return json_encode(
array_merge(
$this->json,
[
'@link' => [
'http://localhost:8888/',
'http://localhost:8888/info',
'http://localhost:8888/conclusions',
]
]
)
);
}
}
处理程序接口
在某些框架中,我们称它们为控制器。在这里,我只是将他们命名为处理程序。关键是每条路线都会称呼自己的处理程序。
interface Handler {
public function handle(): Response;
}
混凝土处理程序
现在您可以创建一些处理程序,并符合其属性。请注意,有人知道注释。注释只是模拟评论。 PHP属性是由解释器结构和可读的。您可以使用反射获得类属性。
#[Route('GET', '/')]
class HomeContoller implements Handler
{
public function handle(): Response
{
return new Response([
'page' => 'home'
]);
}
}
#[Route('GET', '/info')]
class InfoController implements Handler
{
public function handle(): Response
{
return new Response([
'page' => 'info'
]);
}
}
配置
我还制作了一些配置文件:处理程序的列表,..控制器。没关系。
$routes = [
HomeContoller::class,
InfoController::class,
];
阅读属性
在这里我创建了一个函数。该功能读取一系列处理程序/控制器。对于每个处理程序/控制器,都会获得反射实例,请从实例中获取属性。属性(路由)表示HTTP方法和路径。如果路由对应于处理程序,则处理处理程序。
function router(array $routes): Response {
foreach($routes as $handler) {
$reflection = new ReflectionClass($handler);
$attributes = $reflection->getAttributes(Route::class);
foreach($attributes as $attribute) {
if ($attribute->getArguments()[0] === $_SERVER['REQUEST_METHOD']) {
if ($attribute->getArguments()[1] === $_SERVER['REQUEST_URI']) {
return (new $handler)->handle();
}
}
}
}
}
$response = router($routes);
echo $response->getContent();
运行内置服务
现在您有了惊人的路由器。你可以尝试一下。只需运行
php -s localhost:8888 -t公共
看到它有效。
结论
结论是PHP很棒。很多人不知道。也许他们都知道PHP3。一旦我听到有人说:“哇,.. php也上课了”。所以,..大声笑。
好,..添加一个新的控制器:
#[Route('GET', '/conclusions')]
class ConclusionsController implements Handler
{
public function handle(): Response
{
return new Response([
'message' => 'If you like this post, ... leave a like',
'and' => 'and follow me for more post like this',
]);
}
}
然后更新配置:
$routes = [
HomeContoller::class,
InfoController::class,
ConclusionsController::class,
];
,如果您说意大利语,您可以看到my video on youtub