Я написал компонент (isPilotFree), который делает некоторые проверки.
<?php
namespace App\Controller\Component;
use Cake\Controller\Component;
use Cake\Controller\Controller;
class SharedComponent extends Component
{
public $components = [ 'Flash' ];
/** check any pilot overlap
*
* @param string|null booking record
* @return true / false
**/
public function pilotIsFree( $booking, $who )
{
$controller = $this->_registry->getController();
$Bookings = $controller->Bookings;
$res = true;
if( $booking->id == null )
$booking_id = -1;
else
$booking_id = $booking->id;
if( $res )
{
$bookings = $Bookings->find( 'all' )->Where( [ 'provider_pk != ' => $booking->provider_pk, 'Bookings.id !=' => $booking_id, $who, 'start = ' => $booking->start ] );
$res = $bookings->count() == 0;
}
// deleted some lines for simplicity
... ... ...
if( !$res )
{
$this->Flash->error( __('The pilot is not available.') );
}
return( $res );
}
}
?>
Этот компонент вызывается из контроллера как:
if( $this->Shared->pilotIsFree( $booking, [ 'Bookings.requester_pk =' => $booking->requester_pk ] ) )
{
... ... ..
}
Компонент загружается в контроллер как:
/**
* Initialization method
*
* @return none
*/
public function initialize()
{
$this->loadComponent( 'Shared' );
}
Проблема, с которой я столкнулся сейчас, заключается в том, что вызов Flash внутри компонента работает нормально, но когда я пытаюсь вызвать флэш-сообщение из контроллера, я получаю эту ошибку:
Ошибка: вызов функции-члена success () для логического значения
Файл … / src / Controller / BookingsController.php
Линия: 191
Единственный способ, как я нашел, чтобы он работал нормально, это добавить в начале контроллера это:
public $ components = [‘Flash’];
Не предполагается, что флэш-компонент загружается в родительский класс AppController. На самом деле, если я не загружаю / не использую свой пользовательский компонент, я могу запускать Flash-сообщения изнутри контроллера, не добавляя предыдущую строку.
Я что-то пропустил ?
Благодарю.
С уважением.
Факундо.
Вы должны поместить это в свой контроллер.
public function initialize()
{
parent::initialize();
$this->loadComponent('Flash');
}
Или внутри AppController без parent::initialize();
Других решений пока нет …