1 | <?php |
||||
2 | |||||
3 | namespace Ijeffro\LaraLocker\Commands; |
||||
4 | |||||
5 | use Laralocker; |
||||
6 | use Illuminate\Console\Command; |
||||
7 | use Illuminate\Filesystem\Filesystem; |
||||
8 | use Symfony\Component\Process\Process; |
||||
9 | use Symfony\Component\Console\Input\InputOption; |
||||
10 | use Ijeffro\LaraLocker\LaraLockerServiceProvider; |
||||
0 ignored issues
–
show
|
|||||
11 | use Ijeffro\Laralocker\LearningLocker\API\APIHandler; |
||||
12 | use Ijeffro\Laralocker\Constants\LearningLockerConstants; |
||||
13 | |||||
14 | class InstallCommand extends Command |
||||
15 | { |
||||
16 | /** |
||||
17 | * The console command name. |
||||
18 | * |
||||
19 | * @var string |
||||
20 | */ |
||||
21 | protected $name = 'laralocker:setup'; |
||||
22 | |||||
23 | /** |
||||
24 | * The console command signature. |
||||
25 | * |
||||
26 | * @var string |
||||
27 | */ |
||||
28 | protected $signature = 'laralocker:setup {--routes : Setup Learning Locker® Endpooints.} |
||||
29 | {--client : Setup a Learning Locker® Client.}'; |
||||
30 | |||||
31 | /** |
||||
32 | * The console command description. |
||||
33 | * |
||||
34 | * @var string |
||||
35 | */ |
||||
36 | protected $description = 'Setup LaraLocker - Learning Locker® package for Laravel'; |
||||
37 | |||||
38 | const API_ROUTE = 'api.php'; |
||||
39 | const WEB_ROUTE = 'web.php'; |
||||
40 | const CONSOLE_ROUTE = 'console.php'; |
||||
41 | const CHANNELS_ROUTE = 'channels.php'; |
||||
42 | |||||
43 | protected $seedersPath = __DIR__.'/../../publishable/database/seeds/'; |
||||
44 | protected $migrationsPath = __DIR__.'/../../publishable/database/migrations/'; |
||||
45 | |||||
46 | protected function getOptions() |
||||
47 | { |
||||
48 | return [ |
||||
49 | ['client', null, InputOption::VALUE_NONE, 'Setup a Learning Locker® Client', null], |
||||
50 | ['routes', null, InputOption::VALUE_NONE, 'Setup a Learning Locker® Endpooints', null], |
||||
51 | ]; |
||||
52 | } |
||||
53 | |||||
54 | public function fire(Filesystem $filesystem) |
||||
55 | { |
||||
56 | return $this->handle($filesystem); |
||||
0 ignored issues
–
show
Are you sure the usage of
$this->handle($filesystem) targeting Ijeffro\LaraLocker\Comma...nstallCommand::handle() seems to always return null.
This check looks for function or method calls that always return null and whose return value is used. class A
{
function getObject()
{
return null;
}
}
$a = new A();
if ($a->getObject()) {
The method The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes. ![]() |
|||||
57 | } |
||||
58 | |||||
59 | /** |
||||
60 | * Execute the console command. |
||||
61 | * |
||||
62 | * @param \Illuminate\Filesystem\Filesystem $filesystem |
||||
63 | * |
||||
64 | * @return void |
||||
65 | */ |
||||
66 | public function handle(Filesystem $filesystem) |
||||
67 | { |
||||
68 | $this->info("Setup LaraLocker - A Learning Locker® package for Laravel...\n"); |
||||
69 | |||||
70 | $this->setupLaravelRouting($filesystem); |
||||
71 | |||||
72 | // $this->setupLearningLockerClient(); |
||||
73 | |||||
74 | return $this->info("Successfully setup LaraLocker! Enjoy Learning Locker®"); |
||||
0 ignored issues
–
show
Are you sure the usage of
$this->info('Successfull...joy Learning Locker®') targeting Illuminate\Console\Command::info() seems to always return null.
This check looks for function or method calls that always return null and whose return value is used. class A
{
function getObject()
{
return null;
}
}
$a = new A();
if ($a->getObject()) {
The method The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes. ![]() |
|||||
75 | |||||
76 | // $this->call('learninglocker:client', ['--setup' => true]); |
||||
77 | // $this->setupMigrationFiles(); |
||||
78 | |||||
79 | // $this->info('Migrating the database tables into your application'); |
||||
80 | // $this->call('migrate', ['--force' => $this->option('force')]); |
||||
81 | |||||
82 | // $composer = $this->findComposer(); |
||||
83 | // $process = new Process($composer.' dump-autoload'); |
||||
84 | |||||
85 | // $process->setTimeout(null); // Setting timeout to null |
||||
86 | // $process->setWorkingDirectory(base_path())->run(); |
||||
87 | |||||
88 | // $this->info('Seeding data into the database'); |
||||
89 | // $this->seed('LaraLockerDatabaseSeeder'); |
||||
90 | |||||
91 | $this->publishVendor(); |
||||
0 ignored issues
–
show
$this->publishVendor() is not reachable.
This check looks for unreachable code. It uses sophisticated control flow analysis techniques to find statements which will never be executed. Unreachable code is most often the result of function fx() {
try {
doSomething();
return true;
}
catch (\Exception $e) {
return false;
}
return false;
}
In the above example, the last ![]() |
|||||
92 | |||||
93 | // $this->checkLearningLockerConnection(); |
||||
94 | } |
||||
95 | |||||
96 | /** |
||||
97 | * Setup Learning Locker® Endpoints |
||||
98 | * |
||||
99 | * @param Filesystem $filesystem |
||||
100 | * @return void |
||||
101 | */ |
||||
102 | public function setupLaravelRouting(Filesystem $filesystem) { |
||||
103 | if ($this->confirm("Add the default Learning Locker® endpoints to your Laravel routes file?", true)) { |
||||
104 | |||||
105 | $route_files = array_slice(scandir(base_path('routes')), 2); |
||||
0 ignored issues
–
show
It seems like
scandir(base_path('routes')) can also be of type false ; however, parameter $array of array_slice() does only seem to accept array , maybe add an additional type check?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||
106 | $file_choice = $this->choice('Which route file?', $route_files); |
||||
107 | |||||
108 | switch ($file_choice) { |
||||
109 | case self::API_ROUTE: |
||||
110 | |||||
111 | $this->addLearningLockerRouting($filesystem, self::API_ROUTE); |
||||
112 | break; |
||||
113 | case self::WEB_ROUTE: |
||||
114 | $this->addLearningLockerRouting($filesystem, self::WEB_ROUTE); |
||||
115 | break; |
||||
116 | case self::CONSOLE_ROUTE: |
||||
117 | $this->addLearningLockerRouting($filesystem, self::CONSOLE_ROUTE); |
||||
118 | break; |
||||
119 | case self::CHANNELS_ROUTE: |
||||
120 | $this->addLearningLockerRouting($filesystem, self::CHANNELS_ROUTE); |
||||
121 | break; |
||||
122 | default: |
||||
123 | $this->error('Could not find the Laravel route file...'); echo "\n"; |
||||
124 | |||||
125 | if ($this->confirm("Would you like to try again?", true)) { |
||||
126 | return $this->setupLaravelRouting($filesystem); |
||||
0 ignored issues
–
show
Are you sure the usage of
$this->setupLaravelRouting($filesystem) targeting Ijeffro\LaraLocker\Comma...::setupLaravelRouting() seems to always return null.
This check looks for function or method calls that always return null and whose return value is used. class A
{
function getObject()
{
return null;
}
}
$a = new A();
if ($a->getObject()) {
The method The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes. ![]() |
|||||
127 | } |
||||
128 | } |
||||
129 | |||||
130 | } |
||||
131 | } |
||||
132 | |||||
133 | |||||
134 | public function setupLearningLockerClient() { |
||||
135 | return $this->call('learninglocker:client', ['--setup' => true]); |
||||
136 | } |
||||
137 | |||||
138 | /** |
||||
139 | * Setup Learning Locker® Environment Variables |
||||
140 | * |
||||
141 | * @return LEARNING_LOCKER_URL |
||||
0 ignored issues
–
show
The type
Ijeffro\LaraLocker\Commands\LEARNING_LOCKER_URL was not found. Maybe you did not declare it correctly or list all dependencies?
The issue could also be caused by a filter entry in the build configuration.
If the path has been excluded in your configuration, e.g. filter:
dependency_paths: ["lib/*"]
For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths ![]() |
|||||
142 | * @return LEARNING_LOCKER_KEY |
||||
143 | * @return LEARNING_LOCKER_SECRET |
||||
144 | */ |
||||
145 | public function setupEnv() { |
||||
146 | $env = base_path('.env'); |
||||
147 | $filesystem = new Filesystem; |
||||
148 | $env_contents = $filesystem->get($env); |
||||
149 | |||||
150 | $learning_locker_url = getEnv(strtoupper(LearningLockerConstants::URL)); |
||||
151 | $learning_locker_key = getEnv(strtoupper(LearningLockerConstants::KEY)); |
||||
152 | $learning_locker_secret = getEnv(strtoupper(LearningLockerConstants::SECRET)); |
||||
153 | |||||
154 | // Has variable and value |
||||
155 | $url_has_variable_and_value = isset($learning_locker_url) && !empty($learning_locker_url); |
||||
156 | $key_has_variable_and_value = isset($learning_locker_key) && !empty($learning_locker_key); |
||||
157 | $secret_has_variable_and_value = isset($learning_locker_secret) && !empty($learning_locker_secret); |
||||
158 | |||||
159 | // Has variable with no value |
||||
160 | $url_has_variable_with_no_value = false !== strpos($env_contents, strtoupper(LearningLockerConstants::URL)) && empty($learning_locker_url); |
||||
161 | $key_has_variable_with_no_value = false !== strpos($env_contents, strtoupper(LearningLockerConstants::KEY)) && empty($learning_locker_key); |
||||
162 | $secret_has_variable_with_no_value = false !== strpos($env_contents, strtoupper(LearningLockerConstants::SECRET)) && empty($learning_locker_secret); |
||||
163 | |||||
164 | // Has no variable and no value |
||||
165 | $url_has_no_variable_and_no_value = true !== strpos($env_contents, strtoupper(LearningLockerConstants::URL)); |
||||
166 | $key_has_no_variable_and_no_value = true !== strpos($env_contents, strtoupper(LearningLockerConstants::KEY)); |
||||
167 | $secret_has_no_variable_and_no_value = true !== strpos($env_contents, strtoupper(LearningLockerConstants::SECRET)); |
||||
168 | |||||
169 | // Do the env smarts |
||||
170 | if ($url_has_variable_and_value && $key_has_variable_and_value && $secret_has_variable_and_value) { |
||||
171 | |||||
172 | if ($this->confirm('Update Learning Locker® api connection?')) { |
||||
173 | $domain = $this->anticipate("What's the new Learning Locker® url?", [ |
||||
174 | 'https://saas.learninglocker.net', 'http://saas.learninglocker.net' |
||||
175 | ]); |
||||
176 | $this->setEnv([strtoupper(LearningLockerConstants::URL) => $domain]); |
||||
177 | |||||
178 | $key = $this->ask("What's the new Learning Locker® client key?"); |
||||
179 | $this->setEnv([strtoupper(LearningLockerConstants::KEY) => $key]); |
||||
180 | |||||
181 | $secret = $this->secret("What's the new Learning Locker® client secret"); |
||||
182 | $this->setEnv([strtoupper(LearningLockerConstants::SECRET) => $secret]); |
||||
183 | } |
||||
184 | |||||
185 | } else { |
||||
186 | try { |
||||
187 | |||||
188 | // Check .env for Learning Locker® url status |
||||
189 | switch (file_exists($env)) { |
||||
190 | case $url_has_variable_and_value: |
||||
191 | if ($this->confirm('Update Learning Locker® domain?')) { |
||||
192 | $domain = $this->anticipate("What's the new Learning Locker® domain?", [ |
||||
193 | 'https://saas.learninglocker.net', 'http://saas.learninglocker.net' |
||||
194 | ]); |
||||
195 | $this->setEnv([strtoupper(LearningLockerConstants::URL) => $domain]); |
||||
196 | } |
||||
197 | break; |
||||
198 | case $url_has_variable_with_no_value: |
||||
199 | $domain = $this->anticipate("What's your Learning Locker® url?", [ |
||||
200 | 'https://saas.learninglocker.net', 'http://saas.learninglocker.net' |
||||
201 | ]); |
||||
202 | $this->setEnv([strtoupper(LearningLockerConstants::URL) => $domain]); |
||||
203 | break; |
||||
204 | case $url_has_no_variable_and_no_value: |
||||
205 | $domain = $this->anticipate("What's your Learning Locker® url?", [ |
||||
206 | 'https://saas.learninglocker.net', 'http://saas.learninglocker.net' |
||||
207 | ]); |
||||
208 | $this->createEnv(strtoupper(LearningLockerConstants::URL), $domain); |
||||
209 | break; |
||||
210 | } |
||||
211 | |||||
212 | // Check .env for Learning Locker® client key status |
||||
213 | switch (file_exists($env)) { |
||||
214 | case $key_has_variable_and_value: |
||||
215 | if ($this->confirm('Update Learning Locker® client key?')) { |
||||
216 | $key = $this->ask("What's the new Learning Locker® client key?"); |
||||
217 | $this->setEnv([strtoupper(LearningLockerConstants::KEY) => $key]); |
||||
218 | } |
||||
219 | break; |
||||
220 | case $key_has_variable_with_no_value: |
||||
221 | $key = $this->ask("What's your Learning Locker® client key?"); |
||||
222 | $this->setEnv([strtoupper(LearningLockerConstants::KEY) => $key]); |
||||
223 | break; |
||||
224 | case $key_has_no_variable_and_no_value: |
||||
225 | $key = $this->ask("What's your Learning Locker® client key?"); |
||||
226 | $this->createEnv(strtoupper(LearningLockerConstants::KEY), $key); |
||||
227 | break; |
||||
228 | } |
||||
229 | |||||
230 | // Check .env for Learning Locker® client secret status |
||||
231 | switch (file_exists($env)) { |
||||
232 | case $secret_has_variable_and_value: |
||||
233 | if ($this->confirm('Update Learning Locker® client secret?')) { |
||||
234 | $secret = $this->secret("What's the new Learning Locker® client secret"); |
||||
0 ignored issues
–
show
|
|||||
235 | $this->setEnv([strtoupper(LearningLockerConstants::KEY) => $key]); |
||||
0 ignored issues
–
show
Comprehensibility
Best Practice
introduced
by
|
|||||
236 | } |
||||
237 | break; |
||||
238 | case $secret_has_variable_with_no_value: |
||||
239 | $secret = $this->secret("What's your Learning Locker® client secret"); |
||||
240 | $this->setEnv([strtoupper(LearningLockerConstants::KEY) => $secret]); |
||||
241 | break; |
||||
242 | case $secret_has_no_variable_and_no_value: |
||||
243 | $secret = $this->secret("What's your Learning Locker® client secret"); |
||||
244 | $this->createEnv(strtoupper(LearningLockerConstants::SECRET), $secret); |
||||
245 | break; |
||||
246 | } |
||||
247 | |||||
248 | } catch (Exception $e) { |
||||
0 ignored issues
–
show
|
|||||
249 | return $e->getMessage(); |
||||
250 | } |
||||
251 | } |
||||
252 | |||||
253 | return $this->info(" << Connecting to Learning Locker®..."); |
||||
0 ignored issues
–
show
Are you sure the usage of
$this->info(' << Connect... Learning Locker®...') targeting Illuminate\Console\Command::info() seems to always return null.
This check looks for function or method calls that always return null and whose return value is used. class A
{
function getObject()
{
return null;
}
}
$a = new A();
if ($a->getObject()) {
The method The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes. ![]() |
|||||
254 | |||||
255 | $connectionCheck = \LearningLocker::connection()->check(env(strtoupper(LearningLockerConstants::URL))); |
||||
0 ignored issues
–
show
$connectionCheck = Learn...LockerConstants::URL))) is not reachable.
This check looks for unreachable code. It uses sophisticated control flow analysis techniques to find statements which will never be executed. Unreachable code is most often the result of function fx() {
try {
doSomething();
return true;
}
catch (\Exception $e) {
return false;
}
return false;
}
In the above example, the last ![]() |
|||||
256 | |||||
257 | if ($connectionCheck) { |
||||
258 | return $this->info(" << Connected to Learning Locker® Succussfully"); |
||||
259 | } |
||||
260 | |||||
261 | if ($this->confirm('Try updating Learning Locker® details again?')) { |
||||
262 | return $this->setupEnv(); |
||||
263 | } |
||||
264 | |||||
265 | return $this->error("Unable to connection with Learning Locker®"); |
||||
266 | } |
||||
267 | |||||
268 | /** |
||||
269 | * Get the composer command for the environment. |
||||
270 | * |
||||
271 | * @return string |
||||
272 | */ |
||||
273 | protected function findComposer() |
||||
274 | { |
||||
275 | if (file_exists(getcwd().'/composer.phar')) { |
||||
276 | return '"'.PHP_BINARY.'" '.getcwd().'/composer.phar'; |
||||
277 | } |
||||
278 | |||||
279 | return 'composer'; |
||||
280 | } |
||||
281 | |||||
282 | public function addLearningLockerRouting(Filesystem $filesystem, $type) |
||||
283 | { |
||||
284 | $routes_contents = $filesystem->get(base_path('routes/' . $type)); |
||||
285 | |||||
286 | if (false === strpos($routes_contents, 'LearningLocker::routes()')) { |
||||
287 | if ($this->confirm('Create Laravel ' . $type . ' routes?')) { |
||||
288 | $filesystem->append(base_path('routes/' . $type), "\nLearningLocker::routes();\n"); |
||||
289 | $this->info('Succesfully added Learning Locker® endpoints to laravel routes/' . $type); |
||||
290 | } |
||||
291 | } else { |
||||
292 | return $this->line('LearningLocker::routes() were already added to ' . $type . "\n"); |
||||
0 ignored issues
–
show
Are you sure the usage of
$this->line('LearningLoc...ded to ' . $type . ' ') targeting Illuminate\Console\Command::line() seems to always return null.
This check looks for function or method calls that always return null and whose return value is used. class A
{
function getObject()
{
return null;
}
}
$a = new A();
if ($a->getObject()) {
The method The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes. ![]() |
|||||
293 | } |
||||
294 | } |
||||
295 | |||||
296 | public function publishVendor() |
||||
297 | { |
||||
298 | $tags = ['config']; |
||||
299 | $this->call('vendor:publish', ['--provider' => LaraLockerServiceProvider::class, '--tag' => $tags]); |
||||
300 | } |
||||
301 | |||||
302 | public function checkLearningLockerConnection() |
||||
303 | { |
||||
304 | |||||
305 | $this->learning_locker_api = new APIHandler; |
||||
0 ignored issues
–
show
|
|||||
306 | |||||
307 | if ($this->learning_locker_api->check()) { |
||||
0 ignored issues
–
show
The method
check() does not exist on Ijeffro\Laralocker\LearningLocker\API\APIHandler .
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. ![]() |
|||||
308 | $this->info('Successfully connected to Learning Locker®'); |
||||
309 | } else { |
||||
310 | return $this->error(' << Could not connect to Learning Locker® '); |
||||
0 ignored issues
–
show
Are you sure the usage of
$this->error(' << Could ...to Learning Locker® ') targeting Illuminate\Console\Command::error() seems to always return null.
This check looks for function or method calls that always return null and whose return value is used. class A
{
function getObject()
{
return null;
}
}
$a = new A();
if ($a->getObject()) {
The method The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes. ![]() |
|||||
311 | } |
||||
312 | |||||
313 | } |
||||
314 | |||||
315 | /** |
||||
316 | * Get a Laralocker env variable |
||||
317 | * |
||||
318 | */ |
||||
319 | public function getEnv($key = null) |
||||
320 | { |
||||
321 | $env = base_path('.env'); |
||||
322 | |||||
323 | if (file_exists($env) && !is_null($key)) { |
||||
324 | return env($key); |
||||
325 | } |
||||
326 | |||||
327 | if (file_exists($env) && is_null($key)) { |
||||
328 | $env_variables = parse_ini_file($env, true, INI_SCANNER_RAW); |
||||
329 | return $env_variables; |
||||
330 | } |
||||
331 | |||||
332 | } |
||||
333 | |||||
334 | /** |
||||
335 | * Set the Laralocker env variables |
||||
336 | * |
||||
337 | */ |
||||
338 | public function setEnv($data) |
||||
339 | { |
||||
340 | $env = base_path('.env'); |
||||
341 | $variables = array_keys($data); |
||||
342 | |||||
343 | if (file_exists($env)) { |
||||
344 | foreach ($variables as $variable) { |
||||
345 | $env_variable = $this->getEnv($variable); |
||||
346 | $contents = file_get_contents($env); |
||||
347 | $contents = str_replace(strtoupper($variable) . '=' . $env_variable, strtoupper($variable) . '=' . $data[$variable], $contents); |
||||
348 | file_put_contents($env, $contents); |
||||
349 | } |
||||
350 | } |
||||
351 | } |
||||
352 | |||||
353 | /** |
||||
354 | * Create a Laralocker env variable |
||||
355 | * |
||||
356 | */ |
||||
357 | public function createEnv($key, $value) |
||||
358 | { |
||||
359 | $env = base_path('.env'); |
||||
360 | |||||
361 | if (file_exists($env)) { |
||||
362 | |||||
363 | $filesystem = new Filesystem; |
||||
364 | $env_contents = $filesystem->get($env); |
||||
365 | |||||
366 | if (false === strpos($env_contents, $key)) { |
||||
367 | $filesystem->append($env, "\n" . strtoupper($key) . '=' . strtolower($value)); |
||||
368 | return $this->info("Created Environment variable $value successfully."); |
||||
0 ignored issues
–
show
Are you sure the usage of
$this->info('Created Env...value.' successfully.') targeting Illuminate\Console\Command::info() seems to always return null.
This check looks for function or method calls that always return null and whose return value is used. class A
{
function getObject()
{
return null;
}
}
$a = new A();
if ($a->getObject()) {
The method The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes. ![]() |
|||||
369 | } |
||||
370 | } |
||||
371 | } |
||||
372 | |||||
373 | |||||
374 | } |
||||
375 |
The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g.
excluded_paths: ["lib/*"]
, you can move it to the dependency path list as follows:For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths