Soyhuce/l5-repository

View on GitHub
src/Prettus/Repository/Generators/RepositoryEloquentGenerator.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php
namespace Prettus\Repository\Generators;

use Prettus\Repository\Generators\Migrations\SchemaParser;

/**
 * Class RepositoryEloquentGenerator
 *
 * @package Prettus\Repository\Generators
 */
class RepositoryEloquentGenerator extends Generator
{

    /**
     * Get stub name.
     *
     * @var string
     */
    protected $stub = 'repository/eloquent';

    /**
     * Get root namespace.
     *
     * @return string
     */
    public function getRootNamespace()
    {
        return parent::getRootNamespace() . parent::getConfigGeneratorClassPath($this->getPathConfigNode());
    }

    /**
     * Get generator path config node.
     *
     * @return string
     */
    public function getPathConfigNode()
    {
        return 'repositories';
    }

    /**
     * Get destination path for generated file.
     *
     * @return string
     */
    public function getPath()
    {
        return $this->getBasePath() .
               '/' .
               parent::getConfigGeneratorClassPath($this->getPathConfigNode(), true) .
               '/' .
               $this->getName() .
               'RepositoryEloquent.php';
    }

    /**
     * Get base path of destination file.
     *
     * @return string
     */
    public function getBasePath()
    {
        return config('repository.generator.basePath', app()->path());
    }

    /**
     * Get array replacements.
     *
     * @return array
     */
    public function getReplacements()
    {
        $repository = parent::getRootNamespace() . parent::getConfigGeneratorClassPath('interfaces') . '\\' . $this->name . 'Repository;';
        $repository = str_replace(
            [
                "\\",
                '/',
            ],
            '\\',
            $repository
        );

        return array_merge(
            parent::getReplacements(),
            [
                'fillable' => $this->getFillable(),
                'use_validator' => $this->getValidatorUse(),
                'validator' => $this->getValidatorMethod(),
                'repository' => $repository,
                'model' => isset($this->options['model']) ? $this->options['model'] : '',
            ]
        );
    }

    /**
     * Get the fillable attributes.
     *
     * @return string
     */
    public function getFillable()
    {
        if (!$this->fillable) {
            return '[]';
        }
        $results = '[' . PHP_EOL;

        foreach ($this->getSchemaParser()->toArray() as $column => $value) {
            $results .= "\t\t'{$column}'," . PHP_EOL;
        }

        return $results . "\t" . ']';
    }

    /**
     * Get schema parser.
     *
     * @return SchemaParser
     */
    public function getSchemaParser()
    {
        return new SchemaParser($this->fillable);
    }

    public function getValidatorUse()
    {
        $validator = $this->getValidator();

        return "use {$validator};";
    }

    public function getValidator()
    {
        $validatorGenerator = new ValidatorGenerator(
            [
                'name' => $this->name,
                'rules' => $this->rules,
                'force' => $this->force,
            ]
        );

        $validator = $validatorGenerator->getRootNamespace() . '\\' . $validatorGenerator->getName();

        return str_replace(
                   [
                       "\\",
                       '/',
                   ],
                   '\\',
                   $validator
               ) . 'Validator';
    }

    public function getValidatorMethod()
    {
        if ($this->validator != 'yes') {
            return '';
        }

        $class = $this->getClass();

        return '/**' .
               PHP_EOL .
               '     * Specify Validator class name' .
               PHP_EOL .
               '     *' .
               PHP_EOL .
               '     * @return mixed' .
               PHP_EOL .
               '     */' .
               PHP_EOL .
               '    public function validator()' .
               PHP_EOL .
               '    {' .
               PHP_EOL .
               PHP_EOL .
               '        return ' .
               $class .
               'Validator::class;' .
               PHP_EOL .
               '    }' .
               PHP_EOL;
    }
}