Completed
Push — master ( 96ce85...a97445 )
by arto
11:09
created

source/AddToEntityInstantiatorBehavior.php (2 issues)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
3
use Net\Bazzline\Propel\Behavior\EntityInstantiator\Manager;
4
use Net\Bazzline\Propel\Behavior\EntityInstantiator\ObjectEntity;
5
use Net\Bazzline\Propel\Behavior\EntityInstantiator\QueryEntity;
6
7
//@todo do we need this if dependencies are managed via composer and composer autoloader?
8
$pathToClasses = __DIR__ . '/';
9
10
require_once($pathToClasses . 'AbstractEntity.php');
11
require_once($pathToClasses . 'Configuration.php');
12
require_once($pathToClasses . 'EntityCollection.php');
13
require_once($pathToClasses . 'FileContentGenerator.php');
14
require_once($pathToClasses . 'Manager.php');
15
require_once($pathToClasses . 'ObjectEntity.php');
16
require_once($pathToClasses . 'QueryEntity.php');
17
18
/**
19
 * @author stev leibelt <[email protected]>
20
 * @since 2015-08-02
21
 * @todo make parameters optional (only set them when they are set) - this would enable it to define everything in the database scope and the rest in the table scope without overwriting database scoped things
22
 */
23
class AddToEntityInstantiatorBehavior extends Behavior
24
{
25
    const PARAMETER_ENTITY_ADD_IT_TO_ENTITY_INSTANTIATOR    = 'entity_add_to_entity_instantiator';
26
    const PARAMETER_ENTITY_INSTANTIATOR_CLASS_NAME          = 'entity_instantiator_class_name';
27
    const PARAMETER_ENTITY_INSTANTIATOR_EXTENDS             = 'entity_instantiator_extends';
28
    const PARAMETER_ENTITY_INSTANTIATOR_INDENTION           = 'entity_instantiator_indention';
29
    const PARAMETER_ENTITY_INSTANTIATOR_NAMESPACE           = 'entity_instantiator_namespace';
30
    const PARAMETER_ENTITY_INSTANTIATOR_PATH_TO_OUTPUT      = 'entity_instantiator_path_to_output';
31
    const PARAMETER_ENTITY_METHOD_NAME_PREFIX               = 'entity_method_name_prefix';
32
33
    /** @var array */
34
    protected $parameters = array(
35
        self::PARAMETER_ENTITY_ADD_IT_TO_ENTITY_INSTANTIATOR    => 'true',
36
        self::PARAMETER_ENTITY_INSTANTIATOR_CLASS_NAME          => 'DatabaseEntityInstantiator',
37
        self::PARAMETER_ENTITY_INSTANTIATOR_INDENTION           => '    ',
38
        self::PARAMETER_ENTITY_INSTANTIATOR_NAMESPACE           => null,
39
        self::PARAMETER_ENTITY_INSTANTIATOR_PATH_TO_OUTPUT      => 'data',
40
        self::PARAMETER_ENTITY_METHOD_NAME_PREFIX               => null
41
    );
42
43
    /**
44
     * @param DataModelBuilder $builder
45
     * @return string
46
     */
47
    public function queryMethods($builder)
48
    {
49
        $this->addQueryToGenerator($builder);
50
51
        return '';
52
    }
53
54
    /**
55
     * @param DataModelBuilder $builder
56
     * @return string
57
     */
58
    public function objectMethods($builder)
59
    {
60
        $this->addObjectToGenerator($builder);
61
62
        return '';
63
    }
64
65
    /**
66
     * @param DataModelBuilder $builder
67
     */
68 View Code Duplication
    public function addObjectToGenerator(DataModelBuilder $builder)
0 ignored issues
show
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
69
    {
70
        if ($this->addIt()) {
71
            $manager    = $this->getManager();
72
            $entity     = $this->buildEntityFromObject($builder);
73
            $manager->add($entity);
74
        }
75
    }
76
77
    /**
78
     * @param DataModelBuilder $builder
79
     */
80 View Code Duplication
    public function addQueryToGenerator(DataModelBuilder $builder)
0 ignored issues
show
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
81
    {
82
        if ($this->addIt()) {
83
            $manager    = $this->getManager();
84
            $entity     = $this->buildEntityFromQuery($builder);
85
            $manager->add($entity);
86
        }
87
    }
88
89
    /**
90
     * @param DataModelBuilder $builder
91
     * @return ObjectEntity
92
     */
93
    private function buildEntityFromObject(DataModelBuilder $builder)
94
    {
95
        $methodNamePrefix = $this->returnDatabaseNameIfMethodNamePrefixIsNotProvided($builder);
96
97
        return new ObjectEntity(
98
            $builder->getStubObjectBuilder()->getClassname(),
99
            $builder->getDatabase()->getName(),
100
            $builder->getStubObjectBuilder()->getFullyQualifiedClassname(),
101
            $methodNamePrefix
102
        );
103
    }
104
105
    /**
106
     * @param DataModelBuilder $builder
107
     * @return QueryEntity
108
     */
109
    private function buildEntityFromQuery(DataModelBuilder $builder)
110
    {
111
        $methodNamePrefix = $this->returnDatabaseNameIfMethodNamePrefixIsNotProvided($builder);
112
113
        return new QueryEntity(
114
            $builder->getStubQueryBuilder()->getClassname(),
115
            $builder->getDatabase()->getName(),
116
            $builder->getStubQueryBuilder()->getFullyQualifiedClassname(),
117
            $methodNamePrefix
118
        );
119
    }
120
121
    /**
122
     * @param DataModelBuilder $builder
123
     * @return string
124
     */
125
    private function returnDatabaseNameIfMethodNamePrefixIsNotProvided(DataModelBuilder $builder)
126
    {
127
        $methodNamePrefix = (is_null($this->parameters[self::PARAMETER_ENTITY_METHOD_NAME_PREFIX]))
128
            ? 'create' . ucfirst($builder->getDatabase()->getName())
129
            : $this->parameters[self::PARAMETER_ENTITY_METHOD_NAME_PREFIX];
130
131
        return $methodNamePrefix;
132
    }
133
134
    /**
135
     * @return Manager
136
     */
137
    private function getManager()
138
    {
139
        $manager = Manager::getInstance();
140
141
        if ($manager->isNotConfigured()) {
142
            $pathToOutput   = $this->parameters[self::PARAMETER_ENTITY_INSTANTIATOR_PATH_TO_OUTPUT];
143
            $isAbsolutePath = (strncmp($pathToOutput, DIRECTORY_SEPARATOR, strlen(DIRECTORY_SEPARATOR)) === 0);    //like /foo/bar
144
            $isResource     = (strpos($pathToOutput, '://') !== false);  //like vfs://
145
            $isAbsolutePathOrResource = ($isAbsolutePath || $isResource);
146
147
            $absolutePathToOutput   = ($isAbsolutePathOrResource)
148
                ? $pathToOutput
149
                : getcwd() . (str_repeat(DIRECTORY_SEPARATOR . '..', 4)) . DIRECTORY_SEPARATOR . $pathToOutput;
150
            $className      = $this->parameters[self::PARAMETER_ENTITY_INSTANTIATOR_CLASS_NAME];
151
            $extends        = $this->parameters[self::PARAMETER_ENTITY_INSTANTIATOR_EXTENDS];
152
            $indention      = $this->parameters[self::PARAMETER_ENTITY_INSTANTIATOR_INDENTION];
153
            $namespace      = $this->parameters[self::PARAMETER_ENTITY_INSTANTIATOR_NAMESPACE];
154
155
            $manager->configure($className, $indention, $absolutePathToOutput, $namespace, $extends);
156
        }
157
158
        return $manager;
159
    }
160
161
    /**
162
     * @return bool
163
     */
164
    private function addIt()
165
    {
166
        return (isset($this->parameters[self::PARAMETER_ENTITY_ADD_IT_TO_ENTITY_INSTANTIATOR]))
167
            ? ($this->parameters[self::PARAMETER_ENTITY_ADD_IT_TO_ENTITY_INSTANTIATOR] === 'true')
168
            : false;
169
    }
170
}
171