Bonjour à tous,
J'aimerai mettre en place un systeme de "Maintenance" sur mon app quand il sera en production.
Le systeme retournerai un message "site en maintenance" au visiteur.
J'ai commencé à coder ceci :
/app/Config/bootstrap.php
Configure::write('App.maintenance', true);
/app/Controller/appController.php
<?php
App::uses('Controller', 'Controller');
class AppController extends Controller {
public function beforeFilter() {
if (Configure::read('App.maintenance')) {
if ($this->Session->read('Auth.User.id') != 1) {
throw new Exception('Site en maintenance', 503);
}
}
}
}
J'ai cru comprendre dans la doc qu'on pouvait créer des exceptions personnalisées, mais je n’y arrive que partiellement :/
En effet quand le debug > 0 l'app retourne systématiquement une erreur 500 "Erreur interne".
Pouvez vous m'aider ?
Merci !
Salut,
Je vais te donner ma solution. En fait je fais a peu près ce que tu fais à part que j'ai créer un layout spécial pour la maintenance, plutôt que de générer une exception.
Donc j'ai un model, tout ce qui a de plus basique qui récupérer les paramètres de l'application depuis une table de configuration (key - value) qui contient les paramètres généraux de l'application et entre autre une clé maintenance et une clé maintenance_message :
<?php
App::uses('AppModel', 'Model');
App::uses('Sanitize', 'Utility');
class Configuration extends AppModel{
public function load() {
$settings = $this->find('all', array(
'fields' => array('key', 'value')
));
foreach ($settings as $variable) {
Configure::write ( 'App.'.$variable'Configuration']'key'], $variable'Configuration']'value'] );
}
}
public function write($data){
foreach($data as $key => $value){
$this->updateAll(
array('Configuration.value' => is_numeric($value) ? $value : '\'' . Sanitize::escape($value, 'default') . '\''),
array('Configuration.key LIKE ' => $key)
);
}
}
}
?>
Puis dans mon AppController :
public function beforeFilter() {
$this->Configuration->load();
if( Configure::read('App.maintenance') ){
if(!$this->Auth->user('id') || $this->Auth->user('role') != 'admin' ){
$maintenance_message = Configure::read('App.maintenance_message');
$title_for_layout = __('Maintenance');
$this->layout = 'maintenance';
$this->set(compact('title_for_layout', 'maintenance_message'));
}
}
}
Ensuite, dans ton backend, tu créer un textarea et une checkbox qui permette de modifier ces valeurs. Tu as donc ainsi un système de maintenance fonctionnel et administrable.
Voila, en espérant que ça aide. a+