I recently needed a few scripts that run as cronjobs. Symfony has something like the Console Component which gives the possibility to create command line interfaces for your code.
The people from KNPLabs created a ConsoleServiceProvider which Provides a Symfony\Component\Console
based console for Silex. Registering this service provider is easy as registering any other service provider. First step is adding the knplabs/console-service-provider to the composer.json file and running composer update.
{ "require": { ... "knplabs/console-service-provider": "dev-master" }, "autoload": { "psr-0": {"": "src/"} } }
Next we’ll register the service and set some options:
use Knp\Provider\ConsoleServiceProvider; /** * Console Service Provider * */ $app->register(new ConsoleServiceProvider(), array( 'console.name' => 'ConsoleApp', 'console.version' => '1.0.0', 'console.project_directory' => __DIR__ . '/..' ));
Next up we’ll have to create a command script which extends the Knp\Command\Command. You’ll have to implement two methods to configure and execute a command. The configure method just defines what kind of commands are available and what kind of options you can use.
protected function configure() { $this ->setName('import') ->setDescription('Import all data.') ->addArgument( 'userId', InputArgument::OPTIONAL, 'Import for a specific user' ) ->addOption( 'debug', null, InputOption::VALUE_NONE, 'If set, the task will run in debug mode' ) ; // nice, new line }
If you need the Silex\Application $app you can retrieve it using the getSilexApplication() function (available in the Knp\Command\Command namespace).
Next we need a console script which will use the Command created earlier. This will look something like this:
Tip: If the executing fails, try php -d display_errors script.php to check syntax mistakes.
The execute commands looks like this:
protected function execute(InputInterface $input, OutputInterface $output) { // use $input->getArgument('userId'); and $input->getOption('debug') }
This is actually all you need to do. The configuration in your ImportCommand file will basically tell your console how to use it. Running [path to console file] without arguments will give you output about how to use your options and commands. (ex. app/console/imports).
Wow! Now you can while(true) or for(;;) the shit out of your application!
How does your bootstrap.php look like?
I created a silex-base repo where my bootstrap.php file is available.
You can find it here: https://github.com/kendepelchin/silex-base/blob/master/app/bootstrap.php
Great article, thanks man!