La parte difícil de hacer esto dentro de la aplicación ZF es que, presumiblemente, su mantenimiento afectará a la aplicación. Por lo tanto, si la aplicación está "rota" durante el mantenimiento, existe el riesgo de que también se rompa una solución "integrada en la aplicación". En ese sentido, los enfoques "externos" como la modificación de .htaccess o el ajuste del archivo public/index.php
son probablemente más sólidos.
Sin embargo, un enfoque "dentro de la aplicación" podría utilizar un complemento de controlador frontal. En application/plugins/TimedMaintenance.php
:
class Application_Plugin_TimedMaintenance extends Zend_Controller_Plugin_Abstract
{
protected $start;
protected $end;
public function __construct($start, $end)
{
// Validation to ensure date formats are correct is
// left as an exercise for the reader. Ha! Always wanted
// to do that. ;-)
if ($start > $end){
throw new Exception('Start must precede end');
}
$this->start = $start;
$this->end = $end;
}
public function routeShutdown(Zend_Controller_Request_Abstract $request)
{
$now = date('Y-m-d H:i:s');
if ($this->start <= $now && $now <= $this->end){
$request->setModuleName('default')
->setControllerName('maintenance')
->setActionName('index');
}
}
}
luego registrar el plugin en application/Bootstrap.php
:
protected function _initPlugin()
{
$this->bootstrap('frontController');
$front = $this->getResource('frontController');
$start = '2012-01-15 05:00:00';
$end = '2012-01-15 06:00:00';
$plugin = new Application_Plugin_TimedMaintenance($start, $end);
$front->registerPlugin($plugin);
}
En la práctica, es posible que desee para empujar los tiempos de inicio/final hasta config. En application/configs/application.ini
:
maintenance.enable = true
maintenance.start = "2012-01-15 05:00:00"
maintenance.end = "2012-01-15 06:00:00"
entonces se podría modificar el registro plugin para parecerse a:
protected function _initPlugin()
{
$this->bootstrap('frontController');
$front = $this->getResource('frontController');
$config = $this->config['maintenance'];
if ($config['enable']){
$start = $config['start'];
$end = $config['end'];
$plugin = new Application_Plugin_TimedMaintenance($start, $end);
$front->registerPlugin($plugin);
}
}
De esta manera, puede activar el modo de mantenimiento, simplemente editando la entrada de configuración.
@Iznogood: Gracias por la edición. D'oh! ;-) –
¡No pasa nada! :) – Iznogood