容器

优质
小牛编辑
138浏览
2023-12-01

容器用于存放类实例对象,容器中的对象类我们称之为 Bean。通过容器实例化出来的对象,我们可以对它们进行注入操作。

配置扫描命名空间

应用启动时,会扫描配置中设定的命名空间,扫描到的类才可以通过容器使用 Bean 名称获取对象。

支持在项目、子服务器的配置文件中配置:

return [
    'beanScan'  =>  [
        'ImiApp\Model',
        'ImiApp\Service',
    ],
];

容器分类

  • 全局容器
  • 服务器容器
  • 请求上下文容器

全局容器

存活于框架整个生命周期,可以理解为全局容器。

$object = \Imi\App::getBean('XXX');

服务器容器

只针对目标服务器的容器,该容器中目前存储了该服务器的路由对象及配置等等。

$object = \Imi\ServerManage::getServer('main')->getBean('XXX');

请求上下文容器

当前请求有效的容器,请求结束时即销毁。

$object = \Imi\RequestContext::getBean('XXX');

容器对象类 (Bean)

getBean()时可以传带有完整命名空间的类名,或者别名,我们可以通过@Bean注解来定义别名。

你也可以在类里定义一个__init()方法,imi 将它作为第二个构造方法。

执行顺序:__construct -> injectProps -> __init

injectProps 即为属性注入,具体请看章节:AOP

定义:

namespace Test;

/**
 * @Bean("MyTest")
 */
class ABCDEFG
{
    public function __construct($id)
    {
        echo 'first', PHP_EOL;
    }

    public function __init($id)
    {
        echo 'second first', PHP_EOL;
    }
}

获得实例:

App::getBean('MyTest');
App::getBean(\Test\ABCDEFG::class);

注解继承

默认情况下,继承父类,父类的注解是不生效的。

有时候,我们需要让他生效。

imi 提供了一个 @Inherit 注解,支持写在:类、方法、属性、常量上。

类名:Imi\Bean\Annotation\Inherit

参数:

/**
 * 允许的注解类,为 null 则不限制,支持字符串或数组
 *
 * @var string|string[]
 */
public $annotation;

例子:

下面是模型的例子,父类定义结构,子类中可以写自定义代码。重新生成模型父类代码,不会把自定义代码给覆盖掉。

父类:

<?php
namespace Imi\Test\Component\Model\Base;

use Imi\Model\Model;
use Imi\Model\Annotation\Table;
use Imi\Model\Annotation\Column;
use Imi\Model\Annotation\Entity;

/**
 * ArticleBase
 * @Entity
 * @Table(name="tb_article", id={"id"})
 * @property int $id 
 * @property string $title 
 * @property string $content 
 * @property string $time 
 */
abstract class ArticleBase extends Model
{
    /**
     * id
     * @Column(name="id", type="int", length=10, accuracy=0, nullable=false, default="", isPrimaryKey=true, primaryKeyIndex=0, isAutoIncrement=true)
     * @var int
     */
    protected $id;

    /**
     * 获取 id
     *
     * @return int
     */ 
    public function getId()
    {
        return $this->id;
    }

    /**
     * 赋值 id
     * @param int $id id
     * @return static
     */ 
    public function setId($id)
    {
        $this->id = $id;
        return $this;
    }

    /**
     * title
     * @Column(name="title", type="varchar", length=255, accuracy=0, nullable=false, default="", isPrimaryKey=false, primaryKeyIndex=-1, isAutoIncrement=false)
     * @var string
     */
    protected $title;

    /**
     * 获取 title
     *
     * @return string
     */ 
    public function getTitle()
    {
        return $this->title;
    }

    /**
     * 赋值 title
     * @param string $title title
     * @return static
     */ 
    public function setTitle($title)
    {
        $this->title = $title;
        return $this;
    }

    /**
     * content
     * @Column(name="content", type="mediumtext", length=0, accuracy=0, nullable=false, default="", isPrimaryKey=false, primaryKeyIndex=-1, isAutoIncrement=false)
     * @var string
     */
    protected $content;

    /**
     * 获取 content
     *
     * @return string
     */ 
    public function getContent()
    {
        return $this->content;
    }

    /**
     * 赋值 content
     * @param string $content content
     * @return static
     */ 
    public function setContent($content)
    {
        $this->content = $content;
        return $this;
    }

    /**
     * time
     * @Column(name="time", type="timestamp", length=0, accuracy=0, nullable=false, default="CURRENT_TIMESTAMP", isPrimaryKey=false, primaryKeyIndex=-1, isAutoIncrement=false)
     * @var string
     */
    protected $time;

    /**
     * 获取 time
     *
     * @return string
     */ 
    public function getTime()
    {
        return $this->time;
    }

    /**
     * 赋值 time
     * @param string $time time
     * @return static
     */ 
    public function setTime($time)
    {
        $this->time = $time;
        return $this;
    }

}

子类:

<?php
namespace Imi\Test\Component\Model;

use Imi\Bean\Annotation\Inherit;
use Imi\Test\Component\Model\Base\ArticleBase;

/**
 * Article
 * @Inherit
 */
class Article extends ArticleBase
{

}