PageRenderTime 49ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 0ms

/core/Associates/FakerMaster/src/Faker/ORM/Mandango/EntityPopulator.php

https://gitlab.com/fiesta-framework/Documentation
PHP | 110 lines | 78 code | 19 blank | 13 comment | 7 complexity | c95d67936eff02644989baf5d4c957bd MD5 | raw file
  1. <?php
  2. namespace Faker\ORM\Mandango;
  3. use Mandango\Mandango;
  4. use Faker\Provider\Base;
  5. /**
  6. * Service class for populating a table through a Mandango ActiveRecord class.
  7. */
  8. class EntityPopulator
  9. {
  10. protected $class;
  11. protected $columnFormatters = array();
  12. /**
  13. * Class constructor.
  14. *
  15. * @param string $class A Mandango ActiveRecord classname
  16. */
  17. public function __construct($class)
  18. {
  19. $this->class = $class;
  20. }
  21. public function getClass()
  22. {
  23. return $this->class;
  24. }
  25. public function setColumnFormatters($columnFormatters)
  26. {
  27. $this->columnFormatters = $columnFormatters;
  28. }
  29. public function getColumnFormatters()
  30. {
  31. return $this->columnFormatters;
  32. }
  33. public function mergeColumnFormattersWith($columnFormatters)
  34. {
  35. $this->columnFormatters = array_merge($this->columnFormatters, $columnFormatters);
  36. }
  37. public function guessColumnFormatters(\Faker\Generator $generator, Mandango $mandango)
  38. {
  39. $formatters = array();
  40. $nameGuesser = new \Faker\Guesser\Name($generator);
  41. $columnTypeGuesser = new \Faker\ORM\Mandango\ColumnTypeGuesser($generator);
  42. $metadata = $mandango->getMetadata($this->class);
  43. // fields
  44. foreach ($metadata['fields'] as $fieldName => $field) {
  45. if ($formatter = $nameGuesser->guessFormat($fieldName)) {
  46. $formatters[$fieldName] = $formatter;
  47. continue;
  48. }
  49. if ($formatter = $columnTypeGuesser->guessFormat($field)) {
  50. $formatters[$fieldName] = $formatter;
  51. continue;
  52. }
  53. }
  54. // references
  55. foreach (array_merge($metadata['referencesOne'], $metadata['referencesMany']) as $referenceName => $reference) {
  56. if (!isset($reference['class'])) {
  57. continue;
  58. }
  59. $referenceClass = $reference['class'];
  60. $formatters[$referenceName] = function ($insertedEntities) use ($referenceClass) {
  61. if (isset($insertedEntities[$referenceClass])) {
  62. return Base::randomElement($insertedEntities[$referenceClass]);
  63. }
  64. };
  65. }
  66. return $formatters;
  67. }
  68. /**
  69. * Insert one new record using the Entity class.
  70. */
  71. public function execute(Mandango $mandango, $insertedEntities)
  72. {
  73. $metadata = $mandango->getMetadata($this->class);
  74. $obj = $mandango->create($this->class);
  75. foreach ($this->columnFormatters as $column => $format) {
  76. if (null !== $format) {
  77. $value = is_callable($format) ? $format($insertedEntities, $obj) : $format;
  78. if (isset($metadata['fields'][$column]) ||
  79. isset($metadata['referencesOne'][$column])) {
  80. $obj->set($column, $value);
  81. }
  82. if (isset($metadata['referencesMany'][$column])) {
  83. $adder = 'add'.ucfirst($column);
  84. $obj->$adder($value);
  85. }
  86. }
  87. }
  88. $mandango->persist($obj);
  89. return $obj;
  90. }
  91. }