Page 1 sur 1

Passer une commande shell via Symfony

Posté : 07 mars 2019, 05:48
par Patriboom
Bonjour,

je suis tout blanc avec Symfony, j'ignorais même que c'était installé sur mon serveur.
Dans mon projet de billets https://github.com/pixeline/bugs/

(en fait, c'est un projet orphelin que j'ai mis à jour)

Je trouve le fichier suivant
https://github.com/pixeline/bugs/tree/m ... /Shell.php

Je me dis alors que ce pourrait m'aider à passer une commande en console.

Mais voilà. Je n'ai aucune idée par où commencer.
Ici https://stackoverflow.com/questions/640 ... -php-shell , je trouve du code est des explications qui me mettent sur une piste.
<?php
namespace Acme\FooBundle\Command;

use Symfony\Bundle\FrameworkBundle\Command\Command,
    Symfony\Component\Console\Input\InputOption,
    Symfony\Component\Console\Input\InputInterface,
    Symfony\Component\Console\Output\OutputInterface;

class BarCommand extends Command
{

    protected function configure()
    {
        $this
            ->setName('foo:bar-cmd')
            ->setDescription('Test command')
            ->addOption('baz', null, InputOption::VALUE_NONE, 'Test option');
        ;
    }

    /**
     * Execute the command
     * The environment option is automatically handled.
     */
    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $output->writeln('Test command');
    }
}
C'est complété par
You can then run the command with:

$> app/console foo:bar-cmd

And pass in options like:

$> app/console foo:bar-cmd  --baz
Mais je suis trop enfoncé dans le statut de « débutant » avec symfony pour y comprendre un peu.
C'est charmant en console, mais moi je veux l'intégrer à du code PHP.
C'est quoi ce « bundle » dont il est question ?
La page mentionnée dit « tu crées un fichier Command » dans ton bundle.

Mon objectif est simple:
passer la commande « git pull » en PHP pour automatiser la mise à jour de l'application Bugs.

J'ai toujours programmé en style procédurale, mais voici que la programmation objet s'impose.
Comment créerai-je l'objet de mon rêve ?
Comment lui ferai-je exécuter ma commande ?

Merci

Re: Passer une commande shell via Symfony

Posté : 07 mars 2019, 06:13
par Patriboom
Je tente ceci:
require_once "vendor/Symfony/Component/Console/Application.php";
require_once "vendor/Symfony/Component/Console/Shell.php";
$app = new Application('myapp', '1.0 (stable)');
$app->add(new SimpleCommand());
$app->run();
et j'obtiens l'erreur suivante:
Class 'Application' not found


Pourtant, le fichier [...]/Console/Application.php commence bien ainsi:
/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console;

use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\ArgvInput;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Input\InputDefinition;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Output\Output;
use Symfony\Component\Console\Output\ConsoleOutput;
use Symfony\Component\Console\Output\ConsoleOutputInterface;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Command\HelpCommand;
use Symfony\Component\Console\Command\ListCommand;
use Symfony\Component\Console\Helper\HelperSet;
use Symfony\Component\Console\Helper\FormatterHelper;
use Symfony\Component\Console\Helper\DialogHelper;

/**
 * An Application is the container for a collection of commands.
 *
 * It is the main entry point of a Console application.
 *
 * This class is optimized for a standard CLI environment.
 *
 * Usage:
 *
 *     $app = new Application('myapp', '1.0 (stable)');
 *     $app->add(new SimpleCommand());
 *     $app->run();
 *
 * @author Fabien Potencier <fabien@symfony.com>
 *
 * @api
 */
class Application
{
Pourquoi ne puis-je donc pas créé cet objet ?

J'avais antérieurement tenté ceci:
require_once "vendor/Symfony/Component/Console/Application.php";
require_once "vendor/Symfony/Component/Console/Shell.php";
$process = new Shell();
et j'obtins le même message d'erreur
Class 'Shell' not found


Alors que lui aussi commence par une définition de classe:
/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\Console;

use Symfony\Component\Console\Application;
use Symfony\Component\Console\Input\StringInput;
use Symfony\Component\Console\Output\ConsoleOutput;
use Symfony\Component\Process\ProcessBuilder;
use Symfony\Component\Process\PhpExecutableFinder;

/**
 * A Shell wraps an Application to add shell capabilities to it.
 *
 * Support for history and completion only works with a PHP compiled
 * with readline support (either --with-readline or --with-libedit)
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Martin Hasoň <martin.hason@gmail.com>
 */
class Shell
{
Merci

Re: Passer une commande shell via Symfony

Posté : 18 mars 2019, 12:47
par Maitrepylos
Bonjour,
Essayez ceci :

Code : Tout sélectionner

$app = new \Application('myapp', '1.0 (stable)');

Re: Passer une commande shell via Symfony

Posté : 18 mars 2019, 14:29
par Patriboom
Merci MaitrePylos,

ce me semble progresser, mais ça ne fonctionne toujours pas.
Voici mon code :
//		require_once "vendor/Symfony/Component/Console/Application.php";
//		require_once "vendor/Symfony/Component/Console/Shell.php";
		use Symfony\Component\Console\Shell;
		$app = new Shell('myapp', '1.0 (stable)');
		$app->add("ls -la");
		$app->run(); 
Et voici le résultat.
Argument 1 passed to Symfony\Component\Console\Shell::__construct() must be an instance of Symfony\Component\Console\Application, string given
Le numéro de ligne retourné par le message d'erreur pointe sur la ligne d'appel « new Shell ... »
C'est vraisemblablement la valeur myapp qui ne satisfait pas aux critères.
Comment puis-je trouver l'objet « myapp » créé par mon application ?
Comment le créer ?
Merci


PS
Avec le trait oblique tu me proposais j'obtiens un message d'erreur tout autre.
//		require_once "vendor/Symfony/Component/Console/Application.php";
//		require_once "vendor/Symfony/Component/Console/Shell.php";
		use Symfony\Component\Console\Shell;
		$app = new \Shell('myapp', '1.0 (stable)');
		$app->add("ls -la");
		$app->run(); 
Error rendering view: [administration.index]
Class 'Shell' not found

Re: Passer une commande shell via Symfony

Posté : 18 mars 2019, 14:37
par Patriboom
Dans Laravel 3, je trouve ceci au fichier core.php
Autoloader::namespaces(array(
	'Symfony\Component\Console' 
                    => path('sys').'vendor/Symfony/Component/Console',
	'Symfony\Component\HttpFoundation'
                    => path('sys').'vendor/Symfony/Component/HttpFoundation',
));
Je soupçonne que je doive exploiter ceci pour créer une instance de « myapp »

Je tente donc de créer une telle instance ainsi:
$myapp = Autoloader::namespaces(array(
	'Symfony\Component\Console' => path('sys').'vendor/Symfony/Component/Console',
	'Symfony\Component\Shell'	 => path('sys').'vendor/Symfony/Component/Shell',
));

		use Symfony\Component\Console\Shell;
		$app = new Shell($myapp, '1.0 (stable)');
		$app->add("ls -la");
		$app->run(); 
et obtiens toujours le même résultat:
Argument 1 passed to Symfony\Component\Console\Shell::__construct() must be an instance of Symfony\Component\Console\Application, null given,

Re: Passer une commande shell via Symfony

Posté : 18 mars 2019, 17:23
par Maitrepylos
Honnêtement je ne comprend pas ce que tu essayes de faire, mais d'après le message d'erreur mon premier réflexe serait de faire ceci :

Code : Tout sélectionner

// require_once "vendor/Symfony/Component/Console/Application.php"; // require_once "vendor/Symfony/Component/Console/Shell.php"; use Symfony\Component\Console\Shell; use Symfony\Component\Console\Application; $app = new Shell(new Application(), '1.0 (stable)'); $app->add("ls -la"); $app->run();

Re: Passer une commande shell via Symfony

Posté : 18 mars 2019, 19:12
par Patriboom
Mon but ultime est de faire une vérification de mise à jour via la commande git status.

Retour sur la suggestion: oui l'idée est bonne de faire (new Shell(new Application)) ... .mais c'est un peu là le début de ma première question à savoir comment s'appelle la classe fondamentale de Symfony et comment l'appeler. La ligne suggérée, si bêtement appliquée telle quelle retourne inévitablement « Application » not defined.

Re: Passer une commande shell via Symfony

Posté : 19 mars 2019, 10:04
par Maitrepylos
Dans ce cas vous devez étendre bin/console https://symfony.com/doc/current/console.html

Re: Passer une commande shell via Symfony

Posté : 19 mars 2019, 13:36
par Patriboom
Merci beaucoup, MaitrePylos, ce me semble bien être ce que je cherchais.