#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]);
}
}
}