SlugAssigner.php 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. <?php
  2. namespace PhpDevCommunity\PaperORM\Assigner;
  3. use InvalidArgumentException;
  4. use LogicException;
  5. use PhpDevCommunity\PaperORM\Collection\ObjectStorage;
  6. use PhpDevCommunity\PaperORM\Mapper\ColumnMapper;
  7. use PhpDevCommunity\PaperORM\Mapping\Column\Column;
  8. use PhpDevCommunity\PaperORM\Mapping\Column\SlugColumn;
  9. use PhpDevCommunity\PaperORM\Tools\EntityAccessor;
  10. use PhpDevCommunity\PaperORM\Tools\Slugger;
  11. final class SlugAssigner implements ValueAssignerInterface
  12. {
  13. public function assign(object $entity, Column $column): void
  14. {
  15. if (!$column instanceof SlugColumn) {
  16. throw new InvalidArgumentException(sprintf(
  17. 'SlugAssigner::assign(): expected instance of %s, got %s.',
  18. SlugColumn::class,
  19. get_class($column)
  20. ));
  21. }
  22. if (EntityAccessor::getValue($entity, $column->getProperty()) !== null) {
  23. return;
  24. }
  25. $storage = new ObjectStorage(ColumnMapper::getColumns($entity));
  26. $from = $column->getFrom();
  27. $separator = $column->getSeparator();
  28. $values = [];
  29. foreach ($from as $field) {
  30. $col = $storage->findOneByMethod('getProperty', $field);
  31. if (!$col instanceof Column) {
  32. throw new LogicException(sprintf(
  33. 'Cannot set slug: expected column "%s" in entity "%s".',
  34. $field,
  35. get_class($entity)
  36. ));
  37. }
  38. $values[$field] = EntityAccessor::getValue($entity, $field);
  39. }
  40. EntityAccessor::setValue($entity, $column->getProperty(), Slugger::slugify($values, $separator));
  41. }
  42. }