Validator.php 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. <?php
  2. namespace Gedmo\Tree\Mapping;
  3. use Gedmo\Exception\InvalidMappingException;
  4. /**
  5. * This is a validator for all mapping drivers for Tree
  6. * behavioral extension, containing methods to validate
  7. * mapping information
  8. *
  9. * @author Gustavo Falco <comfortablynumb84@gmail.com>
  10. * @author Gediminas Morkevicius <gediminas.morkevicius@gmail.com>
  11. * @package Gedmo.Tree.Mapping
  12. * @subpackage Validator
  13. * @link http://www.gediminasm.org
  14. * @license MIT License (http://www.opensource.org/licenses/mit-license.php)
  15. */
  16. class Validator
  17. {
  18. /**
  19. * List of types which are valid for tree fields
  20. *
  21. * @var array
  22. */
  23. private $validTypes = array(
  24. 'integer',
  25. 'smallint',
  26. 'bigint',
  27. 'int'
  28. );
  29. /**
  30. * List of types which are valid for the path (materialized path strategy)
  31. *
  32. * @var array
  33. */
  34. private $validPathTypes = array(
  35. 'string',
  36. 'text'
  37. );
  38. /**
  39. * List of types which are valid for the path source (materialized path strategy)
  40. *
  41. * @var array
  42. */
  43. private $validPathSourceTypes = array(
  44. 'id',
  45. 'integer',
  46. 'smallint',
  47. 'bigint',
  48. 'string',
  49. 'int',
  50. 'float'
  51. );
  52. /**
  53. * List of types which are valid for the path source (materialized path strategy)
  54. *
  55. * @var array
  56. */
  57. private $validRootTypes = array(
  58. 'integer',
  59. 'smallint',
  60. 'bigint',
  61. 'int',
  62. 'string'
  63. );
  64. /**
  65. * Checks if $field type is valid
  66. *
  67. * @param object $meta
  68. * @param string $field
  69. * @return boolean
  70. */
  71. public function isValidField($meta, $field)
  72. {
  73. $mapping = $meta->getFieldMapping($field);
  74. return $mapping && in_array($mapping['type'], $this->validTypes);
  75. }
  76. /**
  77. * Checks if $field type is valid for Path field
  78. *
  79. * @param object $meta
  80. * @param string $field
  81. * @return boolean
  82. */
  83. public function isValidFieldForPath($meta, $field)
  84. {
  85. $mapping = $meta->getFieldMapping($field);
  86. return $mapping && in_array($mapping['type'], $this->validPathTypes);
  87. }
  88. /**
  89. * Checks if $field type is valid for PathSource field
  90. *
  91. * @param object $meta
  92. * @param string $field
  93. * @return boolean
  94. */
  95. public function isValidFieldForPathSource($meta, $field)
  96. {
  97. $mapping = $meta->getFieldMapping($field);
  98. return $mapping && in_array($mapping['type'], $this->validPathSourceTypes);
  99. }
  100. /**
  101. * Checks if $field type is valid for LockTime field
  102. *
  103. * @param object $meta
  104. * @param string $field
  105. * @return boolean
  106. */
  107. public function isValidFieldForLockTime($meta, $field)
  108. {
  109. $mapping = $meta->getFieldMapping($field);
  110. return $mapping && ($mapping['type'] === 'date' || $mapping['type'] === 'datetime' || $mapping['type'] === 'timestamp');
  111. }
  112. /**
  113. * Checks if $field type is valid for Root field
  114. *
  115. * @param object $meta
  116. * @param string $field
  117. * @return boolean
  118. */
  119. public function isValidFieldForRoot($meta, $field)
  120. {
  121. $mapping = $meta->getFieldMapping($field);
  122. return $mapping && in_array($mapping['type'], $this->validRootTypes);
  123. }
  124. /**
  125. * Validates metadata for nested type tree
  126. *
  127. * @param object $meta
  128. * @param array $config
  129. * @throws InvalidMappingException
  130. * @return void
  131. */
  132. public function validateNestedTreeMetadata($meta, array $config)
  133. {
  134. $missingFields = array();
  135. if (!isset($config['parent'])) {
  136. $missingFields[] = 'ancestor';
  137. }
  138. if (!isset($config['left'])) {
  139. $missingFields[] = 'left';
  140. }
  141. if (!isset($config['right'])) {
  142. $missingFields[] = 'right';
  143. }
  144. if ($missingFields) {
  145. throw new InvalidMappingException("Missing properties: " . implode(', ', $missingFields) . " in class - {$meta->name}");
  146. }
  147. }
  148. /**
  149. * Validates metadata for closure type tree
  150. *
  151. * @param object $meta
  152. * @param array $config
  153. * @throws InvalidMappingException
  154. * @return void
  155. */
  156. public function validateClosureTreeMetadata($meta, array $config)
  157. {
  158. $missingFields = array();
  159. if (!isset($config['parent'])) {
  160. $missingFields[] = 'ancestor';
  161. }
  162. if (!isset($config['closure'])) {
  163. $missingFields[] = 'closure class';
  164. }
  165. if ($missingFields) {
  166. throw new InvalidMappingException("Missing properties: " . implode(', ', $missingFields) . " in class - {$meta->name}");
  167. }
  168. }
  169. /**
  170. * Validates metadata for materialized path type tree
  171. *
  172. * @param object $meta
  173. * @param array $config
  174. * @throws InvalidMappingException
  175. * @return void
  176. */
  177. public function validateMaterializedPathTreeMetadata($meta, array $config)
  178. {
  179. $missingFields = array();
  180. if (!isset($config['parent'])) {
  181. $missingFields[] = 'ancestor';
  182. }
  183. if (!isset($config['path'])) {
  184. $missingFields[] = 'path';
  185. }
  186. if (!isset($config['path_source'])) {
  187. $missingFields[] = 'path_source';
  188. }
  189. if ($missingFields) {
  190. throw new InvalidMappingException("Missing properties: " . implode(', ', $missingFields) . " in class - {$meta->name}");
  191. }
  192. }
  193. }