El paso final para empezar a usar la aplicación, es programar nuestras propias acciones.
Bender está construido a partir del componente Console de Symfony 2.0. Leer la documentación sobre el componente no estará de más, y es una lectura bastante corta.
Volviendo sobre el tema del post, una acción no es más que una clase. Esa clase tiene muy pocos requisitos. Si revisamos la acción Sample/Simple, vamos a ver éste código.
namespace Action\Sample;
use Symfony\Component\Console as Console;
use Bender\Core as Core;
class Simple extends Core {
public function __construct($name = null) {
parent::__construct($name);
$this->setDescription('Test action used on development');
$this->setHelp('A simple action example.');
}
protected function execute(Console\Input\InputInterface $input, Console\Output\OutputInterface $output) {
$output->writeln(sprintf('Message: %s', $this->_getMessage()));
}
private function _getMessage() {
return 'Bite my shiny metal ass!';
}
}
A manera de ejemplo, voy a crear la acción Prueba.
Lo primero que vemos, es que se utilizan namespaces. En este caso, la definición deberá ser:
namespace Action
Y a continuación el path que corresponda a nuestra clase, según busquemos organizarla. Un ejemplo podría ser:
namespace Action\Dc;
En este caso, voy a utilizar Dc como namespace para organizar mis acciones, como si se tratara de un vendor (esto es totalmente arbitrario). Dicho esto, la ubicación física del archivo sería /Action/Dc/Prueba.php.
Luego del namepsace, necesitamos llamar a dos clases que son fundamentales:
use Symfony\Component\Console as Console;
use Bender\Core as Core;
La primera provee toda la lógica de consola y la segunda, propia de Bender, nos dará algunos (por ahora pocos) elementos para usar.
Ahora si, viene la definición de nuestra clase, la cual siempre deberá extender de Core (o de alguna otra clase que extienda de ella).
Para mi ejemplo, la definición sería:
class Prueba extends Core {}
Dentro de la clase, tenemos dos métodos que no pueden faltar: __construct y execute.
Para el primero, el código, en su versión más reducida, contendría lo siguiente (según mi ejemplo)
public function __construct($name = null) {
parent::__construct($name);
$this->setDescription('Acción de prueba');
}
Si repasan la documentación del componente, van a encontrar que hay escenarios en los cuales puede no invocarse el constructor y utilizar otro método, pero para nuestro básico ejemplo, vamos a considerar que es indispensable su uso.
Con el método execute es con quién vamos a jugar. Es dentro de éste método donde ocurre la acción en si misma.
Acá podemos usar lo que necesitemos, haciendo uso de otros métodos, plugins, funciones core, etc.
protected function execute(Console\Input\InputInterface $input, Console\Output\OutputInterface $output) {
$output->writeln('Hola Mundo!');
}
Mi método execute, en ese caso, simplemente va a imprimir el mensaje «Hola Mundo!», pero podría haber ejecutado una llamada a mi API preferida, hacer una consulta a una base de datos, o lo que nos imaginemos.
Si juntamos cada parte del ejemplo, la clase completa quedaría así.
namespace Action\Dc;
use Symfony\Component\Console as Console;
use Bender\Core as Core;
class Prueba extends Core {
public function __construct($name = null) {
parent::__construct($name);
$this->setDescription('Acción de prueba');
}
protected function execute(Console\Input\InputInterface $input, Console\Output\OutputInterface $output) {
$output->writeln('Hola Mundo!');
}
}
Una vez creado el archivo, sólo bastará con iniciar la consola de Bender, agregar la acción, crear la tarea y que el cron haga su parte.