lhsazevedo / restatic
Laravel 风格的 Facades 用于 PSR11 容器
v3.0.1
2020-12-27 15:19 UTC
Requires
- php: ^7.2|^8
- psr/container: ^1.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.16
- phpunit/phpunit: ^8|^9
This package is auto-updated.
Last update: 2024-08-27 23:37:20 UTC
README
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 Loader 和 Container 的中介对象。
- Alias – 一个用于将 Static Proxy 类的完全限定类名作为别名的易记类名。
- Alias Loader – 维护 Aliases 与 Static 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