我制作了一个具有属性的PHP路由器
#php #php8 #attributes

大家好!!!我总是仇恨者谈论我不知道的语言。他们不知道他们在谈论的语言。为了向他们展示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