anax/proxy

Anax 代理模块,用于静态访问服务容器中的 di 服务。

安装次数: 1,660

依赖: 1

建议者: 0

安全: 0

星标: 0

关注者: 2

分支: 0

开放问题: 0

语言:Makefile

v1.0.2 2018-11-20 16:43 UTC

This package is auto-updated.

Last update: 2024-09-21 21:14:32 UTC


README

Latest Stable Version Join the chat at https://gitter.im/canax/proxy

Build Status CircleCI

Build Status Scrutinizer Code Quality Code Coverage

Maintainability Codacy Badge

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