0 follower

Final Class Yiisoft\Yii\Gii\Generator\ActiveRecord\Generator

InheritanceYiisoft\Yii\Gii\Generator\ActiveRecord\Generator » Yiisoft\Yii\Gii\Generator\AbstractGenerator
ImplementsYiisoft\Yii\Gii\GeneratorInterface

This generator will generate a controller and one or a few action view files.

Protected Methods

Hide inherited methods

Method Description Defined By
render() Generates code using the specified code template and parameters. Yiisoft\Yii\Gii\Generator\AbstractGenerator

Method Details

Hide inherited methods

__construct() public method

public mixed __construct ( \Yiisoft\Aliases\Aliases $aliases, \Yiisoft\Validator\ValidatorInterface $validator, Yiisoft\Yii\Gii\ParametersProvider $parametersProvider, \Yiisoft\Db\Connection\ConnectionInterface $connection )
$aliases \Yiisoft\Aliases\Aliases
$validator \Yiisoft\Validator\ValidatorInterface
$parametersProvider Yiisoft\Yii\Gii\ParametersProvider
$connection \Yiisoft\Db\Connection\ConnectionInterface

                public function __construct(
    Aliases $aliases,
    ValidatorInterface $validator,
    ParametersProvider $parametersProvider,
    private readonly ConnectionInterface $connection,
) {
    parent::__construct($aliases, $validator, $parametersProvider);
}

            
doGenerate() public method

public array doGenerate ( Yiisoft\Yii\Gii\GeneratorCommandInterface $command )
$command Yiisoft\Yii\Gii\GeneratorCommandInterface

                public function doGenerate(GeneratorCommandInterface $command): array
{
    if (!$command instanceof Command) {
        throw new InvalidArgumentException();
    }
    $files = [];
    $rootPath = $this->aliases->get('@root');
    $properties = [];
    $relations = [];
    $schema = $this->connection->getTableSchema($command->table);
    if ($schema !== null) {
        foreach ($schema->getColumns() as $columnName => $column) {
            $properties[$columnName] = new Property($column);
        }
        if ($command->generateRelations) {
            // Generate outgoing relations (this table's FKs to other tables)
            foreach ($schema->getForeignKeys() as $foreignKey) {
                $relation = new Relation($foreignKey, $command->getModelName());
                $relations[$relation->getName()] = $relation;
            }
            // Generate inverse relations (other tables' FKs to this table)
            $inverseRelations = $this->findInverseRelations($command->table);
            foreach ($inverseRelations as $inverseRelation) {
                $inverseRelationName = $inverseRelation->getName();
                if (isset($relations[$inverseRelationName])) {
                    continue;
                }
                $relations[$inverseRelationName] = $inverseRelation;
            }
            // Mark columns used in relations
            foreach ($relations as $relation) {
                foreach ($relation->getLink() as $columnName) {
                    if (isset($properties[$columnName])) {
                        $properties[$columnName]->usedInRelation = true;
                    }
                }
            }
        }
    }
    $path = $this->getModelFile($command);
    $codeFile = (new CodeFile(
        $path,
        $this->render($command, 'model.php', [
            'properties' => $properties,
            'relations' => $relations,
        ]),
    ))->withBasePath($rootPath);
    $files[$codeFile->getId()] = $codeFile;
    return $files;
}

            
generate() public method
public Yiisoft\Yii\Gii\Component\CodeFile\CodeFile[] generate ( Yiisoft\Yii\Gii\GeneratorCommandInterface $command )
$command Yiisoft\Yii\Gii\GeneratorCommandInterface
throws Yiisoft\Yii\Gii\Exception\InvalidGeneratorCommandException

                final public function generate(GeneratorCommandInterface $command): array
{
    $result = $this->validator->validate($command);
    if (!$result->isValid()) {
        throw new InvalidGeneratorCommandException($result);
    }
    return $this->doGenerate($command);
}

            
getCommandClass() public static method

public static string getCommandClass ( )

                public static function getCommandClass(): string
{
    return Command::class;
}

            
getDescription() public static method

public static string getDescription ( )

                public static function getDescription(): string
{
    return '';
}

            
getId() public static method

public static string getId ( )

                public static function getId(): string
{
    return 'active-record';
}

            
getName() public static method

public static string getName ( )

                public static function getName(): string
{
    return 'Active Record';
}

            
getRequiredTemplates() public method

public array getRequiredTemplates ( )

                public function getRequiredTemplates(): array
{
    return [
        'model.php',
    ];
}

            
getTemplatePath() public method
public string getTemplatePath ( Yiisoft\Yii\Gii\GeneratorCommandInterface $command )
$command Yiisoft\Yii\Gii\GeneratorCommandInterface

                public function getTemplatePath(GeneratorCommandInterface $command): string
{
    $template = $command->getTemplate();
    if ($template === 'default') {
        return $this->defaultTemplate();
    }
    $templates = $this->parametersProvider->getTemplates(static::getId());
    return $templates[$template] ?? throw new InvalidConfigException("Unknown template: \"{$template}\"");
}

            
render() protected method

Defined in: Yiisoft\Yii\Gii\Generator\AbstractGenerator::render()

Generates code using the specified code template and parameters.

Note that the code template will be used as a PHP file.

protected string render ( Yiisoft\Yii\Gii\GeneratorCommandInterface $command, string $templateFile, array $params = [] )
$command Yiisoft\Yii\Gii\GeneratorCommandInterface
$templateFile string

The code template file. This must be specified as a file path relative to {@see \Yiisoft\Yii\Gii\Generator\getTemplatePath()}.

$params array

List of parameters to be passed to the template file.

return string

The generated code

throws Throwable

                protected function render(GeneratorCommandInterface $command, string $templateFile, array $params = []): string
{
    $file = sprintf(
        '%s/%s',
        $this->aliases->get($this->getTemplatePath($command)),
        $templateFile,
    );
    $renderer = function (): void {
        /** @psalm-suppress MixedArgument,PossiblyFalseArgument */
        extract(func_get_arg(1));
        /** @psalm-suppress UnresolvableInclude */
        require func_get_arg(0);
    };
    $obInitialLevel = ob_get_level();
    ob_start();
    ob_implicit_flush(false);
    try {
        /** @psalm-suppress PossiblyNullFunctionCall */
        $renderer->bindTo($this)($file, array_merge($params, ['command' => $command]));
        return (string) ob_get_clean();
    } catch (Throwable $e) {
        while (ob_get_level() > $obInitialLevel) {
            if (!@ob_end_clean()) {
                ob_clean();
            }
        }
        throw $e;
    }
}