lhsazevedo/restatic

Laravel 风格的 Facades 用于 PSR11 容器

v3.0.1 2020-12-27 15:19 UTC

This package is auto-updated.

Last update: 2024-08-27 23:37:20 UTC


README

Build Status

Laravel 风格的 Facades(静态代理)用于 PSR11 容器。

class HomeController
{
    public function __invoke()
    {
        // It just works!
        return View::render('home.index', [
            'articles' => DB::query('SELECT * FROM articles')
        ]);
    }
}

要求

PHP 7.2+ 或 8+

使用方法

设置容器

$container = new \DI\Container();
$container->set('db', function () {
    return new PDO('mysql:dbname=testdb;host=127.0.0.1', 'dbuser', 'dbpass');
});

创建静态代理

// app/Facades/DB.php

class DB extends StaticProxy
{
    public static function getInstanceIdentifier()
    {
        return 'db';
    }
}

设置 Facades

$proxyManager = new ProxyManager($container);
$proxyManager->addProxy('DB', DB::class);
$proxyManager->addProxy('View', View::class);
$proxyManager->enable(ProxyManager::ROOT_NAMESPACE_ANY);

概念

  • 静态代理 – 一个静态类,它将静态方法调用代理到其 Proxy Subject 的实例方法。
  • Proxy Subject(实例) – 一个对象实例,存储在 Container 中,与 Static Proxy 相关联。
  • Proxy Manager – 用于将 Static Proxies 关联到 Alias LoaderContainer 的中介对象。
  • Alias – 一个用于将 Static Proxy 类的完全限定类名作为别名的易记类名。
  • Alias Loader – 维护 AliasesStatic Proxies 之间关联的维护者。它被注入到自动加载堆栈中,以处理别名引用。
  • Container – 一个 IoC 容器(例如,Service Locator 或 DIC),提供 Proxy Subject 实例。它必须实现 PSR-11 标准的 ContainerInterface
  • 实例标识符 – 用于从 Container 中获取 Proxy Subject 的标识符。每个 Static Proxy 必须指定获取其 Proxy Subject 所需要的实例标识符。
  • 根命名空间Alias 可以引用的命名空间。这可以配置为全局命名空间(默认)、特定命名空间或 任何 命名空间(即别名可以从任何命名空间工作)。

更多

灵感来源

ReStatic 是基于由 Jeremy Lindblom 创建的出色的包 XStatic。

免责声明

我不会认为自己是 支持反对 使用静态代理接口(或 Laravel 的 "Facades"),但我认为这是一个非常有趣且独特的主意,而且非常酷的是,您可以这样编写代码,并且代码仍然可以工作并可测试。我很想看看开发者,尤其是库和框架开发者,是否能够找到使用这些静态代理接口的方法,但不是 要求 使用它们,以便使他们的项目对更广泛的 PHP 开发者更具吸引力。
Jeremy Lindblom