From 78a1453929895ee30342d9d73fed4222fd051ec1 Mon Sep 17 00:00:00 2001 From: Arman <407448+armanist@users.noreply.github.com> Date: Wed, 1 Apr 2026 21:06:40 +0400 Subject: [PATCH 1/3] Refactor Module Templates to use DTOs in Services and Controllers --- .../src/Controllers/AuthController.php.tpl | 8 +- .../src/Controllers/CommentController.php.tpl | 9 +- .../PostManagementController.php.tpl | 40 ++--- .../DemoApi/src/DTOs/CommentDTO.php.tpl | 92 ++++++++++ .../DemoApi/src/DTOs/PostDTO.php.tpl | 113 +++++++++++++ .../DemoApi/src/DTOs/UserDTO.php.tpl | 158 ++++++++++++++++++ .../src/Services/CommentService.php.tpl | 11 +- .../DemoApi/src/Services/PostService.php.tpl | 19 ++- .../src/Controllers/AuthController.php.tpl | 8 +- .../src/Controllers/CommentController.php.tpl | 9 +- .../PostManagementController.php.tpl | 40 ++--- .../DemoWeb/src/DTOs/CommentDTO.php.tpl | 92 ++++++++++ .../DemoWeb/src/DTOs/PostDTO.php.tpl | 113 +++++++++++++ .../DemoWeb/src/DTOs/UserDTO.php.tpl | 158 ++++++++++++++++++ .../src/Services/CommentService.php.tpl | 11 +- .../DemoWeb/src/Services/PostService.php.tpl | 17 +- 16 files changed, 807 insertions(+), 91 deletions(-) create mode 100644 src/Module/Templates/DemoApi/src/DTOs/CommentDTO.php.tpl create mode 100644 src/Module/Templates/DemoApi/src/DTOs/PostDTO.php.tpl create mode 100644 src/Module/Templates/DemoApi/src/DTOs/UserDTO.php.tpl create mode 100644 src/Module/Templates/DemoWeb/src/DTOs/CommentDTO.php.tpl create mode 100644 src/Module/Templates/DemoWeb/src/DTOs/PostDTO.php.tpl create mode 100644 src/Module/Templates/DemoWeb/src/DTOs/UserDTO.php.tpl diff --git a/src/Module/Templates/DemoApi/src/Controllers/AuthController.php.tpl b/src/Module/Templates/DemoApi/src/Controllers/AuthController.php.tpl index 951a8995..aa1f7aac 100644 --- a/src/Module/Templates/DemoApi/src/Controllers/AuthController.php.tpl +++ b/src/Module/Templates/DemoApi/src/Controllers/AuthController.php.tpl @@ -16,6 +16,7 @@ namespace {{MODULE_NAMESPACE}}\Controllers; use Quantum\Auth\Exceptions\AuthException; use Quantum\Http\Enums\StatusCode; +use {{MODULE_NAMESPACE}}\DTOs\UserDTO; use {{MODULE_NAMESPACE}}\Enums\Role; use Quantum\Http\Response; use Quantum\Http\Request; @@ -93,12 +94,9 @@ class AuthController extends BaseController */ public function signup(Request $request, Response $response) { - $userData = $request->all(); + $userDto = UserDTO::fromRequest($request, Role::EDITOR, uuid_ordered()); - $userData['uuid'] = uuid_ordered(); - $userData['role'] = Role::EDITOR; - - auth()->signup($userData); + auth()->signup($userDto->toArray()); $response->json([ 'status' => self::STATUS_SUCCESS, diff --git a/src/Module/Templates/DemoApi/src/Controllers/CommentController.php.tpl b/src/Module/Templates/DemoApi/src/Controllers/CommentController.php.tpl index 8cc398e5..d59430df 100644 --- a/src/Module/Templates/DemoApi/src/Controllers/CommentController.php.tpl +++ b/src/Module/Templates/DemoApi/src/Controllers/CommentController.php.tpl @@ -15,6 +15,7 @@ namespace {{MODULE_NAMESPACE}}\Controllers; use {{MODULE_NAMESPACE}}\Services\CommentService; +use {{MODULE_NAMESPACE}}\DTOs\CommentDTO; use Quantum\Http\Response; use Quantum\Http\Request; @@ -44,11 +45,9 @@ class CommentController extends BaseController */ public function create(Request $request, Response $response, ?string $lang, string $uuid) { - $comment = $this->commentService->addComment([ - 'post_uuid' => $uuid, - 'user_uuid' => auth()->user()->uuid, - 'content' => trim($request->get('content')), - ]); + $commentDto = CommentDTO::fromRequest($request, $uuid, auth()->user()->uuid); + + $comment = $this->commentService->addComment($commentDto); $response->json([ 'status' => 'success', diff --git a/src/Module/Templates/DemoApi/src/Controllers/PostManagementController.php.tpl b/src/Module/Templates/DemoApi/src/Controllers/PostManagementController.php.tpl index ef9287b8..54f7116e 100644 --- a/src/Module/Templates/DemoApi/src/Controllers/PostManagementController.php.tpl +++ b/src/Module/Templates/DemoApi/src/Controllers/PostManagementController.php.tpl @@ -17,6 +17,7 @@ namespace {{MODULE_NAMESPACE}}\Controllers; use Quantum\Service\Exceptions\ServiceException; use Quantum\App\Exceptions\BaseException; use {{MODULE_NAMESPACE}}\Services\PostService; +use {{MODULE_NAMESPACE}}\DTOs\PostDTO; use Quantum\Di\Exceptions\DiException; use Quantum\Http\Response; use Quantum\Http\Request; @@ -60,12 +61,7 @@ class PostManagementController extends BaseController */ public function create(Request $request, Response $response) { - $postData = [ - 'user_uuid' => auth()->user()->uuid, - 'title' => $request->get('title', null, true), - 'content' => $request->get('content', null, true), - 'image' => '', - ]; + $imageName = ''; if ($request->hasFile('image')) { $imageName = $this->postService->saveImage( @@ -73,11 +69,11 @@ class PostManagementController extends BaseController auth()->user()->uuid, slugify($request->get('title')) ); - - $postData['image'] = $imageName; } - $post = $this->postService->addPost($postData); + $postDto = PostDTO::fromRequest($request, auth()->user()->uuid, $imageName); + + $post = $this->postService->addPost($postDto); $response->json([ 'status' => 'success', @@ -95,13 +91,10 @@ class PostManagementController extends BaseController */ public function amend(Request $request, Response $response, ?string $lang, string $postUuid) { - $postData = [ - 'title' => $request->get('title', null, true), - 'content' => $request->get('content', null, true), - ]; - $post = $this->postService->getPost($postUuid); + $imageName = null; + if ($request->hasFile('image')) { if ($post->image) { $this->postService->deleteImage(auth()->user()->uuid . DS . $post->image); @@ -112,11 +105,11 @@ class PostManagementController extends BaseController auth()->user()->uuid, slugify($request->get('title')) ); - - $postData['image'] = $imageName; } - $post = $this->postService->updatePost($postUuid, $postData); + $postDto = PostDTO::fromRequest($request, null, $imageName); + + $post = $this->postService->updatePost($postUuid, $postDto); $response->json([ 'status' => 'success', @@ -161,11 +154,14 @@ class PostManagementController extends BaseController $this->postService->deleteImage(auth()->user()->uuid . DS . $post->image); } - $this->postService->updatePost($postUuid, [ - 'title' => $post->title, - 'content' => $post->content, - 'image' => '', - ]); + $postDto = new PostDTO( + $post->title, + $post->content, + null, + '' + ); + + $this->postService->updatePost($postUuid, $postDto); $response->json([ 'status' => 'success', diff --git a/src/Module/Templates/DemoApi/src/DTOs/CommentDTO.php.tpl b/src/Module/Templates/DemoApi/src/DTOs/CommentDTO.php.tpl new file mode 100644 index 00000000..3f9ee9e4 --- /dev/null +++ b/src/Module/Templates/DemoApi/src/DTOs/CommentDTO.php.tpl @@ -0,0 +1,92 @@ + + * @copyright Copyright (c) 2018 Softberg LLC (https://softberg.org) + * @link http://quantum.softberg.org/ + * @since 3.0.0 + */ + +namespace {{MODULE_NAMESPACE}}\DTOs; + +use Quantum\Http\Request; + +/** + * Class CommentDTO + * @package {{MODULE_NAMESPACE}}\DTOs + */ +class CommentDTO +{ + /** + * @var string + */ + private string $postUuid; + + /** + * @var string + */ + private string $userUuid; + + /** + * @var string + */ + private string $content; + + /** + * @param string $postUuid + * @param string $userUuid + * @param string $content + */ + public function __construct( + string $postUuid, + string $userUuid, + string $content + ) { + $this->postUuid = $postUuid; + $this->userUuid = $userUuid; + $this->content = $content; + } + + /** + * @param Request $request + * @param string $postUuid + * @param string $userUuid + * @return self + */ + public static function fromRequest(Request $request, string $postUuid, string $userUuid): self + { + return new self($postUuid, $userUuid, trim($request->get('content'))); + } + + public function getPostUuid(): string + { + return $this->postUuid; + } + + public function getUserUuid(): string + { + return $this->userUuid; + } + + public function getContent(): string + { + return $this->content; + } + + /** + * @return array + */ + public function toArray(): array + { + return [ + 'post_uuid' => $this->postUuid, + 'user_uuid' => $this->userUuid, + 'content' => $this->content, + ]; + } +} diff --git a/src/Module/Templates/DemoApi/src/DTOs/PostDTO.php.tpl b/src/Module/Templates/DemoApi/src/DTOs/PostDTO.php.tpl new file mode 100644 index 00000000..0a193716 --- /dev/null +++ b/src/Module/Templates/DemoApi/src/DTOs/PostDTO.php.tpl @@ -0,0 +1,113 @@ + + * @copyright Copyright (c) 2018 Softberg LLC (https://softberg.org) + * @link http://quantum.softberg.org/ + * @since 3.0.0 + */ + +namespace {{MODULE_NAMESPACE}}\DTOs; + +use Quantum\Http\Request; + +/** + * Class PostDTO + * @package {{MODULE_NAMESPACE}}\DTOs + */ +class PostDTO +{ + /** + * @var string + */ + private string $title; + + /** + * @var string + */ + private string $content; + + /** + * @var string|null + */ + private ?string $userUuid; + + /** + * @var string|null + */ + private ?string $image; + + /** + * @param string $title + * @param string $content + * @param string|null $userUuid + * @param string|null $image + */ + public function __construct( + string $title, + string $content, + ?string $userUuid = null, + ?string $image = null + ) { + $this->title = $title; + $this->content = $content; + $this->userUuid = $userUuid; + $this->image = $image; + } + + /** + * @param Request $request + * @param string|null $userUuid + * @param string|null $image + * @return self + */ + public static function fromRequest(Request $request, ?string $userUuid = null, ?string $image = null): self + { + return new self( + $request->get('title', null, true), + $request->get('content', null, true), + $userUuid, + $image + ); + } + + public function getTitle(): string + { + return $this->title; + } + + public function getContent(): string + { + return $this->content; + } + + public function getUserUuid(): ?string + { + return $this->userUuid; + } + + public function getImage(): ?string + { + return $this->image; + } + + /** + * @return array + */ + public function toArray(): array + { + return array_filter([ + 'user_uuid' => $this->userUuid, + 'title' => $this->title, + 'content' => $this->content, + 'image' => $this->image, + ], function ($value) { + return $value !== null; + }); + } +} diff --git a/src/Module/Templates/DemoApi/src/DTOs/UserDTO.php.tpl b/src/Module/Templates/DemoApi/src/DTOs/UserDTO.php.tpl new file mode 100644 index 00000000..cd14f348 --- /dev/null +++ b/src/Module/Templates/DemoApi/src/DTOs/UserDTO.php.tpl @@ -0,0 +1,158 @@ + + * @copyright Copyright (c) 2018 Softberg LLC (https://softberg.org) + * @link http://quantum.softberg.org/ + * @since 3.0.0 + */ + +namespace {{MODULE_NAMESPACE}}\DTOs; + +use Quantum\Http\Request; + +/** + * Class UserDTO + * @package {{MODULE_NAMESPACE}}\DTOs + */ +class UserDTO +{ + /** + * @var string + */ + private string $email; + + /** + * @var string + */ + private string $password; + + /** + * @var string + */ + private string $firstname; + + /** + * @var string + */ + private string $lastname; + + /** + * @var string + */ + private string $role; + + /** + * @var string|null + */ + private ?string $uuid; + + /** + * @var string + */ + private string $image; + + /** + * @param string $email + * @param string $password + * @param string $firstname + * @param string $lastname + * @param string $role + * @param string|null $uuid + * @param string $image + */ + public function __construct( + string $email, + string $password, + string $firstname, + string $lastname, + string $role = '', + ?string $uuid = null, + string $image = '' + ) { + $this->email = $email; + $this->password = $password; + $this->firstname = $firstname; + $this->lastname = $lastname; + $this->role = $role; + $this->uuid = $uuid; + $this->image = $image; + } + + /** + * @param Request $request + * @param string $role + * @param string|null $uuid + * @return self + */ + public static function fromRequest(Request $request, string $role, ?string $uuid = null): self + { + return new self( + $request->get('email'), + $request->get('password'), + $request->get('firstname'), + $request->get('lastname'), + $role, + $uuid + ); + } + + public function getEmail(): string + { + return $this->email; + } + + public function getPassword(): string + { + return $this->password; + } + + public function getFirstname(): string + { + return $this->firstname; + } + + public function getLastname(): string + { + return $this->lastname; + } + + public function getRole(): string + { + return $this->role; + } + + public function getUuid(): ?string + { + return $this->uuid; + } + + public function getImage(): string + { + return $this->image; + } + + /** + * Converts DTO to array for framework interface compatibility + * @return array + */ + public function toArray(): array + { + return array_filter([ + 'uuid' => $this->uuid, + 'email' => $this->email, + 'password' => $this->password, + 'firstname' => $this->firstname, + 'lastname' => $this->lastname, + 'role' => $this->role, + 'image' => $this->image, + ], function ($value) { + return $value !== null && $value !== ''; + }); + } +} diff --git a/src/Module/Templates/DemoApi/src/Services/CommentService.php.tpl b/src/Module/Templates/DemoApi/src/Services/CommentService.php.tpl index 1efd63e1..05767bb9 100644 --- a/src/Module/Templates/DemoApi/src/Services/CommentService.php.tpl +++ b/src/Module/Templates/DemoApi/src/Services/CommentService.php.tpl @@ -17,6 +17,7 @@ namespace {{MODULE_NAMESPACE}}\Services; use {{MODULE_NAMESPACE}}\Transformers\CommentTransformer; use Quantum\Model\Exceptions\ModelException; use Quantum\App\Exceptions\BaseException; +use {{MODULE_NAMESPACE}}\DTOs\CommentDTO; use Quantum\Service\QtService; use {{MODULE_NAMESPACE}}\Models\Comment; use {{MODULE_NAMESPACE}}\Models\User; @@ -86,19 +87,19 @@ class CommentService extends QtService /** * Add a new comment - * @param array $data + * @param CommentDTO $commentDto * @return array * @throws ModelException */ - public function addComment(array $data): array + public function addComment(CommentDTO $commentDto): array { - $data['uuid'] = $data['uuid'] ?? uuid_ordered(); + $uuid = uuid_ordered(); $comment = $this->model->create(); - $comment->fill($data); + $comment->fill(array_merge(['uuid' => $uuid], $commentDto->toArray())); $comment->save(); - return $data; + return $comment->asArray(); } /** diff --git a/src/Module/Templates/DemoApi/src/Services/PostService.php.tpl b/src/Module/Templates/DemoApi/src/Services/PostService.php.tpl index b7eb4d0a..45e91981 100644 --- a/src/Module/Templates/DemoApi/src/Services/PostService.php.tpl +++ b/src/Module/Templates/DemoApi/src/Services/PostService.php.tpl @@ -20,8 +20,9 @@ use Quantum\Environment\Exceptions\EnvException; use Quantum\Config\Exceptions\ConfigException; use {{MODULE_NAMESPACE}}\Transformers\PostTransformer; use Quantum\Model\Exceptions\ModelException; -use Quantum\Storage\UploadedFile; use Quantum\App\Exceptions\BaseException; +use Quantum\Storage\UploadedFile; +use {{MODULE_NAMESPACE}}\DTOs\PostDTO; use {{MODULE_NAMESPACE}}\Models\User; use {{MODULE_NAMESPACE}}\Models\Post; use Quantum\Di\Exceptions\DiException; @@ -150,34 +151,34 @@ class PostService extends QtService /** * Add post - * @param array $data + * @param PostDTO $postDto * @return Post * @throws BaseException * @throws ModelException */ - public function addPost(array $data): Post + public function addPost(PostDTO $postDto): Post { - $data['uuid'] = $data['uuid'] ?? uuid_ordered(); + $uuid = uuid_ordered(); $post = $this->model->create(); - $post->fill($data); + $post->fill(array_merge(['uuid' => $uuid], $postDto->toArray())); $post->save(); - return $this->getPost($post->uuid); + return $this->getPost($uuid); } /** * Update post * @param string $uuid - * @param array $data + * @param PostDTO $postDto * @return Post * @throws BaseException * @throws ModelException */ - public function updatePost(string $uuid, array $data): Post + public function updatePost(string $uuid, PostDTO $postDto): Post { $post = $this->model->findOneBy('uuid', $uuid); - $post->fill($data); + $post->fill($postDto->toArray()); $post->save(); return $this->getPost($post->uuid); diff --git a/src/Module/Templates/DemoWeb/src/Controllers/AuthController.php.tpl b/src/Module/Templates/DemoWeb/src/Controllers/AuthController.php.tpl index 5ef7fbcc..174c8c2e 100644 --- a/src/Module/Templates/DemoWeb/src/Controllers/AuthController.php.tpl +++ b/src/Module/Templates/DemoWeb/src/Controllers/AuthController.php.tpl @@ -15,6 +15,7 @@ namespace {{MODULE_NAMESPACE}}\Controllers; use Quantum\Auth\Exceptions\AuthException; +use {{MODULE_NAMESPACE}}\DTOs\UserDTO; use {{MODULE_NAMESPACE}}\Enums\Role; use Quantum\Http\Response; use Quantum\Http\Request; @@ -102,12 +103,9 @@ class AuthController extends BaseController public function signup(Request $request, Response $response) { if ($request->isMethod('post')) { - $userData = $request->all(); + $userDto = UserDTO::fromRequest($request, Role::EDITOR, uuid_ordered()); - $userData['uuid'] = uuid_ordered(); - $userData['role'] = Role::EDITOR; - - auth()->signup($userData); + auth()->signup($userDto->toArray()); session()->setFlash('success', t('common.check_email_signup')); redirect(base_url(true) . '/' . current_lang() . '/signup'); diff --git a/src/Module/Templates/DemoWeb/src/Controllers/CommentController.php.tpl b/src/Module/Templates/DemoWeb/src/Controllers/CommentController.php.tpl index 49aa6605..b038919e 100644 --- a/src/Module/Templates/DemoWeb/src/Controllers/CommentController.php.tpl +++ b/src/Module/Templates/DemoWeb/src/Controllers/CommentController.php.tpl @@ -15,6 +15,7 @@ namespace {{MODULE_NAMESPACE}}\Controllers; use {{MODULE_NAMESPACE}}\Services\CommentService; +use {{MODULE_NAMESPACE}}\DTOs\CommentDTO; use Quantum\Http\Request; /** @@ -50,11 +51,9 @@ class CommentController extends BaseController */ public function create(Request $request, ?string $lang, string $uuid) { - $this->commentService->addComment([ - 'post_uuid' => $uuid, - 'user_uuid' => auth()->user()->uuid, - 'content' => trim($request->get('content')), - ]); + $commentDto = CommentDTO::fromRequest($request, $uuid, auth()->user()->uuid); + + $this->commentService->addComment($commentDto); session()->setFlash('success', t('common.comment_added')); redirect(get_referrer()); diff --git a/src/Module/Templates/DemoWeb/src/Controllers/PostManagementController.php.tpl b/src/Module/Templates/DemoWeb/src/Controllers/PostManagementController.php.tpl index 853fe263..3430b7af 100644 --- a/src/Module/Templates/DemoWeb/src/Controllers/PostManagementController.php.tpl +++ b/src/Module/Templates/DemoWeb/src/Controllers/PostManagementController.php.tpl @@ -15,6 +15,7 @@ namespace {{MODULE_NAMESPACE}}\Controllers; use {{MODULE_NAMESPACE}}\Services\PostService; +use {{MODULE_NAMESPACE}}\DTOs\PostDTO; use Quantum\Http\Response; use Quantum\Http\Request; @@ -82,12 +83,7 @@ class PostManagementController extends BaseController */ public function create(Request $request) { - $postData = [ - 'user_uuid' => auth()->user()->uuid, - 'title' => $request->get('title', null, true), - 'content' => $request->get('content', null, true), - 'image' => '', - ]; + $imageName = ''; if ($request->hasFile('image')) { $imageName = $this->postService->saveImage( @@ -95,11 +91,11 @@ class PostManagementController extends BaseController auth()->user()->uuid, slugify($request->get('title')) ); - - $postData['image'] = $imageName; } - $this->postService->addPost($postData); + $postDto = PostDTO::fromRequest($request, auth()->user()->uuid, $imageName); + + $this->postService->addPost($postDto); redirect(base_url(true) . '/' . current_lang() . '/my-posts'); } @@ -134,13 +130,10 @@ class PostManagementController extends BaseController */ public function amend(Request $request, ?string $lang, string $postUuid) { - $postData = [ - 'title' => $request->get('title', null, true), - 'content' => $request->get('content', null, true), - ]; - $post = $this->postService->getPost($postUuid); + $imageName = null; + if ($request->hasFile('image')) { if ($post->image) { $this->postService->deleteImage(auth()->user()->uuid . DS . $post->image); @@ -151,11 +144,11 @@ class PostManagementController extends BaseController auth()->user()->uuid, slugify($request->get('title')) ); - - $postData['image'] = $imageName; } - $this->postService->updatePost($postUuid, $postData); + $postDto = PostDTO::fromRequest($request, null, $imageName); + + $this->postService->updatePost($postUuid, $postDto); redirect(base_url(true) . '/' . current_lang() . '/my-posts'); } @@ -191,11 +184,14 @@ class PostManagementController extends BaseController $this->postService->deleteImage(auth()->user()->uuid . DS . $post->image); } - $this->postService->updatePost($postUuid, [ - 'title' => $post->title, - 'content' => $post->content, - 'image' => '', - ]); + $postDto = new PostDTO( + $post->title, + $post->content, + null, + '' + ); + + $this->postService->updatePost($postUuid, $postDto); redirect(base_url(true) . '/' . current_lang() . '/my-posts'); } diff --git a/src/Module/Templates/DemoWeb/src/DTOs/CommentDTO.php.tpl b/src/Module/Templates/DemoWeb/src/DTOs/CommentDTO.php.tpl new file mode 100644 index 00000000..3f9ee9e4 --- /dev/null +++ b/src/Module/Templates/DemoWeb/src/DTOs/CommentDTO.php.tpl @@ -0,0 +1,92 @@ + + * @copyright Copyright (c) 2018 Softberg LLC (https://softberg.org) + * @link http://quantum.softberg.org/ + * @since 3.0.0 + */ + +namespace {{MODULE_NAMESPACE}}\DTOs; + +use Quantum\Http\Request; + +/** + * Class CommentDTO + * @package {{MODULE_NAMESPACE}}\DTOs + */ +class CommentDTO +{ + /** + * @var string + */ + private string $postUuid; + + /** + * @var string + */ + private string $userUuid; + + /** + * @var string + */ + private string $content; + + /** + * @param string $postUuid + * @param string $userUuid + * @param string $content + */ + public function __construct( + string $postUuid, + string $userUuid, + string $content + ) { + $this->postUuid = $postUuid; + $this->userUuid = $userUuid; + $this->content = $content; + } + + /** + * @param Request $request + * @param string $postUuid + * @param string $userUuid + * @return self + */ + public static function fromRequest(Request $request, string $postUuid, string $userUuid): self + { + return new self($postUuid, $userUuid, trim($request->get('content'))); + } + + public function getPostUuid(): string + { + return $this->postUuid; + } + + public function getUserUuid(): string + { + return $this->userUuid; + } + + public function getContent(): string + { + return $this->content; + } + + /** + * @return array + */ + public function toArray(): array + { + return [ + 'post_uuid' => $this->postUuid, + 'user_uuid' => $this->userUuid, + 'content' => $this->content, + ]; + } +} diff --git a/src/Module/Templates/DemoWeb/src/DTOs/PostDTO.php.tpl b/src/Module/Templates/DemoWeb/src/DTOs/PostDTO.php.tpl new file mode 100644 index 00000000..0a193716 --- /dev/null +++ b/src/Module/Templates/DemoWeb/src/DTOs/PostDTO.php.tpl @@ -0,0 +1,113 @@ + + * @copyright Copyright (c) 2018 Softberg LLC (https://softberg.org) + * @link http://quantum.softberg.org/ + * @since 3.0.0 + */ + +namespace {{MODULE_NAMESPACE}}\DTOs; + +use Quantum\Http\Request; + +/** + * Class PostDTO + * @package {{MODULE_NAMESPACE}}\DTOs + */ +class PostDTO +{ + /** + * @var string + */ + private string $title; + + /** + * @var string + */ + private string $content; + + /** + * @var string|null + */ + private ?string $userUuid; + + /** + * @var string|null + */ + private ?string $image; + + /** + * @param string $title + * @param string $content + * @param string|null $userUuid + * @param string|null $image + */ + public function __construct( + string $title, + string $content, + ?string $userUuid = null, + ?string $image = null + ) { + $this->title = $title; + $this->content = $content; + $this->userUuid = $userUuid; + $this->image = $image; + } + + /** + * @param Request $request + * @param string|null $userUuid + * @param string|null $image + * @return self + */ + public static function fromRequest(Request $request, ?string $userUuid = null, ?string $image = null): self + { + return new self( + $request->get('title', null, true), + $request->get('content', null, true), + $userUuid, + $image + ); + } + + public function getTitle(): string + { + return $this->title; + } + + public function getContent(): string + { + return $this->content; + } + + public function getUserUuid(): ?string + { + return $this->userUuid; + } + + public function getImage(): ?string + { + return $this->image; + } + + /** + * @return array + */ + public function toArray(): array + { + return array_filter([ + 'user_uuid' => $this->userUuid, + 'title' => $this->title, + 'content' => $this->content, + 'image' => $this->image, + ], function ($value) { + return $value !== null; + }); + } +} diff --git a/src/Module/Templates/DemoWeb/src/DTOs/UserDTO.php.tpl b/src/Module/Templates/DemoWeb/src/DTOs/UserDTO.php.tpl new file mode 100644 index 00000000..cd14f348 --- /dev/null +++ b/src/Module/Templates/DemoWeb/src/DTOs/UserDTO.php.tpl @@ -0,0 +1,158 @@ + + * @copyright Copyright (c) 2018 Softberg LLC (https://softberg.org) + * @link http://quantum.softberg.org/ + * @since 3.0.0 + */ + +namespace {{MODULE_NAMESPACE}}\DTOs; + +use Quantum\Http\Request; + +/** + * Class UserDTO + * @package {{MODULE_NAMESPACE}}\DTOs + */ +class UserDTO +{ + /** + * @var string + */ + private string $email; + + /** + * @var string + */ + private string $password; + + /** + * @var string + */ + private string $firstname; + + /** + * @var string + */ + private string $lastname; + + /** + * @var string + */ + private string $role; + + /** + * @var string|null + */ + private ?string $uuid; + + /** + * @var string + */ + private string $image; + + /** + * @param string $email + * @param string $password + * @param string $firstname + * @param string $lastname + * @param string $role + * @param string|null $uuid + * @param string $image + */ + public function __construct( + string $email, + string $password, + string $firstname, + string $lastname, + string $role = '', + ?string $uuid = null, + string $image = '' + ) { + $this->email = $email; + $this->password = $password; + $this->firstname = $firstname; + $this->lastname = $lastname; + $this->role = $role; + $this->uuid = $uuid; + $this->image = $image; + } + + /** + * @param Request $request + * @param string $role + * @param string|null $uuid + * @return self + */ + public static function fromRequest(Request $request, string $role, ?string $uuid = null): self + { + return new self( + $request->get('email'), + $request->get('password'), + $request->get('firstname'), + $request->get('lastname'), + $role, + $uuid + ); + } + + public function getEmail(): string + { + return $this->email; + } + + public function getPassword(): string + { + return $this->password; + } + + public function getFirstname(): string + { + return $this->firstname; + } + + public function getLastname(): string + { + return $this->lastname; + } + + public function getRole(): string + { + return $this->role; + } + + public function getUuid(): ?string + { + return $this->uuid; + } + + public function getImage(): string + { + return $this->image; + } + + /** + * Converts DTO to array for framework interface compatibility + * @return array + */ + public function toArray(): array + { + return array_filter([ + 'uuid' => $this->uuid, + 'email' => $this->email, + 'password' => $this->password, + 'firstname' => $this->firstname, + 'lastname' => $this->lastname, + 'role' => $this->role, + 'image' => $this->image, + ], function ($value) { + return $value !== null && $value !== ''; + }); + } +} diff --git a/src/Module/Templates/DemoWeb/src/Services/CommentService.php.tpl b/src/Module/Templates/DemoWeb/src/Services/CommentService.php.tpl index 3528535c..fe9690d5 100644 --- a/src/Module/Templates/DemoWeb/src/Services/CommentService.php.tpl +++ b/src/Module/Templates/DemoWeb/src/Services/CommentService.php.tpl @@ -17,6 +17,7 @@ namespace {{MODULE_NAMESPACE}}\Services; use {{MODULE_NAMESPACE}}\Transformers\CommentTransformer; use Quantum\Model\Exceptions\ModelException; use Quantum\App\Exceptions\BaseException; +use {{MODULE_NAMESPACE}}\DTOs\CommentDTO; use Quantum\Service\QtService; use {{MODULE_NAMESPACE}}\Models\Comment; use {{MODULE_NAMESPACE}}\Models\User; @@ -87,19 +88,19 @@ class CommentService extends QtService /** * Add a new comment - * @param array $data + * @param CommentDTO $commentDto * @return array * @throws ModelException */ - public function addComment(array $data): array + public function addComment(CommentDTO $commentDto): array { - $data['uuid'] = $data['uuid'] ?? uuid_ordered(); + $uuid = uuid_ordered(); $comment = $this->model->create(); - $comment->fill($data); + $comment->fill(array_merge(['uuid' => $uuid], $commentDto->toArray())); $comment->save(); - return $data; + return $comment->asArray(); } /** diff --git a/src/Module/Templates/DemoWeb/src/Services/PostService.php.tpl b/src/Module/Templates/DemoWeb/src/Services/PostService.php.tpl index 8e7dfb2c..fce4fe1b 100644 --- a/src/Module/Templates/DemoWeb/src/Services/PostService.php.tpl +++ b/src/Module/Templates/DemoWeb/src/Services/PostService.php.tpl @@ -22,6 +22,7 @@ use {{MODULE_NAMESPACE}}\Transformers\PostTransformer; use Quantum\Model\Exceptions\ModelException; use Quantum\Storage\UploadedFile; use Quantum\App\Exceptions\BaseException; +use {{MODULE_NAMESPACE}}\DTOs\PostDTO; use {{MODULE_NAMESPACE}}\Models\User; use {{MODULE_NAMESPACE}}\Models\Post; use Quantum\Di\Exceptions\DiException; @@ -148,34 +149,34 @@ class PostService extends QtService /** * Add post - * @param array $data + * @param PostDTO $postDto * @return Post * @throws BaseException * @throws ModelException */ - public function addPost(array $data): Post + public function addPost(PostDTO $postDto): Post { - $data['uuid'] = $data['uuid'] ?? uuid_ordered(); + $uuid = uuid_ordered(); $post = $this->model->create(); - $post->fill($data); + $post->fill(array_merge(['uuid' => $uuid], $postDto->toArray())); $post->save(); - return $this->getPost($post->uuid); + return $this->getPost($uuid); } /** * Update post * @param string $uuid - * @param array $data + * @param PostDTO $postDto * @return Post * @throws BaseException * @throws ModelException */ - public function updatePost(string $uuid, array $data): Post + public function updatePost(string $uuid, PostDTO $postDto): Post { $post = $this->model->findOneBy('uuid', $uuid); - $post->fill($data); + $post->fill($postDto->toArray()); $post->save(); return $this->getPost($post->uuid); From 2fdee836b34c2e06f3b7eef26190ba4375228900 Mon Sep 17 00:00:00 2001 From: Arman <407448+armanist@users.noreply.github.com> Date: Wed, 1 Apr 2026 21:18:00 +0400 Subject: [PATCH 2/3] Explicitly cast content to string in `CommentDTO::fromRequest()` --- src/Module/Templates/DemoApi/src/DTOs/CommentDTO.php.tpl | 2 +- src/Module/Templates/DemoWeb/src/DTOs/CommentDTO.php.tpl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Module/Templates/DemoApi/src/DTOs/CommentDTO.php.tpl b/src/Module/Templates/DemoApi/src/DTOs/CommentDTO.php.tpl index 3f9ee9e4..e5fa9d94 100644 --- a/src/Module/Templates/DemoApi/src/DTOs/CommentDTO.php.tpl +++ b/src/Module/Templates/DemoApi/src/DTOs/CommentDTO.php.tpl @@ -60,7 +60,7 @@ class CommentDTO */ public static function fromRequest(Request $request, string $postUuid, string $userUuid): self { - return new self($postUuid, $userUuid, trim($request->get('content'))); + return new self($postUuid, $userUuid, trim((string)$request->get('content'))); } public function getPostUuid(): string diff --git a/src/Module/Templates/DemoWeb/src/DTOs/CommentDTO.php.tpl b/src/Module/Templates/DemoWeb/src/DTOs/CommentDTO.php.tpl index 3f9ee9e4..e5fa9d94 100644 --- a/src/Module/Templates/DemoWeb/src/DTOs/CommentDTO.php.tpl +++ b/src/Module/Templates/DemoWeb/src/DTOs/CommentDTO.php.tpl @@ -60,7 +60,7 @@ class CommentDTO */ public static function fromRequest(Request $request, string $postUuid, string $userUuid): self { - return new self($postUuid, $userUuid, trim($request->get('content'))); + return new self($postUuid, $userUuid, trim((string)$request->get('content'))); } public function getPostUuid(): string From a569a1ad6780a41ba02b3b18e4f7430b086e242a Mon Sep 17 00:00:00 2001 From: Arman <407448+armanist@users.noreply.github.com> Date: Thu, 2 Apr 2026 20:02:52 +0400 Subject: [PATCH 3/3] Allowing empty strings in UserDTO toArray method --- src/Module/Templates/DemoApi/src/DTOs/UserDTO.php.tpl | 2 +- src/Module/Templates/DemoWeb/src/DTOs/UserDTO.php.tpl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Module/Templates/DemoApi/src/DTOs/UserDTO.php.tpl b/src/Module/Templates/DemoApi/src/DTOs/UserDTO.php.tpl index cd14f348..a272cda1 100644 --- a/src/Module/Templates/DemoApi/src/DTOs/UserDTO.php.tpl +++ b/src/Module/Templates/DemoApi/src/DTOs/UserDTO.php.tpl @@ -152,7 +152,7 @@ class UserDTO 'role' => $this->role, 'image' => $this->image, ], function ($value) { - return $value !== null && $value !== ''; + return $value !== null; }); } } diff --git a/src/Module/Templates/DemoWeb/src/DTOs/UserDTO.php.tpl b/src/Module/Templates/DemoWeb/src/DTOs/UserDTO.php.tpl index cd14f348..a272cda1 100644 --- a/src/Module/Templates/DemoWeb/src/DTOs/UserDTO.php.tpl +++ b/src/Module/Templates/DemoWeb/src/DTOs/UserDTO.php.tpl @@ -152,7 +152,7 @@ class UserDTO 'role' => $this->role, 'image' => $this->image, ], function ($value) { - return $value !== null && $value !== ''; + return $value !== null; }); } }