Completed
Push — master ( 576a4c...bc864b )
by Dennis
01:49
created

AbstractSeeder::getClass()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 4
rs 10
c 0
b 0
f 0
cc 1
eloc 2
nc 1
nop 0
1
<?php
2
namespace Dennis\Seeder;
3
4
/***************************************************************
5
 *  Copyright notice
6
 *
7
 *  (c) 2016 Dennis Römmich <[email protected]>
8
 *
9
 *  All rights reserved
10
 *
11
 *  This script is part of the TYPO3 project. The TYPO3 project is
12
 *  free software; you can redistribute it and/or modify
13
 *  it under the terms of the GNU General Public License as published by
14
 *  the Free Software Foundation; either version 2 of the License, or
15
 *  (at your option) any later version.
16
 *
17
 *  The GNU General Public License can be found at
18
 *  http://www.gnu.org/copyleft/gpl.html.
19
 *
20
 *  This script is distributed in the hope that it will be useful,
21
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
22
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23
 *  GNU General Public License for more details.
24
 *
25
 *  This copyright notice MUST APPEAR in all copies of the script!
26
 ***************************************************************/
27
use Dennis\Seeder\Collection\SeedCollection;
0 ignored issues
show
Bug introduced by
This use statement conflicts with another class in this namespace, Dennis\Seeder\SeedCollection.

Let’s assume that you have a directory layout like this:

.
|-- OtherDir
|   |-- Bar.php
|   `-- Foo.php
`-- SomeDir
    `-- Foo.php

and let’s assume the following content of Bar.php:

// Bar.php
namespace OtherDir;

use SomeDir\Foo; // This now conflicts the class OtherDir\Foo

If both files OtherDir/Foo.php and SomeDir/Foo.php are loaded in the same runtime, you will see a PHP error such as the following:

PHP Fatal error:  Cannot use SomeDir\Foo as Foo because the name is already in use in OtherDir/Foo.php

However, as OtherDir/Foo.php does not necessarily have to be loaded and the error is only triggered if it is loaded before OtherDir/Bar.php, this problem might go unnoticed for a while. In order to prevent this error from surfacing, you must import the namespace with a different alias:

// Bar.php
namespace OtherDir;

use SomeDir\Foo as SomeDirFoo; // There is no conflict anymore.
Loading history...
28
use TYPO3\CMS\Core\Utility\GeneralUtility;
29
30
/**
31
 * Seeder
32
 *
33
 * @author Dennis Römmich<[email protected]>
34
 * @copyright Copyright belongs to the respective authors
35
 * @license http://www.gnu.org/licenses/gpl.html GNU General Public License, version 3 or later
36
 */
37
abstract class AbstractSeeder implements Seeder
38
{
39
    /**
40
     * connection
41
     *
42
     * @var Connection $connection
43
     */
44
    protected $connection = null;
45
46
    /**
47
     * factory
48
     *
49
     * @var SeederFactory $factory
50
     */
51
    protected $factory = null;
52
53
    /**
54
     * AbstractSeeder constructor.
55
     */
56
    public function __construct()
57
    {
58
        $this->factory = GeneralUtility::makeInstance(
59
            Factory\SeederFactory::class,
60
            \Dennis\Seeder\Factory\FakerFactory::createFaker()
61
        );
62
    }
63
64
    /**
65
     * setConnection
66
     *
67
     * @param Connection $connection
68
     * @return void
69
     */
70
    public function setConnection(Connection $connection)
71
    {
72
        $this->connection = $connection;
73
    }
74
75
    /**
76
     * preProcess
77
     *
78
     * @return void
79
     */
80
    abstract protected function before();
81
82
    /**
83
     * after
84
     *
85
     * @return void
86
     */
87
    abstract protected function after();
88
89
    /**
90
     * seed
91
     *
92
     * @throws Connection\NotFoundException
93
     * @return bool
94
     */
95
    final public function seed()
96
    {
97
        $this->before();
98
99
        if (is_null($this->connection)) {
100
            throw new Connection\NotFoundException('Connection not found.');
101
        }
102
103
        /** @var SeedCollection $seedCollection */
104
        $seedCollection = GeneralUtility::makeInstance(SeedCollection::class);
105
106
        $success = $this->connection->fetch($seedCollection->toArray());
107
108
        $this->after();
109
110
        return $success;
111
    }
112
113
    protected function getKeys()
114
    {
115
        /** @var SeedCollection $seedCollection */
116
        $seedCollection = GeneralUtility::makeInstance(SeedCollection::class);
117
118
        $keyArray = $seedCollection->get($this);
119
        if (!is_array($keyArray)) {
120
            return '';
121
        }
122
        return implode(',', array_keys($keyArray));
123
    }
124
125
    /**
126
     * @return string
127
     */
128
    public function getClass()
129
    {
130
        return get_class($this);
131
    }
132
133
    /**
134
     * @param $className
135
     * @throws \TYPO3\CMS\Extbase\Object\InvalidClassException
136
     * @return string
137
     */
138
    final protected function call($className)
139
    {
140
        if ($className === $this->getClass()) {
141
            throw new \TYPO3\CMS\Extbase\Object\InvalidClassException('Invalid loop detected in ' . $className);
142
        }
143
        /** @var self $class */
144
        $class = new $className;
145
        $class->run();
146
        $keys = $class->getKeys();
147
148
        return $keys;
149
    }
150
}
151