src/Domain/Blog/Model/ArticleCategory.php line 18

Open in your IDE?
  1. <?php
  2. namespace Whater\Domain\Blog\Model;
  3. use BornFree\TacticianDomainEvent\Recorder\ContainsRecordedEvents;
  4. use BornFree\TacticianDomainEvent\Recorder\EventRecorderCapabilities;
  5. use Doctrine\Common\Collections\ArrayCollection;
  6. use Doctrine\Common\Collections\Collection;
  7. use Ramsey\Uuid\Uuid;
  8. use Assert\Assertion;
  9. use Whater\Domain\Common\Exception\InvalidUUIDException;
  10. /**
  11. * Class Article
  12. *
  13. * @package Whater\Domain\Blog\Model
  14. */
  15. class ArticleCategory implements ContainsRecordedEvents
  16. {
  17. use EventRecorderCapabilities;
  18. /**
  19. * @var string
  20. */
  21. private $uuid;
  22. /**
  23. * @var Collection
  24. */
  25. private $articles;
  26. /**
  27. * @var Collection
  28. */
  29. private $translations;
  30. /**
  31. * @var string
  32. */
  33. private $defaultLocale;
  34. /**
  35. * @var null|\DateTime
  36. */
  37. private $createdAt;
  38. /**
  39. * @var null|\DateTime
  40. */
  41. private $updatedAt;
  42. public function __construct(
  43. string $articleCategoryId = null,
  44. string $title,
  45. string $slug,
  46. string $locale = Article::DEFAULT_LOCALE
  47. ) {
  48. try {
  49. $this->uuid = Uuid::fromString($articleCategoryId ?: Uuid::uuid4())->toString();
  50. } catch (\InvalidArgumentException $e) {
  51. throw new InvalidUUIDException();
  52. }
  53. $articleCategoryTranslation = new ArticleCategoryTranslation(
  54. null,
  55. $this,
  56. $locale,
  57. $title,
  58. $slug
  59. );
  60. $this->translations = new ArrayCollection();
  61. $this->translations->add($articleCategoryTranslation);
  62. $this->defaultLocale = $locale;
  63. $this->articles = new ArrayCollection();
  64. $this->createdAt = new \DateTime();
  65. $this->updatedAt = $this->createdAt();
  66. }
  67. /**
  68. * @return string
  69. */
  70. public function id(): string
  71. {
  72. return $this->uuid;
  73. }
  74. /**
  75. * @return Collection
  76. */
  77. public function articles(): Collection
  78. {
  79. return $this->articles;
  80. }
  81. /**
  82. * @return string
  83. */
  84. public function slug(): string
  85. {
  86. return $this->getTranslation()->slug();
  87. }
  88. /**
  89. * @return string
  90. */
  91. public function title(): string
  92. {
  93. return $this->getTranslation()->title();
  94. }
  95. /**
  96. * @return \DateTime
  97. */
  98. public function createdAt(): \DateTime
  99. {
  100. return $this->createdAt;
  101. }
  102. /**
  103. * @return \DateTime
  104. */
  105. public function updatedAt(): \DateTime
  106. {
  107. return $this->updatedAt;
  108. }
  109. /**
  110. * @param string|null $locale
  111. * @return ArticleCategoryTranslation
  112. */
  113. public function getTranslation(?string $locale = null): ArticleCategoryTranslation
  114. {
  115. $articleCategoryTranslation = null;
  116. $locale = $locale ?: $this->defaultLocale();
  117. foreach ($this->translations as $translation) {
  118. if ($translation->locale() == $locale) {
  119. $articleCategoryTranslation = $translation;
  120. break;
  121. }
  122. }
  123. if (is_null($articleCategoryTranslation)) {
  124. $articleCategoryTranslation = new ArticleCategoryTranslation(
  125. null,
  126. $this,
  127. $locale,
  128. $this->getTranslation(Article::DEFAULT_LOCALE)->title(),
  129. $this->getTranslation(Article::DEFAULT_LOCALE)->slug()
  130. );
  131. $this->translations->add($articleCategoryTranslation);
  132. }
  133. return $articleCategoryTranslation;
  134. }
  135. public function updateTranslation(
  136. string $locale,
  137. string $title,
  138. string $slug
  139. ) {
  140. $articleCategoryTranslation = $this->getTranslation($locale);
  141. if (is_null($articleCategoryTranslation)) {
  142. $articleCategoryTranslation = new ArticleCategoryTranslation(
  143. null,
  144. $this,
  145. $locale,
  146. $title,
  147. $slug
  148. );
  149. $this->translations->add($articleCategoryTranslation);
  150. } else {
  151. $articleCategoryTranslation->updateArticleCategoryTranslation(
  152. $title,
  153. $slug
  154. );
  155. }
  156. $this->updatedAt = new \DateTime();
  157. return $this;
  158. }
  159. /**
  160. * @return string
  161. */
  162. public function defaultLocale(): string
  163. {
  164. return $this->defaultLocale;
  165. }
  166. }