2017-03-27 1 views
0

Je travaille avec PHP Slim Framework dans la version 2.6.1 (en raison de certaines limitations pour mettre à jour PHP pas une version plus récente) et lorsque vous essayez d'utiliser messages flash à l'intérieur d'un bloc try/catch les messages ne sont pas stockés dans la session lorsque le modèle est rendu.Messages flash Slim ne fonctionnent pas à l'intérieur try {} catch() {}

Par exemple, le code ci-dessous fonctionne bien (lorsque le validateur obtenir une erreur la page est redirigé les messages flash souhaités):

$objValidation = FormValidator::isValidData($post); 

if($objValidation->bolHasError) 
{ 
    $app->flash('objValidation', serialize($objValidation)); 
    $app->flash('selectedData', $post); 
    return $app->redirect('/app/edit/form/components/'); 
} 

Mais si je commence à l'aide d'un bloc d'essai, comme ci-dessous, puis le message flash ne sont pas stockées dans le $ _SESSION (ou même dans le {{flash}} dans les modèles):

try { 
    $objValidation = FormValidator::isValidData($post); 

    if($objValidation->bolHasError) 
    { 
     $app->flash('objValidation', serialize($objValidation)); 
     $app->flash('selectedData', $post); 
     return $app->redirect('/app/edit/form/components/'); 
    } 

    # some other stuff processed here... 
} 
catch(Exception $e) { 
    # do something 
} 

PS: les sessions sont stockées dans la manière native PHP (session_start()).

La portée de l'utilisation des messages flash est-elle limitée?

+0

Etes-vous certain que le flux du script passe par la partie '$ app-> flass' dans le second exemple? – amenadiel

+0

@amenadiel Oui. J'ai essayé d'émuler plusieurs types d'erreurs. Et dans tous les cas, la ligne degug a été atteinte lors de l'exécution de cette partie du code. Je crois que le moyen le plus simple est d'élever et d'attraper une exception (une fois que je ne peux pas monter le bloc try car il y a beaucoup d'opérations de base de données dans ce bloc. –

Répondre

0

J'ai compris que le bloc try crée une "portée isolée". Donc, j'ai essayé de mettre un return false avant la redirection pour tester si la page suivante le message flash apparaîtrait. Et enfin le message flash a été stocké dans la variable $ _SESSION (bien sûr, la redirection n'a pas été exécutée, mais au moins j'ai découvert que le problème est lié à la portée try). Ensuite, la solution que j'ai trouvée consistait à lever une exception et à faire la redirection à l'intérieur du bloc catch. Comme ceci:

$objValidation = FormValidator::isValidData($post); 

if($objValidation->bolHasError) 
{ 
    throw new Exception('validation_error'); 
} 

puis capturer l'erreur dans le bloc catch:

catch(Exception $e) 
{ 
    if($e->getMessage() == 'validation_error') 
    { 
     $app->flash('objValidation', serialize($objValidation)); 
     $app->flash('formData', $post); 

     return $app->redirect('/api/form/change/components/'); 
    } 
} 

De cette façon, je suis en mesure d'obtenir le message flash en modèle.