anax / proxy
Anax 代理模块,用于静态访问服务容器中的 di 服务。
Requires
- php: ^7.2
Requires (Dev)
- anax/di: ^2.0.0
- phpunit/phpunit: ^7
This package is auto-updated.
Last update: 2024-09-21 21:14:32 UTC
README
Anax 代理是一个静态代理模块,用于访问在 $di
服务容器中可用的框架资源和服务。
基本思路是允许像这样静态访问:Session::start()
。你可以将其视为在 $di->get("session")->start()
的普通方式之上的一层包装。这是一种语法糖。
你可以将其与 Laravel Facade 的实现进行比较。
目录
你还可以阅读此 在线文档。
安装
你可以使用 composer 从 anax/proxy
在 Packagist 上 安装此模块。
composer require anax/proxy
开发
要作为开发者工作,请克隆仓库并通过 make 安装本地环境。然后你可以运行单元测试。
make install
make test
初始化代理工厂
你首先在前端控制器 index.php
中初始化代理工厂。
use Anax\Proxy\ProxyDIFactory; // Add all framework services to $di $di = new Anax\DI\DIFactoryConfig(); $di->loadServices(ANAX_INSTALL_PATH . "/config/di"); // Add anax/proxy access to $id, if available ProxyDIFactory::init($di);
或者像这样,考虑模块是否已安装。
// Add anax/proxy access to $id, if available if (class_exists("\Anax\Proxy\ProxyDIFactory")) { \Anax\Proxy\ProxyDIFactory::init($di); }
服务容器 $di
被注入,并创建一个自动加载器来捕获并动态创建代理类以映射 $di
中的服务。
通过代理使用服务
你首先通过其服务名称定义代理服务类,如下所示。
use \Anax\Proxy\DI\Db;
然后你可以通过静态访问使用它,例如 Db::connect()
,在幕后它转换为 $di->get("db")->connect()
。
这就是它与路由一起使用的方式。
use \Anax\Proxy\DI\Db; use \Anax\Proxy\DI\Router; use \Anax\Proxy\DI\View; use \Anax\Proxy\DI\Page; /** * Show all movies. */ Router::get("movie", function () { $data = [ "title" => "Movie database | oophp", ]; Db::connect(); $sql = "SELECT * FROM movie;"; $res = Db::executeFetchAll($sql); $data["res"] = $res; View::add("movie/index", $data); Page::render($data); });
这里是以 $app
风格编程实现相同路由,并依赖于全局作用域变量 $app
,它是 $di
的代理。
/** * Show all movies. */ $app->router->get("movie", function () use ($app) { $data = [ "title" => "Movie database | oophp", ]; $app->db->connect(); $sql = "SELECT * FROM movie;"; $res = $app->db->executeFetchAll($sql); $data["res"] = $res; $app->view->add("movie/index", $data); $app->page->render($data); });
上面的示例使用 $app
,它本身在幕后执行 $di->get("service")
。
因此,这是一个语法糖的问题,一个可能受到你欢迎或不受欢迎的用户友好层。
相关设计模式
Laravel 有一个类似于 Laravel Facade 的实现。这可能表明它们与 门面设计模式
相关。
有人认为这个实现更像是 代理设计模式
。
还有人认为这是一个 单例设计模式
的实现。
依赖
通过 psr11
通过 psr/container
。
许可
此软件受 MIT 许可。有关详细信息,请参阅 LICENSE.txt。
.
..: Copyright (c) 2018 Mikael Roos, mos@dbwebb.se