memio/model

Memio的模型,用于描述生成代码

3.0.1 2024-08-13 05:52 UTC

README

通过构建“模型”对象来描述PHP代码(类/接口及其常量、属性、方法、方法参数甚至PHPdoc)。

注意:此包是Memio的一部分,Memio是一个高度意见化的PHP代码生成器。请查看主仓库

安装

使用Composer进行安装

composer require memio/model:^3.0

示例

假设我们想描述以下方法

    /**
     * @api
     */
    public function doSomething(ValueObject $valueObject, int $type = self::TYPE_ONE, bool $option = true);

为此,我们需要编写以下内容

<?php

require __DIR__.'/vendor/autoload.php';

use Memio\Model\Argument;
use Memio\Model\Method;
use Memio\Model\Phpdoc\ApiTag;
use Memio\Model\Phpdoc\MethodPhpdoc;
use Memio\Model\Phpdoc\ParameterTag;

$method = (new Method('doSomething'))
    ->setPhpdoc((new MethodPhpdoc())
        ->addParameterTag(new ParameterTag('Vendor\Project\ValueObject', 'valueObject'))
        ->addParameterTag(new ParameterTag('int', 'type'))
        ->addParameterTag(new ParameterTag('bool', 'option'))

        ->addApiTag(new ApiTag())
    )
    ->addArgument(new Argument('Vendor\Project\ValueObject', 'valueObject'))
    ->addArgument((new Argument('int', 'type'))
        ->setDefaultValue('self::TYPE_ONE')
    )
    ->addArgument((new Argument('bool', 'option'))
        ->setDefaultValue('true')
    )
;

通常模型不会像这样手动描述,它们会动态构建

// Let's say we've received the following two parameters:
$methodName = 'doSomething';
$arguments = [new \Vendor\Project\ValueObject(), ValueObject::TYPE_ONE, true];

$method = new Method($methodName);
$phpdoc = (new MethodPhpdoc())->setApiTag(new ApiTag());
$index = 1;
foreach ($arguments as $rawArgument) {
    $type = is_object($rawArgument) ? get_class($argument) : gettype($rawArgument);
    $name = 'argument'.$index++;
    $argument = new Argument($type, $name);

    $method->addArgument($argument);
    $phpdoc->addParameterTag(new ParameterTag($type, $name));
}
$method->setPhpdoc($phpdoc);

我们可以使用配置文件、用户输入、现有源代码等动态构建模型。可能性是无限的!

一旦构建了这些模型,可以进一步调整,并转换为其他格式:数组、源代码等。再次,可能性是无限的!

请查看主仓库以发现Memio的全部功能。

想了解更多吗?

Memio使用phpspec,这意味着测试也提供了文档。您还不信吗?那么请克隆此仓库并运行以下命令

composer install
./vendor/bin/phpspec run -n -f pretty

您可以使用以下方式查看当前和过去版本

最后是一些元文档

路线图

  • 移除Type
  • FullyQualifiedName中提取Import(使用语句)
  • 移除FullyQualifiedName
  • 支持更多的PHPdoc功能
  • 支持注解