Completed
Push — 4.2 ( edfa0f...bbb68b )
by David
59s
created

PivotTableMethodsDescriptor::getSingularName()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 8
Code Lines 5

Duplication

Lines 8
Ratio 100 %

Importance

Changes 0
Metric Value
dl 8
loc 8
rs 9.4285
c 0
b 0
f 0
cc 2
eloc 5
nc 2
nop 0
1
<?php
2
3
namespace Mouf\Database\TDBM\Utils;
4
5
use Doctrine\DBAL\Schema\ForeignKeyConstraint;
6
use Doctrine\DBAL\Schema\Table;
7
8
class PivotTableMethodsDescriptor implements MethodDescriptorInterface
9
{
10
    /**
11
     * @var Table
12
     */
13
    private $pivotTable;
14
15
    private $useAlternateName = false;
16
17
    /**
18
     * @var ForeignKeyConstraint
19
     */
20
    private $localFk;
21
22
    /**
23
     * @var ForeignKeyConstraint
24
     */
25
    private $remoteFk;
26
27
    /**
28
     * @param Table $pivotTable The pivot table
29
     * @param ForeignKeyConstraint $localFk
30
     * @param ForeignKeyConstraint $remoteFk
31
     */
32
    public function __construct(Table $pivotTable, ForeignKeyConstraint $localFk, ForeignKeyConstraint $remoteFk)
33
    {
34
        $this->pivotTable = $pivotTable;
35
        $this->localFk = $localFk;
36
        $this->remoteFk = $remoteFk;
37
    }
38
39
    /**
40
     * Requests the use of an alternative name for this method.
41
     */
42
    public function useAlternativeName()
43
    {
44
        $this->useAlternateName = true;
45
    }
46
47
    /**
48
     * Returns the name of the method to be generated.
49
     *
50
     * @return string
51
     */
52
    public function getName() : string
53
    {
54
        if (!$this->useAlternateName) {
55
            return 'get'.TDBMDaoGenerator::toCamelCase($this->remoteFk->getForeignTableName());
56
        } else {
57
            return 'get'.TDBMDaoGenerator::toCamelCase($this->remoteFk->getForeignTableName()).'By'.TDBMDaoGenerator::toCamelCase($this->pivotTable->getName());
58
        }
59
    }
60
61
    /**
62
     * Returns the plural name.
63
     *
64
     * @return string
65
     */
66 View Code Duplication
    private function getPluralName() : string
0 ignored issues
show
Duplication introduced by
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...
67
    {
68
        if (!$this->useAlternateName) {
69
            return TDBMDaoGenerator::toCamelCase($this->remoteFk->getForeignTableName());
70
        } else {
71
            return TDBMDaoGenerator::toCamelCase($this->remoteFk->getForeignTableName()).'By'.TDBMDaoGenerator::toCamelCase($this->pivotTable->getName());
72
        }
73
    }
74
75
    /**
76
     * Returns the singular name.
77
     *
78
     * @return string
79
     */
80 View Code Duplication
    private function getSingularName() : string
0 ignored issues
show
Duplication introduced by
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->useAlternateName) {
83
            return TDBMDaoGenerator::toCamelCase(TDBMDaoGenerator::toSingular($this->remoteFk->getForeignTableName()));
84
        } else {
85
            return TDBMDaoGenerator::toCamelCase(TDBMDaoGenerator::toSingular($this->remoteFk->getForeignTableName())).'By'.TDBMDaoGenerator::toCamelCase($this->pivotTable->getName());
86
        }
87
    }
88
89
    /**
90
     * Returns the code of the method.
91
     *
92
     * @return string
93
     */
94
    public function getCode() : string
95
    {
96
        $singularName = $this->getSingularName();
97
        $pluralName = $this->getPluralName();
98
        $remoteBeanName = TDBMDaoGenerator::getBeanNameFromTableName($this->remoteFk->getForeignTableName());
99
        $variableName = '$'.TDBMDaoGenerator::toVariableName($remoteBeanName);
100
        $pluralVariableName = $variableName.'s';
101
102
        $str = '    /**
103
     * Returns the list of %s associated to this bean via the %s pivot table.
104
     *
105
     * @return %s[]
106
     */
107
    public function get%s()
108
    {
109
        return $this->_getRelationships(%s);
110
    }
111
';
112
113
        $getterCode = sprintf($str, $remoteBeanName, $this->pivotTable->getName(), $remoteBeanName, $pluralName, var_export($this->remoteFk->getLocalTableName(), true));
114
115
        $str = '    /**
116
     * Adds a relationship with %s associated to this bean via the %s pivot table.
117
     *
118
     * @param %s %s
119
     */
120
    public function add%s(%s %s)
121
    {
122
        return $this->addRelationship(%s, %s);
123
    }
124
';
125
126
        $adderCode = sprintf($str, $remoteBeanName, $this->pivotTable->getName(), $remoteBeanName, $variableName, $singularName, $remoteBeanName, $variableName, var_export($this->remoteFk->getLocalTableName(), true), $variableName);
127
128
        $str = '    /**
129
     * Deletes the relationship with %s associated to this bean via the %s pivot table.
130
     *
131
     * @param %s %s
132
     */
133
    public function remove%s(%s %s)
134
    {
135
        return $this->_removeRelationship(%s, %s);
136
    }
137
';
138
139
        $removerCode = sprintf($str, $remoteBeanName, $this->pivotTable->getName(), $remoteBeanName, $variableName, $singularName, $remoteBeanName, $variableName, var_export($this->remoteFk->getLocalTableName(), true), $variableName);
140
141
        $str = '    /**
142
     * Returns whether this bean is associated with %s via the %s pivot table.
143
     *
144
     * @param %s %s
145
     * @return bool
146
     */
147
    public function has%s(%s %s) : bool
148
    {
149
        return $this->hasRelationship(%s, %s);
150
    }
151
';
152
153
        $hasCode = sprintf($str, $remoteBeanName, $this->pivotTable->getName(), $remoteBeanName, $variableName, $singularName, $remoteBeanName, $variableName, var_export($this->remoteFk->getLocalTableName(), true), $variableName);
154
155
        $str = '    /**
156
     * Sets all relationships with %s associated to this bean via the %s pivot table.
157
     * Exiting relationships will be removed and replaced by the provided relationships.
158
     *
159
     * @param %s[] %s
160
     */
161
    public function set%s(array %s)
162
    {
163
        return $this->setRelationships(%s, %s);
164
    }
165
';
166
167
        $setterCode = sprintf($str, $remoteBeanName, $this->pivotTable->getName(), $remoteBeanName, $pluralVariableName, $pluralName, $pluralVariableName, var_export($this->remoteFk->getLocalTableName(), true), $pluralVariableName);
168
169
        $code = $getterCode.$adderCode.$removerCode.$hasCode.$setterCode;
170
171
        return $code;
172
    }
173
174
    /**
175
     * Returns an array of classes that needs a "use" for this method.
176
     *
177
     * @return string[]
178
     */
179
    public function getUsedClasses() : array
180
    {
181
        return [TDBMDaoGenerator::getBeanNameFromTableName($this->remoteFk->getForeignTableName())];
182
    }
183
184
    /**
185
     * Returns the code to past in jsonSerialize.
186
     *
187
     * @return string
188
     */
189
    public function getJsonSerializeCode() : string
190
    {
191
        $remoteBeanName = TDBMDaoGenerator::getBeanNameFromTableName($this->remoteFk->getForeignTableName());
192
        $variableName = '$'.TDBMDaoGenerator::toVariableName($remoteBeanName);
193
194
        return '        if (!$stopRecursion) {
195
            $array[\''.lcfirst($this->getPluralName()).'\'] = array_map(function ('.$remoteBeanName.' '.$variableName.') {
196
                return '.$variableName.'->jsonSerialize(true);
197
            }, $this->'.$this->getName().'());
198
        }
199
';
200
    }
201
}
202