原型开发辅助

Spiral 框架自带了一个开发扩展,可以通过 AST 修改(可以理解为自动编写代码)辅助开发者,提升服务、控制器、中间件和其它类的开发速度。该扩展包含 IDE 友好的智能提示,可以为大部分 Spiral 框架下的常用组件和 Cycle 系列组件提供代码提示。

安装

要安装该扩展,可以执行以下命令:

$ composer require spiral/prototype

安装完成以后,把 Spiral\Prototype\Bootloader\PrototypeBootloader 添加到 App 类的引导程序列表中:

class App extends Kernel
{
    // ...

    protected const APP = [
        RoutesBootloader::class,
        LoggingBootloader::class,

        PrototypeBootloader::class
    ];
}

注意:Prototype 扩展会调用 TokenizerConfig, 所以请把 PrototypeBootloader 添加到引导程序链的最后位置。

然后可以执行 php app.php configure 命令来生成 IDE 提示。

原型属性的使用

在开发过程中,要使用框架的原型制作功能,需要在你的类中使用 Spiral\Prototype\Traits\PrototypeTrait. 一旦使用了这个 trait, IDE 就能够为可用的类以及 Cycle 系列组件提供代码提示功能:

IDE 代码提示

无需引入任何额外的类或者 PHPDoc 声明,即可直接使用智能提示:

namespace App\Controller;

use Spiral\Prototype\Traits\PrototypeTrait;

class HomeController
{
    use PrototypeTrait;

    public function index()
    {
        return $this->views->render('profile', [
            'user' => $this->users->findByName('Antony')
        ]);
    }
}

代码提示对于通过 __get 魔术方法定义的对象也有效。

在原型开发阶段完成以后,你可以通过以下命令快速移除使用的 trait 以及相关的注入依赖:

$ php app.php prototype:inject -r

加上 -r 参数表示移除 PrototypeTrait.

执行上面的命令之后,会自动从你的类代码中删除对应的引入和 trait 使用:

namespace App\Controller;

use App\Database\Repository\UserRepository;
use Spiral\Views\ViewsInterface;

class HomeController
{
    /** @var ViewsInterface */
    private $views;
    
    /** @var UserRepository */
    private $users;

    /**
     * @param ViewsInterface $views
     * @param UserRepository $users
     */
    public function __construct(ViewsInterface $views, UserRepository $users)
    {
        $this->users = $users;
        $this->views = $views;
    }

    public function index()
    {
        return $this->views->render('profile', [
            'user' => $this->users->findByName('Antony')
        ]);
    }
}

注入代码周围行的代码格式也会受到影响。

也可以执行下面的命令,列出所有使用了原型属性的类,但不对它们进行修改:

$ php app.php prototype:list

在所有的注入都完全移除之后,你可以从项目中完全删除 spiral/prototype 扩展。

自定义属性

除了 Spiral 框架官方提供的属性以外,你也可以在你的引导程序中借助 Spiral\Prototype\Bootloader\PrototypeBootloader 来注册自己的原型属性:

public function boot(PrototypeBootloader $prototype)
{
    $prototype->bindProperty('myService', MyService::class);
}

可以把这种方法与类的自动发现相结合,以便更好地把领域层体系结构集成到开发过程中。

基于注解实现

除了上述的使用 trait 的方法以外,也可以用注解的方式来注册原型类和服务。在你需要注入的类上面使用 Spiral\Prototype\Annotation\Prototyped 注解:

namespace App\Service;

use Spiral\Prototype\Annotation\Prototyped;

/** @Prototyped(property="myService") */
class MyService
{

}

在通过任何一种方式注册了自己的原型属性之后,需要执行 php app.php update 或者 php app.php prototype:dump 命令来自动定位你的服务类。

可用快捷方式

Spiral 框架有大量的组件快捷方式可以使用:

属性组件
appApp\App (或其它实现 Spiral\Boot\Kernel 的类)
classLocatorSpiral\Tokenizer\ClassesInterface
consoleSpiral\Console\Console
containerPsr\Container\ContainerInterface
dbSpiral\Database\DatabaseInterface
dbalSpiral\Database\DatabaseProviderInterface
encrypterSpiral\Encrypter\EncrypterInterface
envSpiral\Boot\EnvironmentInterface
filesSpiral\Files\FilesInterface
guardSpiral\Security\GuardInterface
httpSpiral\Http\Http
i18nSpiral\Translator\TranslatorInterface
inputSpiral\Http\Request\InputManager
sessionSpiral\Session\SessionScope
cookiesSpiral\Cookies\CookieManager
loggerPsr\Log\LoggerInterface
logsSpiral\Logger\LogsInterface
memorySpiral\Boot\MemoryInterface
ormCycle\ORM\ORMInterface
paginatorsSpiral\Pagination\PaginationProviderInterface
queueSpiral\Jobs\QueueInterface
requestSpiral\Http\Request\InputManager
responseSpiral\Http\ResponseWrapper
routerSpiral\Router\RouterInterface
serverSpiral\Goridge\RPC
snapshotsSpiral\Snapshots\SnapshotterInterface
storageSpiral\Storage\StorageInterface
validatorSpiral\Validation\ValidationInterface
viewsSpiral\Views\ViewsInterface
authSpiral\Auth\AuthScope
authTokensSpiral\Auth\TokenStorageInterface
上一页
下一页