Completed
Push — master ( a97445...ea780c )
by arto
11:02
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_INSTANTIATOR_ADD_IT_TO_ENTITY_INSTANTIATOR   = 'entity_instantiator_add_to_entity_instantiator';
26
    const PARAMETER_ENTITY_INSTANTIATOR_DEFAULT_CONNECTION_MODE         = 'entity_instantiator_default_connection_mode';
27
    const PARAMETER_ENTITY_INSTANTIATOR_DEFAULT_CONNECTION_NAME         = 'entity_instantiator_default_connection_name';
28
    const PARAMETER_ENTITY_INSTANTIATOR_CLASS_NAME                      = 'entity_instantiator_class_name';
29
    const PARAMETER_ENTITY_INSTANTIATOR_EXTENDS                         = 'entity_instantiator_extends';
30
    const PARAMETER_ENTITY_INSTANTIATOR_INDENTION                       = 'entity_instantiator_indention';
31
    const PARAMETER_ENTITY_INSTANTIATOR_METHOD_NAME_PREFIX              = 'entity_instantiator_method_name_prefix';
32
    const PARAMETER_ENTITY_INSTANTIATOR_NAMESPACE                       = 'entity_instantiator_namespace';
33
    const PARAMETER_ENTITY_INSTANTIATOR_PATH_TO_OUTPUT                  = 'entity_instantiator_path_to_output';
34
    const PARAMETER_ENTITY_INSTANTIATOR_USE_FULLY_QUALIFIED_NAME        = 'entity_instantiator_use_fully_qualified_name';
35
36
    /** @var array */
37
    protected $parameters = [
38
        self::PARAMETER_ENTITY_INSTANTIATOR_ADD_IT_TO_ENTITY_INSTANTIATOR   => 'true',
39
        self::PARAMETER_ENTITY_INSTANTIATOR_DEFAULT_CONNECTION_MODE         => null,
40
        self::PARAMETER_ENTITY_INSTANTIATOR_DEFAULT_CONNECTION_NAME         => null,
41
        self::PARAMETER_ENTITY_INSTANTIATOR_CLASS_NAME                      => 'DatabaseEntityInstantiator',
42
        self::PARAMETER_ENTITY_INSTANTIATOR_INDENTION                       => '    ',
43
        self::PARAMETER_ENTITY_INSTANTIATOR_METHOD_NAME_PREFIX              => null,
44
        self::PARAMETER_ENTITY_INSTANTIATOR_NAMESPACE                       => null,
45
        self::PARAMETER_ENTITY_INSTANTIATOR_PATH_TO_OUTPUT                  => 'data',
46
        self::PARAMETER_ENTITY_INSTANTIATOR_USE_FULLY_QUALIFIED_NAME        => 'false'
47
    ];
48
49
50
51
    /**
52
     * @param DataModelBuilder $builder
53
     * @return string
54
     * @throws InvalidArgumentException
55
     */
56
    public function queryMethods($builder)
57
    {
58
        $this->addQueryToGenerator($builder);
59
60
        return '';
61
    }
62
63
64
65
    /**
66
     * @param DataModelBuilder $builder
67
     * @return string
68
     * @throws InvalidArgumentException
69
     */
70
    public function objectMethods($builder)
71
    {
72
        $this->addObjectToGenerator($builder);
73
74
        return '';
75
    }
76
77
    /**
78
     * @param DataModelBuilder $builder
79
     * @throws InvalidArgumentException
80
     */
81 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...
82
    {
83
        if ($this->addIt()) {
84
            $manager    = $this->getManager();
85
            $entity     = $this->buildEntityFromObject($builder);
86
            $manager->add($entity);
87
        }
88
    }
89
90
    /**
91
     * @param DataModelBuilder $builder
92
     * @throws InvalidArgumentException
93
     */
94 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...
95
    {
96
        if ($this->addIt()) {
97
            $manager    = $this->getManager();
98
            $entity     = $this->buildEntityFromQuery($builder);
99
            $manager->add($entity);
100
        }
101
    }
102
103
    /**
104
     * @param DataModelBuilder $builder
105
     * @return ObjectEntity
106
     */
107
    private function buildEntityFromObject(DataModelBuilder $builder)
108
    {
109
        $methodNamePrefix = $this->returnDatabaseNameIfMethodNamePrefixIsNotProvided($builder);
110
111
        return new ObjectEntity(
112
            $builder->getStubObjectBuilder()->getClassname(),
113
            $builder->getDatabase()->getName(),
114
            $builder->getStubObjectBuilder()->getFullyQualifiedClassname(),
115
            $methodNamePrefix
116
        );
117
    }
118
119
    /**
120
     * @param DataModelBuilder $builder
121
     * @return QueryEntity
122
     */
123
    private function buildEntityFromQuery(DataModelBuilder $builder)
124
    {
125
        $methodNamePrefix = $this->returnDatabaseNameIfMethodNamePrefixIsNotProvided($builder);
126
127
        return new QueryEntity(
128
            $builder->getStubQueryBuilder()->getClassname(),
129
            $builder->getDatabase()->getName(),
130
            $builder->getStubQueryBuilder()->getFullyQualifiedClassname(),
131
            $methodNamePrefix
132
        );
133
    }
134
135
    /**
136
     * @param DataModelBuilder $builder
137
     * @return string
138
     */
139
    private function returnDatabaseNameIfMethodNamePrefixIsNotProvided(DataModelBuilder $builder)
140
    {
141
        $methodNamePrefix = (is_null($this->parameters[self::PARAMETER_ENTITY_INSTANTIATOR_METHOD_NAME_PREFIX]))
142
            ? 'create' . ucfirst($builder->getDatabase()->getName())
143
            : $this->parameters[self::PARAMETER_ENTITY_INSTANTIATOR_METHOD_NAME_PREFIX];
144
145
        return $methodNamePrefix;
146
    }
147
148
    /**
149
     * @return Manager
150
     * @throws InvalidArgumentException
151
     */
152
    private function getManager()
153
    {
154
        $manager = Manager::getInstance();
155
156
        if ($manager->isNotConfigured()) {
157
            $pathToOutput   = $this->parameters[self::PARAMETER_ENTITY_INSTANTIATOR_PATH_TO_OUTPUT];
158
            $isAbsolutePath = (strncmp($pathToOutput, DIRECTORY_SEPARATOR, strlen(DIRECTORY_SEPARATOR)) === 0);    //like /foo/bar
159
            $isResource     = (strpos($pathToOutput, '://') !== false);  //like vfs://
160
161
            $isAbsolutePathOrResource   = ($isAbsolutePath || $isResource);
162
163
            $absolutePathToOutput   = ($isAbsolutePathOrResource)
164
                ? $pathToOutput
165
                : getcwd() . (str_repeat(DIRECTORY_SEPARATOR . '..', 4)) . DIRECTORY_SEPARATOR . $pathToOutput;
166
            $className              = $this->parameters[self::PARAMETER_ENTITY_INSTANTIATOR_CLASS_NAME];
167
            $defaultConnectionMode  = $this->parameters[self::PARAMETER_ENTITY_INSTANTIATOR_DEFAULT_CONNECTION_MODE];
168
            $defaultConnectionName  = $this->parameters[self::PARAMETER_ENTITY_INSTANTIATOR_DEFAULT_CONNECTION_NAME];
169
            $extends                = $this->parameters[self::PARAMETER_ENTITY_INSTANTIATOR_EXTENDS];
170
            $indention              = $this->parameters[self::PARAMETER_ENTITY_INSTANTIATOR_INDENTION];
171
            $namespace              = $this->parameters[self::PARAMETER_ENTITY_INSTANTIATOR_NAMESPACE];
172
            $useFullyQualifiedName  = ($this->parameters[self::PARAMETER_ENTITY_INSTANTIATOR_USE_FULLY_QUALIFIED_NAME] === 'true');
173
174
            $manager->configure(
175
                $className,
176
                $indention,
177
                $absolutePathToOutput,
178
                $namespace,
179
                $extends,
180
                $defaultConnectionMode,
181
                $defaultConnectionName,
182
                $useFullyQualifiedName
183
            );
184
        }
185
186
        return $manager;
187
    }
188
189
    /**
190
     * @return bool
191
     */
192
    private function addIt()
193
    {
194
        return (isset($this->parameters[self::PARAMETER_ENTITY_INSTANTIATOR_ADD_IT_TO_ENTITY_INSTANTIATOR]))
195
            ? ($this->parameters[self::PARAMETER_ENTITY_INSTANTIATOR_ADD_IT_TO_ENTITY_INSTANTIATOR] === 'true')
196
            : false;
197
    }
198
}
199