GeneratorCommand::handle()   A
last analyzed

Complexity

Conditions 4
Paths 2

Size

Total Lines 27

Duplication

Lines 27
Ratio 100 %

Importance

Changes 0
Metric Value
cc 4
nc 2
nop 0
dl 27
loc 27
rs 9.488
c 0
b 0
f 0
1
<?php
2
3
namespace JunaidQadirB\Cray\Console\Contracts;
4
5
use Illuminate\Filesystem\Filesystem;
6
use Illuminate\Support\Str;
7
use Symfony\Component\Console\Input\InputArgument;
8
9
abstract class GeneratorCommand extends \Illuminate\Console\GeneratorCommand
10
{
11
    /**
12
     * The filesystem instance.
13
     *
14
     * @var Filesystem
15
     */
16
    protected $files;
17
18
    /**
19
     * The type of class being generated.
20
     *
21
     * @var string
22
     */
23
    protected $type;
24
25
26
    /**
27
     * Get the stub file for the generator.
28
     *
29
     * @return string
30
     */
31
32
    /**
33
     * Execute the console command.
34
     *
35
     * @return bool|null
36
     */
37 View Code Duplication
    public function handle()
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...
38
    {
39
        $name = $this->qualifyClass($this->getNameInput());
40
        $path = $this->getPath($name);
41
        // First we will check to see if the class already exists. If it does, we don't want
42
        // to create the class and overwrite the user's code. So, we will bail out so the
43
        // code is untouched. Otherwise, we will continue generating this class' files.
44
        if ((!$this->hasOption('force') ||
45
                !$this->option('force')) &&
46
            $this->alreadyExists($this->getNameInput())
47
        ) {
48
            $this->error($this->type . ' already exists!');
49
50
            return false;
51
        }
52
53
        // Next, we will generate the path to the location where this class' file should get
54
        // written. Then, we will build the class and make the proper replacements on the
55
        // stub files so that it gets the correctly formatted namespace and class name.
56
        $this->makeDirectory($path);
57
58
        $this->files->put($path, $this->buildClass($name));
59
60
        $displayPath = str_replace($this->laravel->basePath(), '', $path);
61
62
        $this->info($this->type . ' created successfully in ' . $displayPath);
63
    }
64
65
    /**
66
     * Parse the class name and format according to the root namespace.
67
     *
68
     * @param string $name
69
     *
70
     * @return string
71
     */
72
    protected function qualifyClass($name)
73
    {
74
        $name = ltrim($name, '\\/');
75
76
        $rootNamespace = $this->rootNamespace();
77
        if (Str::startsWith($name, $rootNamespace)) {
78
            return $name;
79
        }
80
81
        $name = str_replace('/', '\\', $name);
82
83
        return $this->qualifyClass(
84
            $this->getDefaultNamespace(trim($rootNamespace, '\\')) . '\\' . $name
85
        );
86
    }
87
88
    /**
89
     * Get the root namespace for the class.
90
     *
91
     * @return string
92
     */
93
    protected function rootNamespace()
94
    {
95
        return $this->laravel->getNamespace();
96
    }
97
98
    /**
99
     * Get the default namespace for the class.
100
     *
101
     * @param string $rootNamespace
102
     *
103
     * @return string
104
     */
105
    protected function getDefaultNamespace($rootNamespace)
106
    {
107
        return $rootNamespace;
108
    }
109
110
    /**
111
     * Get the desired class name from the input.
112
     *
113
     * @return string
114
     */
115
    protected function getNameInput()
116
    {
117
        return trim($this->argument('name'));
118
    }
119
120
    /**
121
     * Get the destination class path.
122
     *
123
     * @param string $name
124
     *
125
     * @return string
126
     */
127
    protected function getPath($name)
128
    {
129
        $name = Str::replaceFirst($this->rootNamespace(), '', $name);
130
131
        return $this->laravel['path'] . '/' . str_replace('\\', '/', $name) . '.php';
132
    }
133
134
    /**
135
     * Determine if the class already exists.
136
     *
137
     * @param string $rawName
138
     *
139
     * @return bool
140
     */
141
    protected function alreadyExists($rawName)
142
    {
143
        return $this->files->exists($this->getPath($this->qualifyClass($rawName)));
144
    }
145
146
    /**
147
     * Build the directory for the class if necessary.
148
     *
149
     * @param string $path
150
     *
151
     * @return string
152
     */
153
    protected function makeDirectory($path)
154
    {
155
        if (!$this->files->isDirectory(dirname($path))) {
156
            $this->files->makeDirectory(dirname($path), 0777, true, true);
157
        }
158
159
        return $path;
160
    }
161
162
    /**
163
     * Build the class with the given name.
164
     *
165
     * @param string $name
166
     *
167
     * @return string
168
     */
169
    protected function buildClass($name)
170
    {
171
        $stub = $this->files->get($this->getStub());
172
173
        $class = $this->replaceNamespace($stub, $name)->replaceClass($stub, $name);
174
175
        return $class;
176
177
    }
178
179
    /**
180
     * Replace the class name for the given stub.
181
     *
182
     * @param string $stub
183
     * @param string $name
184
     *
185
     * @return string
186
     */
187
    protected function replaceClass($stub, $name)
188
    {
189
        $class = str_replace($this->getNamespace($name) . '\\', '', $name);
190
191
        return str_replace('DummyClass', $class, $stub);
192
    }
193
194
    /**
195
     * Get the full namespace for a given class, without the class name.
196
     *
197
     * @param string $name
198
     *
199
     * @return string
200
     */
201
    protected function getNamespace($name)
202
    {
203
        return trim(implode('\\', array_slice(explode('\\', $name), 0, -1)), '\\');
204
    }
205
206
    /**
207
     * Replace the namespace for the given stub.
208
     *
209
     * @param string $stub
210
     * @param string $name
211
     *
212
     * @return $this
213
     */
214
    protected function replaceNamespace(&$stub, $name)
215
    {
216
        $namespace = $this->getNamespace($name);
217
218
        $stub = str_replace(
219
            ['DummyNamespace', 'DummyRootNamespace', 'NamespacedDummyUserModel'],
220
            [$namespace, $this->rootNamespace(), config('auth.providers.users.model')],
221
            $stub
222
        );
223
224
        return $this;
225
    }
226
227
    /**
228
     * Get the console command arguments.
229
     *
230
     * @return array
231
     */
232
    protected function getArguments()
233
    {
234
        return [
235
            ['name', InputArgument::REQUIRED, 'The name of the class'],
236
        ];
237
    }
238
239
    protected function getRelativePath($path)
240
    {
241
        return str_replace(base_path() . '/', '', $path);
242
243
    }
244
}
245