Я пытаюсь создать сеансовое флэш-сообщение после перенаправления.
У меня есть класс контроллера
class Controller { function __construct() { if(!empty($_SESSION['FLASH'])) foreach($_SESSION['FLASH'] as $key => $val) $this->$key = $val; } function __destruct() { $_SESSION['FLASH']=null; } }
также у меня есть дочерний класс Controller Home, где функции выполняются по маршруту, например / Home / Index => public function index ()
class Home extends Controller { function __construct() { parent::__construct(); } public function index() { //where i want to display $this->message only once echo $this->message; // but $this->message is undefinded why? } public function Post_register(){ //after post form data // validation // this function redirect to /Home/Index above function index(); Uri::redirectToAction("Home","Index",array('message' => 'some message')); } }
и функция класса uri, где я перенаправляю пользователя.
public static function redirectToAction($controller,$method,$arr) { $_SESSION['FLASH'] = $arr; header("Location:/".$controller.'/'.$method); }
но сообщение $this->message
не определено почему?
В коде, который вы указали, $message
никогда не определяется как член класса Controller
или его производного класса Home
. Если вы хотите использовать эту переменную-член, вы должны объявить ее как член класса, сообщение IE public $message
и затем установить ее где-то в исполнении, предположительно в вашей функции Uri::redirectToAction
.
Это из-за вашего __destruct. Когда выполнение закончено, вызывается функция __destruct, и поэтому она отключает ваш $ _SESSION ['FLASH'], поэтому она больше не доступна в вашем скрипте.
От php manuel :
Метод деструктора будет вызываться, как только нет других ссылок на конкретный объект или в любом порядке во время последовательности выключения.
Просто удалите функцию __destruct.
Я написал библиотеку только для этого типа проектов https://github.com/tamtamchik/simple-flash .
Как только вы его установили, вы сможете это сделать.
В вашем redirectToAction
:
public static function redirectToAction($controller,$method,$arr) { flash($arr['message']); header("Location:/".$controller.'/'.$method); }
И в index
:
public function index() { echo flash()->display(); }
Он будет генерировать сообщения с бутстрапом.