跳转到内容

Phalcon依赖注入

注意

所有类都以前缀命名Phalcon

Di\AbstractInjectionAwareAbstract

GitHub上的源码

  • 命名空间

    • Phalcon\Di
  • 使用

    • stdClass
  • 继承

    stdClass

  • 实现

    • InjectionAwareInterface

这个抽象类提供了一个通用的访问DI的方法,适用于任何类。

属性

/**
 * Dependency Injector
 *
 * @var DiInterface
 */
protected $container;

方法

public function getDI(): DiInterface;
返回内部的依赖注入器

public function setDI( DiInterface $container ): void;
设置依赖注入器

Di\Di

GitHub上的源码

  • 命名空间

    • Phalcon\Di
  • 使用

    • Phalcon\Config\Adapter\Php
    • Phalcon\Config\Adapter\Yaml
    • Phalcon\Config\ConfigInterface
    • Phalcon\Di\DiInterface
    • Phalcon\Di\Exception
    • Phalcon\Di\Exception\ServiceResolutionException
    • Phalcon\Di\InitializationAwareInterface
    • Phalcon\Di\InjectionAwareInterface
    • Phalcon\Di\Service
    • Phalcon\Di\ServiceInterface
    • Phalcon\Di\ServiceProviderInterface
    • Phalcon\Events\ManagerInterface
  • 继承

  • 实现

    • DiInterface

Phalcon\Di\Di 是一个实现服务依赖注入/服务定位的组件,同时它本身也是这些服务的容器。

由于Phalcon高度解耦,Phalcon\Di\Di 是整合框架不同组件的核心。开发者可以使用该组件来注入依赖并管理应用中不同类的全局实例。

基本上,这个组件实现了Inversion of Control模式。通过此模式,对象不通过setter或构造函数接收其依赖项,而是通过请求服务依赖注入器。这减少了整体复杂性,因为在组件内获取所需依赖项的方式只有一种。

此外,这种模式增加了代码的可测试性,从而降低了错误发生的可能性。

use Phalcon\Di\Di;
use Phalcon\Http\Request;

$di = new Di();

// Using a string definition
$di->set("request", Request::class, true);

// Using an anonymous function
$di->setShared(
    "request",
    function () {
        return new Request();
    }
);

$request = $di->getRequest();

属性

/**
 * List of registered services
 *
 * @var ServiceInterface[]
 */
protected $services;

/**
 * List of shared instances
 *
 * @var array
 */
protected $sharedInstances;

/**
 * Events Manager
 *
 * @var ManagerInterface|null
 */
protected $eventsManager;

/**
 * Latest DI build
 *
 * @var DiInterface|null
 */
protected static $defaultDi;

方法

public function __call( string $method, array $arguments = [] ): mixed | null;
魔术方法,用于通过setter/getter获取或设置服务。

public function __construct();
Phalcon\Di\Di 构造函数。

public function attempt( string $name, mixed $definition, bool $shared = bool ): ServiceInterface | bool;
尝试在服务容器中注册一个服务,只有当同名服务未被注册时才会成功。

public function get( string $name, mixed $parameters = null ): mixed;
根据配置解析服务。

public static function getDefault(): DiInterface | null;
返回最后创建的DI。

public function getInternalEventsManager(): ManagerInterface | null;
返回内部事件管理器

public function getRaw( string $name ): mixed;
返回服务定义而不进行解析。

public function getService( string $name ): ServiceInterface;
返回一个Phalcon\Di\Service实例。

public function getServices(): ServiceInterface[];
返回在DI中注册的服务。

public function getShared( string $name, mixed $parameters = null ): mixed;
解析服务,解析后的服务将存储在DI中,后续对该服务的请求将返回相同的实例。

public function has( string $name ): bool;
检查DI是否包含某个名称的服务。

public function loadFromPhp( string $filePath ): void;
从php配置文件加载服务。

$di->loadFromPhp("path/services.php");

文件中的服务可以指定如下:

return [
     'myComponent' => [
         'className' => '\Acme\Components\MyComponent',
         'shared' => true,
     ],
     'group' => [
         'className' => '\Acme\Group',
         'arguments' => [
             [
                 'type' => 'service',
                 'service' => 'myComponent',
             ],
         ],
     ],
     'user' => [
         'className' => '\Acme\User',
     ],
];

@link https://docs.phalcon.io/latest/di/

public function loadFromYaml( string $filePath, array $callbacks = null ): void;
从yaml文件加载服务。

$di->loadFromYaml(
    "path/services.yaml",
    [
        "!approot" => function ($value) {
            return dirname(__DIR__) . $value;
        }
    ]
);

文件中的服务可以指定如下:

myComponent:
    className: \Acme\Components\MyComponent
    shared: true

group:
    className: \Acme\Group
    arguments:
        - type: service
          name: myComponent

user:
   className: \Acme\User

@link https://docs.phalcon.io/latest/di/

public function offsetExists( mixed $name ): bool;
使用数组语法检查服务是否已注册。

public function offsetGet( mixed $name ): mixed;
允许使用数组语法获取共享服务。

var_dump($di["request"]);

public function offsetSet( mixed $offset, mixed $value ): void;
允许使用数组语法注册共享服务。

$di["request"] = new \Phalcon\Http\Request();

public function offsetUnset( mixed $name ): void;
使用数组语法从服务容器中移除服务。

public function register( ServiceProviderInterface $provider ): void;
注册一个服务提供者

use Phalcon\Di\DiInterface;
use Phalcon\Di\ServiceProviderInterface;

class SomeServiceProvider implements ServiceProviderInterface
{
    public function register(DiInterface $di)
    {
        $di->setShared(
            'service',
            function () {
                // ...
            }
        );
    }
}

public function remove( string $name ): void;
从服务容器中移除服务,同时也会移除为该服务创建的任何共享实例。

public static function reset(): void;
重置内部默认的DI。

public function set( string $name, mixed $definition, bool $shared = bool ): ServiceInterface;
在服务容器中注册服务。

public static function setDefault( DiInterface $container ): void;
设置一个默认的依赖注入容器,以便在静态方法中获取。

public function setInternalEventsManager( ManagerInterface $eventsManager );
设置内部事件管理器。

public function setService( string $name, ServiceInterface $rawDefinition ): ServiceInterface;
使用原始Phalcon\Di\Service定义设置服务。

public function setShared( string $name, mixed $definition ): ServiceInterface;
在服务容器中注册“始终共享”的服务。

protected function loadFromConfig( ConfigInterface $config ): void;
从Config对象加载服务。

Di\DiInterfaceInterface

GitHub上的源码

  • 命名空间

    • Phalcon\Di
  • 使用

    • ArrayAccess
  • 继承

    ArrayAccess

  • 实现

Phalcon\Di\Di接口。

方法

public function attempt( string $name, mixed $definition, bool $shared = bool ): ServiceInterface | bool;
尝试在服务容器中注册一个服务,只有当同名服务未被注册时才会成功。

public function get( string $name, mixed $parameters = null ): mixed;
根据配置解析服务。

public static function getDefault(): DiInterface | null;
返回最后创建的DI。

public function getRaw( string $name ): mixed;
返回服务定义而不进行解析。

public function getService( string $name ): ServiceInterface;
返回与服务相对应的Phalcon\Di\Service实例。

public function getServices(): ServiceInterface[];
返回在DI中注册的服务。

public function getShared( string $name, mixed $parameters = null ): mixed;
根据配置返回共享服务。

public function has( string $name ): bool;
检查DI是否包含某个名称的服务。

public function remove( string $name ): void;
从服务容器中移除服务。

public static function reset(): void;
重置内部默认的DI。

public function set( string $name, mixed $definition, bool $shared = bool ): ServiceInterface;
在服务容器中注册服务。

public static function setDefault( DiInterface $container ): void;
设置一个默认的依赖注入容器,以便在静态方法中获取。

public function setService( string $name, ServiceInterface $rawDefinition ): ServiceInterface;
使用原始Phalcon\Di\Service定义设置服务。

public function setShared( string $name, mixed $definition ): ServiceInterface;
在服务容器中注册“始终共享”的服务。

Di\Exception

GitHub上的源码

  • 命名空间

    • Phalcon\Di
  • 使用

  • 继承

    \Exception

  • 实现

在Phalcon\Di中抛出的异常将使用此类。

Di\Exception\ServiceResolutionException

GitHub上的源码

  • 命名空间

    • Phalcon\Di\Exception
  • 使用

  • 继承

    \Phalcon\Di\Exception

  • 实现

Phalcon\Di\Exception\ServiceResolutionException

Di\FactoryDefault

GitHub上的源码

  • 命名空间

    • Phalcon\Di
  • 使用

    • Phalcon\Filter\FilterFactory
  • 继承

    \Phalcon\Di\Di

  • 实现

这是标准Phalcon\Di\Di的一个变体,默认情况下它会自动注册框架提供的所有服务。因此,开发人员无需单独注册每个服务,从而提供一个全栈框架。

方法

public function __construct();
Phalcon\Di\FactoryDefault构造函数。

Di\FactoryDefault\Cli

GitHub上的源码

  • 命名空间

    • Phalcon\Di\FactoryDefault
  • 使用

    • Phalcon\Di\FactoryDefault
    • Phalcon\Di\Service
    • Phalcon\Filter\FilterFactory
  • 继承

    FactoryDefault

  • 实现

Phalcon\Di\FactoryDefault\Cli

这是标准Phalcon\Di的一个变体,默认情况下它会自动注册框架提供的所有服务。因此,开发人员无需单独注册每个服务。此类特别适合CLI应用程序。

方法

public function __construct();
Phalcon\Di\FactoryDefault\Cli构造函数。

Di\InitializationAwareInterfaceInterface

GitHub上的源码

  • 命名空间

    • Phalcon\Di
  • 使用

  • 继承

  • 实现

具有初始化功能的组件的接口。initialize()

方法

public function initialize(): void;

Di\InjectableAbstract

GitHub上的源码

  • 命名空间

    • Phalcon\Di
  • 使用

    • Phalcon\Di\Di
    • Phalcon\Session\BagInterface
    • stdClass
  • 继承

    stdClass

  • 实现

    • InjectionAwareInterface

该类允许通过访问与已注册服务同名的公共属性来访问服务容器中的服务。

@property \Phalcon\Mvc\Dispatcher|\Phalcon\Mvc\DispatcherInterface $dispatcher @property \Phalcon\Mvc\Router|\Phalcon\Mvc\RouterInterface $router @property \Phalcon\Mvc\Url|\Phalcon\Mvc\Url\UrlInterface $url @property \Phalcon\Http\Request|\Phalcon\Http\RequestInterface $request @property \Phalcon\Http\Response|\Phalcon\Http\ResponseInterface $response @property \Phalcon\Http\Response\Cookies|\Phalcon\Http\Response\CookiesInterface $cookies @property \Phalcon\Filter\Filter $filter @property \Phalcon\Flash\Direct $flash @property \Phalcon\Flash\Session $flashSession @property \Phalcon\Session\ManagerInterface $session @property \Phalcon\Events\Manager|\Phalcon\Events\ManagerInterface $eventsManager @property \Phalcon\Db\Adapter\AdapterInterface $db @property \Phalcon\Encryption\Security $security @property \Phalcon\Encryption\Crypt|\Phalcon\Encryption\Crypt\CryptInterface $crypt @property \Phalcon\Html\TagFactory $tag @property \Phalcon\Html\Escaper|\Phalcon\Html\Escaper\EscaperInterface $escaper @property \Phalcon\Annotations\Adapter\Memory|\Phalcon\Annotations\Adapter $annotations @property \Phalcon\Mvc\Model\Manager|\Phalcon\Mvc\Model\ManagerInterface $modelsManager @property \Phalcon\Mvc\Model\MetaData\Memory|\Phalcon\Mvc\Model\MetadataInterface $modelsMetadata @property \Phalcon\Mvc\Model\Transaction\Manager|\Phalcon\Mvc\Model\Transaction\ManagerInterface $transactionManager @property \Phalcon\Assets\Manager $assets @property \Phalcon\Di\Di|\Phalcon\Di\DiInterface $di @property \Phalcon\Session\Bag|\Phalcon\Session\BagInterface $persistent @property \Phalcon\Mvc\View|\Phalcon\Mvc\ViewInterface $view

属性

/**
 * Dependency Injector
 *
 * @var DiInterface|null
 */
protected $container;

方法

public function __get( string $propertyName ): mixed | null;
魔术方法 __get

public function __isset( string $name ): bool;
魔术方法 __isset

public function getDI(): DiInterface;
返回内部的依赖注入器

public function setDI( DiInterface $container ): void;
设置依赖注入器

Di\InjectionAwareInterfaceInterface

GitHub上的源码

  • 命名空间

    • Phalcon\Di
  • 使用

  • 继承

  • 实现

使用内部 Phalcon\Di\Di 创建它们的类必须实现此接口

方法

public function getDI(): DiInterface;
返回内部的依赖注入器

public function setDI( DiInterface $container ): void;
设置依赖注入器

Di\Service

GitHub上的源码

  • 命名空间

    • Phalcon\Di
  • 使用

    • Closure
    • Phalcon\Di\Exception\ServiceResolutionException
    • Phalcon\Di\Service\Builder
  • 继承

  • 实现

    • ServiceInterface

表示服务容器中的单个服务

$service = new \Phalcon\Di\Service(
    "request",
    \Phalcon\Http\Request::class
);

$request = service->resolve();

属性

/**
 * @var mixed
 */
protected $definition;

/**
 * @var bool
 */
protected $resolved = false;

/**
 * @var bool
 */
protected $shared = false;

/**
 * @var mixed|null
 */
protected $sharedInstance;

方法

final public function __construct( mixed $definition, bool $shared = bool );
Phalcon\Di\Service

public function getDefinition(): mixed;
返回服务定义

public function getParameter( int $position );
返回特定位置的参数

public function isResolved(): bool;
如果服务已被解析,则返回 true

public function isShared(): bool;
检查服务是否共享

public function resolve( mixed $parameters = null, DiInterface $container = null ): mixed;
解析服务

public function setDefinition( mixed $definition ): void;
设置服务定义

public function setParameter( int $position, array $parameter ): ServiceInterface;
在不解析服务的情况下更改定义中的参数

public function setShared( bool $shared ): void;
设置服务是否共享

public function setSharedInstance( mixed $sharedInstance ): void;
设置/重置与服务相关的共享实例

Di\Service\Builder

GitHub上的源码

  • 命名空间

    • Phalcon\Di\Service
  • 使用

    • Phalcon\Di\DiInterface
    • Phalcon\Di\Exception
  • 继承

  • 实现

Phalcon\Di\Service\Builder

该类基于复杂定义构建实例

方法

public function build( DiInterface $container, array $definition, mixed $parameters = null );
使用复杂的服務定義來構建服務

Di\ServiceInterfaceInterface

GitHub上的源码

  • 命名空间

    • Phalcon\Di
  • 使用

  • 继承

  • 实现

表示服务容器中的一个服务

方法

public function getDefinition(): mixed;
返回服务定义

public function getParameter( int $position );
返回特定位置的参数

public function isResolved(): bool;
如果服务已被解析,则返回 true

public function isShared(): bool;
检查服务是否共享

public function resolve( mixed $parameters = null, DiInterface $container = null ): mixed;
解析服务

public function setDefinition( mixed $definition );
设置服务定义

public function setParameter( int $position, array $parameter ): ServiceInterface;
在不解析服务的情况下更改定义中的参数

public function setShared( bool $shared );
设置服务是否共享

Di\ServiceProviderInterfaceInterface

GitHub上的源码

  • 命名空间

    • Phalcon\Di
  • 使用

  • 继承

  • 实现

应由服务提供者或注册服务到服务容器的类似组件实现

namespace Acme;

use Phalcon\Di\DiInterface;
use Phalcon\Di\ServiceProviderInterface;

class SomeServiceProvider implements ServiceProviderInterface
{
    public function register(DiInterface $di)
    {
        $di->setShared(
            'service',
            function () {
                // ...
            }
        );
    }
}

方法

public function register( DiInterface $di ): void;
注册一个服务提供者

无噪 Logo
无噪文档
25 年 6 月翻译
文档源↗