Jdi na navigaci předmětu

Command Line Interface (console)

Samostatně spustitelný skript

  • skript samostatně spustitelný

    #!/usr/bin/env php
    <?php
    if($argc != 3) {
    	echo "Usage {$argv[0]} <input> <output>\n";
    	exit(0);
    }
    
    file_put_contents($argv[2], file_get_contents($argv[1]));
    $ chmod +x cp.php
    $ ./cp.php

Argumenty příkazové řádky

  • rezervované proměnné
    • $argc - počet argumentů
    • $argv - pole argumentů
    • $argv[0] - název skriptu

Přepínače z příkazové řádky

  • getopt - vychází z shellového getopt(s)
$shortopts  = "";
$shortopts .= "f:";  // přepínač s povinnou hodnotou
$shortopts .= "v::"; // přepínač s volitelnou hodnotou
$shortopts .= "abc"; // přepínače bez hodnoty

$longopts  = array(
    "required:",     // přepínač s povinnou hodnotou
    "optional::",    // přepínač s volitelnou hodnotou
    "option",        // přepínače bez hodnoty
    "opt",           // přepínače bez hodnoty
);
$options = getopt($shortopts, $longopts);
var_dump($options);

Přepínače z příkazové řádky - volání

$ php getopt.php -f "value for f" -v -a --required value --optional="optional value" --option
array(6) {
  ["f"]         =>  string(11) "value for f"
  ["v"]         =>  bool(false)
  ["a"]         =>  bool(false)
  ["required"]  =>  string(5) "value"
  ["optional"]  =>  string(14) "optional value"
  ["option"]    =>  bool(false)
}

Symfony Console

  • instalace

    composer require symfony/console
  • dokumentace
  • konzolová aplikace Symfony\Component\Console\Application
  • jednotlivé příkazy dědí od Symfony\Component\Console\Command\Command
    • nastavení configure() - název, popis, argumenty, přepínače
    • provádění příkazu execute()

Aplikace

  • jednotlivé příkazy se zaregistrují pomocí add()

    require 'vendor/autoload.php';
    
    use Symfony\Component\Console\Application;
    
    $app = new Application();
    $app->add(new ResizeCommand());
    // ...
    $app->run();

Konfigurace příkazu - název

  • pomocí PHP atributu AsCommand

    #[AsCommand(name: 'hello:world')]
    class HelloWorldCommand extends Command
  • nebo pomocí třídní proměnné protected static $defaultName = 'image:resize' (deprecated) nebo
  • nebo pomocí metody setName

Příkazy se často člení do skupin podle :, při volání stačí použít jednoznačnou zkratku

+

$ php cli.php i:r -w320 picture.png

Konfigurace příkazu - popis, nápověda

  • popis
  • nápověda (--help)

    protected function configure()
    {
        $this
            ->setName('image:resize')
            ->setDescription('Resize image')
            ->setHelp('Resize PNG or JPEG and save result to new file')
            // ...
        ;
    }

Konfigurace příkazu - argumenty a přepínače

  • argumenty

    $this->addArgument('input', InputArgument::REQUIRED, 'Input image file')
    • REQUIRED, OPTIONAL, IS_ARRAY - více hodnot (lze kombinovat s dvěma předchozími)
  • přepínače

    $this->addOption(                   // -w320, -w 320, --width 320, --width=320
        'width',                        // dlouhá varianta
        'w',                            // krátká varianta
        InputOption::VALUE_REQUIRED,
        'Output image width',
        640                             // výchozí hodnota
    );
    • VALUE_NONE, VALUE_REQUIRED, VALUE_OPTIONAL, VALUE_IS_ARRAY - více hodnot (lze kombinovat s dvěma předchozími)
  • Understanding how Console Arguments and Options Are Handled

Provádění příkazu

protected function execute(InputInterface $input, OutputInterface $output)
  • vstup
    • $input->getArgument('…​')
    • $input->getOption('…​')
  • výstup
    • $output->write('…​')
    • $output->writeln('…​')
    • …​