/** * Save this builder as a named builder in the attached Dogmatist instance. * If no name is given, the typename is used. * If a builder already exists with the given name, then this method fails. Either * use `save()` on your Dogmatist instance directly, or choose a different name. * @param string $name The name under which the Builder should be stored. * @param int $generate The number of samples to generate, if less than * or equal to zero, unlimited samples will be generated. * @return $this */ public function save($name = null, $generate = -1) { if (null === $name) { $name = $this->getType(); } if ($this->dogmatist->getLinkManager()->has($name)) { throw new BuilderException("A builder with the name '{$name}' already exists"); } $this->dogmatist->save($this, $name, $generate); return $this; }
/** * @param Field $field * @param UniqueArrayObject $data * @return mixed * @throws SampleException */ private function sampleField(Field $field, UniqueArrayObject $data) { $faker = $this->dogmatist->getFaker(); $type = $field->getType(); $value = null; if (Field::TYPE_FAKE === $type) { try { $value = $faker->format($field->getFakedType(), $field->getFakedOptions()); } catch (\Exception $e) { throw new SampleException("Could not fake value of type {$field->getFakedType()}", 0, $e); } } elseif (Field::TYPE_VALUE === $type || Field::TYPE_SELECT === $type) { $value = $faker->randomElement($field->getSelection()); } elseif (Field::TYPE_RELATION === $type) { $related = $field->getRelated(); $value = $this->sample($related, $data); if ($related->hasParentLinks()) { $value = new ReplacableLink($value, $related->getParentLinks()); } } elseif (Field::TYPE_LINK === $type) { $target = $field->getLinkTarget(); if (is_array($target)) { $target = $faker->randomElement($target); } if ($this->dogmatist->getLinkManager()->hasUnlimitedSamples($target)) { $value = $this->dogmatist->sample($target); } else { $samples = $this->dogmatist->getLinkManager()->samples($target); $value = $faker->randomElement($samples); } } elseif (Field::TYPE_CALLBACK === $type) { $callback = $field->getCallback(); $value = $callback($data, $this->dogmatist); } else { throw new SampleException("Could not generate data for field of type {$field->getType()}"); } return $value; }