Files
luos/app/Console/Commands/WorkCommand.php

109 lines
3.6 KiB
PHP

<?php
namespace App\Console\Commands;
use Illuminate\Support\Facades\File;
use Illuminate\Queue\Console\WorkCommand as BaseWorkCommand;
use Illuminate\Queue\Events\JobProcessing;
use Illuminate\Queue\Worker;
class WorkCommand extends BaseWorkCommand
{
use AddParametersTrait;
/**
* Create a new queue work command.
*
* @param \Illuminate\Queue\Worker $worker
*
* @return void
*/
public function __construct(Worker $worker)
{
$this->signature .= '
{--workspace=workflow : ProcessMaker Indicates the workspace to be processed.}
{--processmakerPath=./ : ProcessMaker path.}
';
$this->description .= ' (ProcessMaker has extended this command)';
parent::__construct($worker);
}
/**
* Listen for the queue events in order to update the console output.
*
* @return void
*/
public function listenForEvents(): void
{
$this->laravel['events']->listen(JobProcessing::class, function ($event) {
$this->loadAdditionalClassesAtRuntime();
});
parent::listenForEvents();
}
/**
* This is required by artisan for dynamically access to plugin classes.
*/
private function loadAdditionalClassesAtRuntime(): void
{
//load the main plugin classes because inside is the definition 'set_include_path()'
if (!defined('PATH_PLUGINS')) {
return;
}
$files = File::files(PATH_PLUGINS);
foreach ($files as $file) {
$isPhpFile = strtolower(File::extension($file)) === "php";
if (!$isPhpFile) {
continue;
}
require_once $file;
}
//load the classes of the plugins when is required dynamically.
$closure = function($className) {
if (class_exists($className)) {
return;
}
if (!defined('PATH_PLUGINS')) {
return;
}
$searchFiles = function($path) use(&$searchFiles, $className) {
$directories = File::directories($path);
foreach ($directories as $directory) {
$omittedDirectories = [
'bin', 'cache', 'colosa', 'config',
'data', 'documentation', 'fields',
'files', 'js', 'log', 'node_modules',
'public_html', 'resources', 'routes',
'templates', 'tests', 'translations',
'vendor', 'view', 'views'
];
if (in_array(File::basename($directory), $omittedDirectories)) {
continue;
}
$searchFiles($directory);
$files = File::files($directory);
foreach ($files as $file) {
$isPhpFile = strtolower(File::extension($file)) === "php";
if (!$isPhpFile) {
continue;
}
$className = explode("\\", $className);
$className = array_pop($className);
$pattern = "/class[\n\s]+" . $className . "[\s\n]*\{/";
$status = preg_match($pattern, file_get_contents($file), $result);
if ($status === 1) {
require_once $file;
break;
}
}
}
};
$searchFiles(PATH_PLUGINS);
};
spl_autoload_register($closure);
}
}