AutoWire 属性依赖注入自动绑定

gitee.com/gordensong/laravel-autow...

自动绑定类属性

  1. 对于声明了 Autowire 注解的类,调用 autowire($class) 可以自动初始化声明 Autowire 注解的属性.

  2. 属性自动绑定不限于单元测试使用,Repository, Service, Action 同样可以使用。

  3. 注意:不要循环引用注解属性。

直接上栗子

Human

<?php

use GordenSong\Laravel\Support\Autowire;

#[Autowire]
class Human
{
    #[Autowire]
    public ?Head $head = null;
}

Head

#[Autowire]
class Head
{
    #[Autowire]
    public ?Mouth $mouth = null;
}

Mouth

class Mouth
{
    public ?Teeth $teeth = null;
}

Teeth

class Teeth
{
}

helper demo

<?php

namespace Tests;

class HelperTest extends TestCase
{
    public function test_autowire()
    {
        /** @var Human $cat */
        $cat = autowire(Human::class);

        self::assertNotNull($cat);
        self::assertNotNull($cat->head);
        self::assertNull($cat->head->mouth);
    }

    public function test_autowire_recursive()
    {
        /** @var Human $cat */
        $cat = autowire(Human::class, true);

        self::assertNotNull($cat);
        self::assertNotNull($cat->head);
        self::assertNotNull($cat->head->mouth);
        self::assertNull($cat->head->mouth->teeth);
    }
}

TestCase 自动注入

<?php

namespace Tests;

use GordenSong\Laravel\Support\Autowire;
use GordenSong\Laravel\Support\AutowireTrait;

class NotRecursiveAutowireTest extends TestCase
{
    // 第一步:引用 Trait use AutowireTrait
    use AutowireTrait;

    protected function setUp(): void
    {
        parent::setUp();

        // 第二步: $this->autowireProperties(); 绑定值为空的属性
        $this->autowireProperties(); // 不递归绑定
    }

    // 第三步:使用注解
    #[Autowire]
    private ?Human $human = null;

    public function test_auto_wire_head_is_null()
    {
        self::assertNotNull($this->human);
        self::assertNull($this->human->head);
    }
}

TestCase 递归注入

<?php

namespace Tests;

use GordenSong\Laravel\Support\Autowire;
use GordenSong\Laravel\Support\AutowireTrait;

class RecursiveAutowireTest extends TestCase
{
    use AutowireTrait; // 1.

    protected function setUp(): void
    {
        parent::setUp();

        $this->autowireProperties(true); // 2. 递归绑定
    }

    // 3. 使用注解
    #[Autowire]
    private ?Human $cat = null;

    public function test_auto_wire_head_is_null()
    {
        self::assertNotNull($this->cat);
        self::assertNotNull($this->cat->head);
        self::assertNotNull($this->cat->head->mouth);
        self::assertNull($this->cat->head->mouth->teeth); // teeth 未加注解
    }
}

安装

composer require --dev gordensong/laravel-autowire

说明

Function

1. autowire($class) 等价于 app($class)

function autowire(string $class, bool $recursive = false) : mixed

2. 自动绑定属性值, 对象内部使用。

function autowireProperties(object $object, bool $recursive = false)
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 4

:+1: :+1: :+1: :+1:

2年前 评论

能给个 star 吗?

2年前 评论

以我使用了几天的 java 水平来看,这个 AutoWire 应该为 Autowire,,,

2年前 评论

收到。PHPSTORM 老是提示语法错误。我就给改了。

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!