kzykhys/bowl

PHP5.4的另一个依赖注入容器

v1.0.0 2013-11-19 10:09 UTC

This package is not auto-updated.

Last update: 2024-09-24 00:57:29 UTC


README

Latest Stable Version Build Status Coverage Status SensioLabsInsight

  • 管理多个环境(生产/开发/测试...)
  • 管理对象之间的依赖
  • 执行延迟实例化
  • 执行工厂模式
  • 无需外部文件配置依赖
  • 你可以避免在类中使用Singleton/Factory模式

需求

  • PHP5.4+

安装

创建或更新你的composer.json,并运行composer update

{
    "require": {
        "kzykhys/bowl": "1.0"
    }
}

使用方法

定义参数

$bowl = new \Bowl\Bowl();
$bowl['lang'] = 'en';
$bowl['debug'] = true;

定义共享服务

$bowl = new \Bowl\Bowl();

$bowl->share('service_name', function () {
    return new stdClass();
});

var_dump($bowl->get('service_name') === $bowl->get('service_name')); // bool(true)

定义工厂服务

$bowl = new \Bowl\Bowl();

$bowl->factory('service_name', function () {
    return new stdClass();
});

var_dump($bowl->get('service_name') === $bowl->get('service_name')); // bool(false)

定义依赖于其他服务的服务

$bowl = new \Bowl\Bowl();

$bowl->share('driver.mysql', function () {
    return new MysqlDriver();
});

$bowl->share('connection', function () {
    $c = new Connection();
    $c->setDriver($this->get('driver.mysql'));

    return $c;
});

使用标签管理服务集合

$bowl = new \Bowl\Bowl();

$bowl->share('form.type.text', function () {
    return new TextType();
}, ['form.type']);

$bowl->share('form.type.email', function () {
    return new EmailType();
}, ['form.type']);

$bowl->share('form', function () {
    $form = new Form();

    foreach ($this->getTaggedServices('form.type') as $service) {
        $form->addType($service);
    }

    return $form;
});

与环境标志一起工作

use Bowl\Bowl;

$bowl = new Bowl();

// Common parameters
$bowl['lang'] = 'en';

// Production configuration
$bowl->configure('production', function (Bowl $bowl) {
    $bowl['debug'] = false;

    $bowl->share('orm.repository', function () {
        return new EntityRepository();
    });
});

// Development configuration
$bowl->configure('development', function (Bowl $bowl) {
    $bowl['debug'] = true;

    $bowl->share('orm.repository', function () {
        return new MockRepository();
    });
});

// Common services
$bowl->share('orm.manager', function () {
    return new OrmManager($this->get('orm.repository'));
});
$bowl->share('fixture.loader', function () {
    return new Loader($this->get('orm.manager'), $this['debug']);
});

// Set enviroment manually
$bowl->env('production');

// Or using system's environment variable
$bowl->env(getenv('APP_ENV') ? getenv('APP_ENV') : 'production');

真实案例

<?php

require __DIR__ . '/../vendor/autoload.php';

$bowl = new \Bowl\Bowl();

// Set a parameter
$bowl['debug'] = false;

// Shared service
$bowl->share('ciconia.renderer', function () {
    return new \Ciconia\Renderer\HtmlRenderer();
});

// Tagged service
$bowl->share('ciconia.extension.table', function () {
    return new \Ciconia\Extension\Gfm\TableExtension();
}, ['ciconia.extension']);

// This example shows how to manage services using tags
$bowl->share('ciconia', function () {
    $ciconia = new \Ciconia\Ciconia();

    // $bowl is bind to this closure, so you can access $this as Bowl.
    if ($this['debug']) {
        $ciconia = new \Ciconia\Diagnose\Ciconia();
    }

    // Resolve dependencies
    $ciconia->setRenderer($this->get('ciconia.renderer'));

    // All services tagged as "ciconia.extension"
    foreach ($this->getTaggedServices('ciconia.extension') as $extension) {
        $ciconia->addExtension($extension);
    }

    return $ciconia;
});

// Get the object
$ciconia = $bowl->get('ciconia');
echo $ciconia->render('Markdown is *awesome*');

// Create a new instance even if this is a shared object
$ciconia = $bowl->reset('ciconia')->get('ciconia');
echo $ciconia->render('Markdown is *awesome*');

API

管理环境

configure(string $environment, \Closure $closure)

你可以根据生产环境和开发环境等环境标志来配置Bowl。

$bowl = new \Bowl\Bowl();
$bowl->configure('prod', function (\Bowl\Bowl $bowl) {
    $bowl['debug'] = false;
});

env(string $environment)

你必须调用env()来应用其中一个环境。

$bowl = new \Bowl\Bowl();
$bowl->configure('prod', function (\Bowl\Bowl $bowl) {
    $bowl['debug'] = false;
});

$bowl->env('prod');

服务容器

share(string $name, \Closure $closure, [array $tags])

注册共享服务

$bowl = new \Bowl\Bowl();
$bowl->share('logger', function () {
    return new Logger();
});

$bowl->get('logger')->log($message);

factory(string $name, \Closure $closure, [array $tags])

注册工厂服务

$bowl = new \Bowl\Bowl();
$bowl->share('date.now', function () {
    return new \DateTime('now');
});

$bowl->get('date.now')->format('r');

extend(string $name, \Closure $closure)

扩展服务定义

$bowl = new \Bowl\Bowl();
$bowl->share('logger', function () {
    return new Logger();
});

$bowl->extend('logger', function (LoggerInterface $logger) {
    $logger->setPath(__DIR__.'/../app/logs');

    return $logger;
});

$bowl->get('logger')->log($message);

get(string $name)

获取对象

$bowl = new \Bowl\Bowl();
$bowl['debug'] = true;
$bowl->factory('filesystem', function () {
    return new Filesystem();
});
$bowl->share('logger', function () {
    if ($this['debug']) {
        return new ConsoleLogger();
    } else {
        return new FilesystemLogger($this->get('filesystem'));
    }
});

$logger = $bowl->get('logger');

getTaggedServices(string $name)

获取带有标签的服务

$bowl = new \Bowl\Bowl();
$bowl->share('transport.smtp', function () {
    return new SmtpTransport();
}, ['email.transport']);
$bowl->share('transport.sendmail', function () {
    return new SendmailTransport();
}, ['email.transport']);
$bowl->share('mailer', function () {
    $mailer = new Mailer();
    foreach ($this->getTaggedServices('email.transport') as $service) {
        $mailer->addTransport($service);
    }

    return $mailer;
});

$bowl->get('mailer')->send($mimeMessage);

reset(string $name)

重新实例化对象,即使该服务是共享对象。

这是一个不安全的操作

$bowl = new \Bowl\Bowl();
$bowl->share('registry', function () {
    return new Registry();
});

try {
    $bowl->get('registry')->getManager()->flush();
} catch (\Exception $e) {
    $bowl->reset('registry');
}

贡献

请随意分支并发送pull request。

许可证

MIT许可证

作者

Kazuyuki Hayashi (@kzykhys)