Перенаправление на другой контроллер с флэш-сообщением — Cakephp 3

#php #exception #cakephp #components #cakephp-3.0

#php #исключение #cakephp #Компоненты #cakephp-3.0

Вопрос:

Есть способ перенаправить с компонента на другой контроллер (не тот, который вызвал компонент) с помощью флэш-сообщения? Что-то вроде:

 namespace AppControllerComponent;

use CakeControllerComponent;

class ValidateValueComponent extends Component
{
    public function validateValue($var = null){
        try{
            if(!$var){
                throw new Exception();
            }
        } catch(Exception $e){
            $action = $this->request->params['action'] === 'index' ? 'home' : $this->request->params['action'];
            $controller = $action === 'home' ? 'Home' : $this->request->params['controller'];

            $this->_registry->getController()->Flash->error(__('Message!'));
            // $this->_registry->getController()->redirect(['controller' => $controller, 'action' => $action]);
        }
    }
}
  

Я хочу проверить некоторые значения и избежать прерывания выполнения. Если в $var нет значения (не пустого), я хочу проверить, была ли ошибка вызвана методом индекса, если да, отправьте пользователя на домашнюю страницу (HomeController) с флэш-сообщением. В другом случае просто отправьте пользователя в индекс с контроллера, который зафиксировал ошибку, и покажите флэш-сообщение.

Этот приведенный выше код позволяет мне отображать флэш-память или перенаправлять, но я не могу выполнить их оба.

В любом случае,

Спасибо вам всем!

Комментарии:

1. Исправляю, где я написал no value (не пустой) Я имею в виду пустой..

2. Для сохранения флэш-сообщений при перенаправлениях требуется использование сеанса, поэтому убедитесь, что ваш сеанс работает, т. Е. Убедитесь, что установлен / отправлен файл cookie сеанса. Также проверьте свои журналы отладки / ошибок на предмет возможных проблем, связанных с заголовками.

3. У вас есть какой-нибудь справочный код или использовать пример? Я буду искать это.

4. Вы сказали, что иногда можете показывать флэш-сообщение, поэтому ваш сеанс, по-видимому, в порядке. Я удивлен, что код, который вы показываете, может когда-либо выполнить перенаправление, хотя, как правило, это делается путем возврата запроса на перенаправление из действия контроллера; вы не возвращаете перенаправление здесь, и вы не находитесь в действии контроллера.

5. Ops, забыл о возврате.. в любом случае, поскольку вы уже помогаете мне, вы знаете, есть ли способ использовать $this-> перенаправление с префиксом? Используя массив опций или что-то в этом роде .. спасибо

Ответ №1:

На самом деле я решил, используя эту ссылку изbookstack.cn но через стену мне нужно было вызвать компонент Flash в моем массиве $ components, а затем использовать его в обычном режиме, независимо от контроллера, который вызвал компонент. Что-то вроде:

 namespace AppControllerComponent;

use CakeControllerComponent;

class ValidateValueComponent extends Component
{
    public $components = ['Flash'];

    public function validateValue($var = null){
        try{
            if(!$var){
                throw new Exception();
            }
        } catch(Exception $e){
            $action = $this->request->params['action'] === 'index' ? 'home' : $this->request->params['action'];
            $controller = $action === 'home' ? 'Home' : $this->request->params['controller'];

            $this->Flash->set(__('Message!'));
            return $this->_registry->getController()->redirect(['controller' => $controller, 'action' => $action]);
        }
    }
}