errors(); foreach ($entity->visibleProperties() as $property) { $v = $entity[$property]; if ($v instanceof EntityInterface) { $errors[$property] = $this->_getErrors($v); } elseif (is_array($v)) { foreach ($v as $key => $varValue) { if ($varValue instanceof EntityInterface) { $errors[$property][$key] = $this->_getErrors($varValue); } } } } return Hash::filter($errors); } /** * Shutdown event * * @param \Cake\Event\Event $event The event * @return void */ public function shutdown(Event $event) { $controller = $event->subject(); $errors = []; $walker = function (&$item) use (&$walker) { if ($item instanceof Collection || $item instanceof Query || $item instanceof ResultSet ) { try { $item = $item->toArray(); } catch (\Cake\Database\Exception $e) { //Likely issue is unbuffered query; fall back to __debugInfo $item = array_map($walker, $item->__debugInfo()); } catch (RuntimeException $e) { // Likely a non-select query. $item = array_map($walker, $item->__debugInfo()); } } elseif ($item instanceof Closure || $item instanceof PDO || $item instanceof SimpleXmlElement ) { $item = 'Unserializable object - ' . get_class($item); } elseif ($item instanceof Exception) { $item = sprintf( 'Unserializable object - %s. Error: %s in %s, line %s', get_class($item), $item->getMessage(), $item->getFile(), $item->getLine() ); } elseif (is_object($item) && method_exists($item, '__debugInfo')) { // Convert objects into using __debugInfo. $item = array_map($walker, $item->__debugInfo()); } return $item; }; // Copy so viewVars is not mutated. $vars = $controller->viewVars; array_walk_recursive($vars, $walker); foreach ($vars as $k => $v) { // Get the validation errors for Entity if ($v instanceof EntityInterface) { $errors[$k] = $this->_getErrors($v); } elseif ($v instanceof Form) { $formError = $v->errors(); if (!empty($formError)) { $errors[$k] = $formError; } } } $this->_data = [ 'content' => $vars, 'errors' => $errors ]; } /** * Get summary data for the variables panel. * * @return int */ public function summary() { if (!isset($this->_data['content'])) { return 0; } return count($this->_data['content']); } }