官方文档中文版翻译工作仍在进行中,欢迎 参与翻译。
代码生成
spiral/reactor
组件提供了流畅的声明式包装器用于生成 PHP 类代码。该组件是 spiral/scaffolder
(脚手架)组件的基础。但它也可以在脚手架之外单独使用。比如开发者需要在自己的框架中扩展脚手架功能。
安装:
$ composer require spiral/reactor
类定义
可以使用 Spiral\Reactor\ClassDeclaration
来声明类。
use Spiral\Reactor\ClassDeclaration;
$class = new ClassDeclaration('MyClass');
dump($class->render());
输出如下:
class MyClass
{
}
你可以通过生成的类直接访问或声明它的大多数成员:
属性
声明类的属性:
$class = new ClassDeclaration('MyClass');
$class->property('my_property')
->setProtected()
->setDefaultValue('default')
->setComment(['示例属性', '@var string']);
dump($class->render());
输出如下:
class MyClass
{
/**
* 示例属性
* @var string
*/
protected $my_property = 'default';
}
常量
声明类的常量:
$class = new ClassDeclaration('MyClass');
$class->constant('MY_CONSTANT')
->setPublic()
->setValue('default')
->setComment(['示例常量']);
dump($class->render());
输出如下:
class MyClass
{
/**
* 示例常量
*/
public const MY_CONSTANT = 'default';
}
特性(Trait)
给类添加 trait:
$class = new ClassDeclaration('MyClass');
$class->addTrait(PrototypeTrait::class);
dump($class->render());
输出如下:
class MyClass
{
use Spiral\Prototype\Traits\PrototypeTrait;
}
接口和扩展
实现指定的接口,或者扩展基础类:
use Spiral\Reactor\ClassDeclaration;
use Cycle\ORM\Select;
$class = new ClassDeclaration('MyClass');
$class->addInterface(\Countable::class)->setExtends(Select\Repository::class);
dump($class->render());
输出如下:
class MyClass extends Cycle\ORM\Select\Repository implements Countable
{
}
方法
生成类的方法:
$class = new ClassDeclaration('MyClass');
$method = $class->method('ping')
->setPublic()
->setComment('示例方法')
->setReturn('void');
$method->parameter('a')->setType('string')->setDefaultValue('test');
$method->setSource('echo $a');
dump($class->render());
输出如下:
class MyClass
{
/**
* 示例方法
*/
public function ping(string $a = 'test'): void
{
echo $a;
}
}
命名空间
把生成的类归入指定的命名空间:
use Spiral\Reactor\ClassDeclaration;
use Spiral\Reactor\NamespaceDeclaration;
$class = new ClassDeclaration('MyClass');
$ns = new NamespaceDeclaration('MyNamespace');
$ns->addElement($class);
dump($ns->render());
输出如下:
namespace MyNamespace {
class MyClass
{
}
}
文件
或者,你可以通过代码文件定义来定义整个 PHP 文件(指定命名空间):
use Spiral\Reactor\ClassDeclaration;
use Spiral\Reactor\FileDeclaration;
use Cycle\ORM\Select;
$class = new ClassDeclaration('MyClass');
$file = new FileDeclaration('MyNamespace');
$file->setComment('示例文件');
$file->setDirectives('strict_types=1');
$file->addUse(Select\Repository::class, 'Repo');
$file->addElement($class);
dump($file->render());
输出如下:
<?php
/**
* 示例文件
*/
declare(strict_types=1);
namespace MyNamespace;
use Cycle\ORM\Select\Repository as Repo;
class MyClass
{
}