Validator.php 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  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. * @author <rocco@roccosportal.com>
  12. * @license MIT License (http://www.opensource.org/licenses/mit-license.php)
  13. */
  14. class Validator
  15. {
  16. /**
  17. * List of types which are valid for tree fields
  18. *
  19. * @var array
  20. */
  21. private $validTypes = array(
  22. 'integer',
  23. 'smallint',
  24. 'bigint',
  25. 'int',
  26. );
  27. /**
  28. * List of types which are valid for the path (materialized path strategy)
  29. *
  30. * @var array
  31. */
  32. private $validPathTypes = array(
  33. 'string',
  34. 'text',
  35. );
  36. /**
  37. * List of types which are valid for the path source (materialized path strategy)
  38. *
  39. * @var array
  40. */
  41. private $validPathSourceTypes = array(
  42. 'id',
  43. 'integer',
  44. 'smallint',
  45. 'bigint',
  46. 'string',
  47. 'int',
  48. 'float',
  49. );
  50. /**
  51. * List of types which are valid for the path hash (materialized path strategy)
  52. *
  53. * @var array
  54. */
  55. private $validPathHashTypes = array(
  56. 'string',
  57. );
  58. /**
  59. * List of types which are valid for the path source (materialized path strategy)
  60. *
  61. * @var array
  62. */
  63. private $validRootTypes = array(
  64. 'integer',
  65. 'smallint',
  66. 'bigint',
  67. 'int',
  68. 'string',
  69. 'guid',
  70. );
  71. /**
  72. * Checks if $field type is valid
  73. *
  74. * @param object $meta
  75. * @param string $field
  76. *
  77. * @return boolean
  78. */
  79. public function isValidField($meta, $field)
  80. {
  81. $mapping = $meta->getFieldMapping($field);
  82. return $mapping && in_array($mapping['type'], $this->validTypes);
  83. }
  84. /**
  85. * Checks if $field type is valid for Path field
  86. *
  87. * @param object $meta
  88. * @param string $field
  89. *
  90. * @return boolean
  91. */
  92. public function isValidFieldForPath($meta, $field)
  93. {
  94. $mapping = $meta->getFieldMapping($field);
  95. return $mapping && in_array($mapping['type'], $this->validPathTypes);
  96. }
  97. /**
  98. * Checks if $field type is valid for PathSource field
  99. *
  100. * @param object $meta
  101. * @param string $field
  102. *
  103. * @return boolean
  104. */
  105. public function isValidFieldForPathSource($meta, $field)
  106. {
  107. $mapping = $meta->getFieldMapping($field);
  108. return $mapping && in_array($mapping['type'], $this->validPathSourceTypes);
  109. }
  110. /**
  111. * Checks if $field type is valid for PathHash field
  112. *
  113. * @param object $meta
  114. * @param string $field
  115. *
  116. * @return boolean
  117. */
  118. public function isValidFieldForPathHash($meta, $field)
  119. {
  120. $mapping = $meta->getFieldMapping($field);
  121. return $mapping && in_array($mapping['type'], $this->validPathHashTypes);
  122. }
  123. /**
  124. * Checks if $field type is valid for LockTime field
  125. *
  126. * @param object $meta
  127. * @param string $field
  128. *
  129. * @return boolean
  130. */
  131. public function isValidFieldForLockTime($meta, $field)
  132. {
  133. $mapping = $meta->getFieldMapping($field);
  134. return $mapping && ($mapping['type'] === 'date' || $mapping['type'] === 'datetime' || $mapping['type'] === 'timestamp');
  135. }
  136. /**
  137. * Checks if $field type is valid for Root field
  138. *
  139. * @param object $meta
  140. * @param string $field
  141. *
  142. * @return boolean
  143. */
  144. public function isValidFieldForRoot($meta, $field)
  145. {
  146. $mapping = $meta->getFieldMapping($field);
  147. return $mapping && in_array($mapping['type'], $this->validRootTypes);
  148. }
  149. /**
  150. * Validates metadata for nested type tree
  151. *
  152. * @param object $meta
  153. * @param array $config
  154. *
  155. * @throws InvalidMappingException
  156. */
  157. public function validateNestedTreeMetadata($meta, array $config)
  158. {
  159. $missingFields = array();
  160. if (!isset($config['parent'])) {
  161. $missingFields[] = 'ancestor';
  162. }
  163. if (!isset($config['left'])) {
  164. $missingFields[] = 'left';
  165. }
  166. if (!isset($config['right'])) {
  167. $missingFields[] = 'right';
  168. }
  169. if ($missingFields) {
  170. throw new InvalidMappingException("Missing properties: ".implode(', ', $missingFields)." in class - {$meta->name}");
  171. }
  172. }
  173. /**
  174. * Validates metadata for closure type tree
  175. *
  176. * @param object $meta
  177. * @param array $config
  178. *
  179. * @throws InvalidMappingException
  180. */
  181. public function validateClosureTreeMetadata($meta, array $config)
  182. {
  183. $missingFields = array();
  184. if (!isset($config['parent'])) {
  185. $missingFields[] = 'ancestor';
  186. }
  187. if (!isset($config['closure'])) {
  188. $missingFields[] = 'closure class';
  189. }
  190. if ($missingFields) {
  191. throw new InvalidMappingException("Missing properties: ".implode(', ', $missingFields)." in class - {$meta->name}");
  192. }
  193. }
  194. /**
  195. * Validates metadata for materialized path type tree
  196. *
  197. * @param object $meta
  198. * @param array $config
  199. *
  200. * @throws InvalidMappingException
  201. */
  202. public function validateMaterializedPathTreeMetadata($meta, array $config)
  203. {
  204. $missingFields = array();
  205. if (!isset($config['parent'])) {
  206. $missingFields[] = 'ancestor';
  207. }
  208. if (!isset($config['path'])) {
  209. $missingFields[] = 'path';
  210. }
  211. if (!isset($config['path_source'])) {
  212. $missingFields[] = 'path_source';
  213. }
  214. if ($missingFields) {
  215. throw new InvalidMappingException("Missing properties: ".implode(', ', $missingFields)." in class - {$meta->name}");
  216. }
  217. }
  218. }