Вход Регистрация
Файл: vendor/laravel/framework/src/Illuminate/Foundation/Console/DevListCommand.php
Строк: 276
<?php

namespace IlluminateFoundationConsole;

use 
IlluminateConsoleCommand;
use 
IlluminateFoundationDevCommand;
use 
IlluminateFoundationDevCommands;
use 
IlluminateSupportStringable;
use 
LaravelPromptsPrompt;
use 
SymfonyComponentConsoleAttributeAsCommand;
use 
SymfonyComponentConsoleInputInputOption;

#[AsCommand(name: 'dev:list')]
class DevListCommand extends Command
{
    
/**
     * The console command name.
     *
     * @var string
     */
    
protected $name 'dev:list';

    
/**
     * The console command description.
     *
     * @var string
     */
    
protected $description 'List the registered dev processes';

    
/**
     * Execute the console command.
     *
     * @return int
     *
     * @throws Exception
     */
    
public function handle()
    {
        
$devCommands array_map(fn ($command) => array_merge($command, [
            
'source' => $this->formatSource($command['source']),
        ]), 
$this->filterCommands(DevCommands::commands()));

        if (
$this->option('json') || ! $this->input->isInteractive()) {
            
$this->output->writeln(json_encode($devCommands));

            return empty(
$devCommands) && $this->isFiltering() ? self::FAILURE self::SUCCESS;
        }

        
$this->newLine();

        if (empty(
$devCommands)) {
            if (
$this->isFiltering()) {
                
$this->components->error("Your application doesn't have any dev processes matching the given criteria.");

                return 
self::FAILURE;
            }

            
$this->components->warn("Your application doesn't have any dev processes.");

            return 
self::SUCCESS;
        }

        
$names array_column($devCommands'name');
        
$longestName max(array_map(strlen(...), $names));

        
$columns Prompt::terminal()->cols();

        foreach (
$devCommands as $devCommand) {
            
$label str_pad($devCommand['name'], $longestName);
            
$command $devCommand['command'];
            
$source ' '.$devCommand['source'];
            
$textWidth mb_strwidth($label) + mb_strwidth($command) + mb_strwidth($source);
            
$spaceBuffer 6;

            
$dots str_repeat('.'max(0$columns $textWidth $spaceBuffer));

            
// Truncate source if it doesn't fit, but ensure command is always fully visible.
            
if ($textWidth $spaceBuffer $columns) {
                
$availableSourceWidth max(
                    
0,
                    
$columns mb_strwidth($label) - mb_strwidth($command) - mb_strwidth($dots) - $spaceBuffer
                
);

                
$source = (new Stringable($source))->limit($availableSourceWidth 1'…')->value();
            }

            
$this->line(
                
sprintf(
                    
'  <fg=%s>%s</> %s <fg=#6C7280>%s%s</>',
                    
$devCommand['color'],
                    
$label,
                    
$command,
                    
$dots,
                    
$source,
                ),
            );
        }

        
$countText 'Showing ['.count($devCommands).'] dev '.(count($devCommands) === 'command' 'commands').' ';

        
$countSpaces max(0$columns mb_strwidth($countText) - 1);
        
$spaces str_repeat(' '$countSpaces);

        
$this->newLine();
        
$this->line($spaces.'<fg=blue;options=bold>'.$countText.'</>');
        
$this->newLine();

        return 
self::SUCCESS;
    }

    
/**
     * Determine if the given command is registered by a vendor package.
     *
     * @param  array  $command
     * @return bool
     */
    
protected function isVendorCommand(array $command): bool
    
{
        return 
$command['priority'] === DevCommand::PRIORITY_VENDOR;
    }

    
/**
     * Determine if any filtering options are active.
     *
     * @return bool
     */
    
protected function isFiltering(): bool
    
{
        return 
$this->option('filter') || $this->option('except-vendor') || $this->option('only-vendor');
    }

    
/**
     * Filter the given commands based on the provided options.
     *
     * @param  array  $commands
     * @return array
     */
    
protected function filterCommands(array $commands): array
    {
        if (
$this->option('filter')) {
            
$commands array_filter(
                
$commands,
                
fn ($command) => str_contains($command['name'], $this->option('filter')) || str_contains($command['command'], $this->option('filter')),
            );
        }

        if (
$this->option('except-vendor')) {
            
$commands array_filter(
                
$commands,
                
fn ($command) => ! $this->isVendorCommand($command),
            );
        }

        if (
$this->option('only-vendor')) {
            
$commands array_filter(
                
$commands,
                
$this->isVendorCommand(...),
            );
        }

        return 
array_values($commands);
    }

    
/**
     * Format the source information for display.
     *
     * @param  array{'file': string, 'line': int, 'class'?: string, 'function'?: string}  $source
     * @return string
     */
    
protected function formatSource($source): string
    
{
        
$file $source['file'] ?? null;
        
$line $source['line'] ?? null;
        
$class $source['class'] ?? null;
        
$function $source['function'] ?? null;

        if (
$class) {
            return 
"{$class}@{$function}";
        }

        return 
implode(':'array_filter([$file$line]));
    }

    
/**
     * Get the console command options.
     *
     * @return array
     */
    
protected function getOptions()
    {
        return [
            [
'json'nullInputOption::VALUE_NONE'Output the dev process list as JSON'],
            [
'filter'nullInputOption::VALUE_REQUIRED'Filter the dev processes by name or command'],
            [
'except-vendor'nullInputOption::VALUE_NONE'Do not display dev processes registered by vendor packages'],
            [
'only-vendor'nullInputOption::VALUE_NONE'Only display dev processes registered by vendor packages'],
        ];
    }
}
Онлайн: 2
Реклама