Всем привет. Нужен совет - как правильно строить крупный проект?
сейчас создал примерно вот такую структуру проекта:
есть контроллер CategoryController
class CategoryController extends Controller
{
public function __construct(
private CategoryService $categoryService
)
{
}
public function store(CategoryRequest $request)
{
return $this->categoryService->store($request->validated());
}
public function show(int $id)
{
return $this->categoryService->showById($id);
}
public function update(CategoryRequest $request, int $id)
{
return $this->categoryService->updateById($id, $request->validated());
}
}
чтобы не плодить кучу кода в контроллере создал сервисный слой
class CategoryService
{
use JsonResponseTrait;
public function __construct(
private CategoryQueryInterface $categoryQuery,
private CategoryActionInterface $categoryAction,
)
{
}
public function store(array $data): JsonResponse
{
try {
$this->categoryAction->store($data);
return $this->successApiResponse([], Lang::get('database.store_success'));
} catch (Exception $e) {
return $this->errorStringApiResponse($e->getMessage(), 500);
}
}
public function showById(int $id): JsonResponse
{
$category = $this->categoryQuery->findById($id);
if (!$category) return $this->notFoundApiResponse([], '404');
$data = [
'id' => $category->id,
'name' => $category->name,
'icon' => $category->icon,
'description' => $category->description,
'metaTitle' => $category->meta_title,
'metaDescription' => $category->meta_description,
'isPublished' => $category->is_published,
'slug' => $category->slug,
'updatedAt' => $category->updated_at
];
return $this->okApiResponse($data);
}
public function updateById(int $id, array $data): JsonResponse
{
$model = $this->categoryQuery->findById($id);
if (!$model) return $this->notFoundApiResponse([], Lang::get('database.record_not_fount'));
try {
$this->categoryAction->update($id, $data);
return $this->successApiResponse([], Lang::get('database.update_success'));
} catch (Exception $e) {
return $this->errorStringApiResponse($e->getMessage(), 500);
}
}
}
также, чтобы не плодить повторы запросов кода сделать CategoryQuery класс
class CategoryQuery implements CategoryQueryInterface
{
public function findById(int $id): ?Category
{
$query = Category::find($id);
return $query;
}
}
+ чтобы как-то отделить создание/редактирование записей сделал CategoryAction
class CategoryAction implements CategoryActionInterface
{
public function store(array $data): void
{
$store = new Category();
$store->name = trim($data['name']);
$store->icon = trim($data['icon']);
$store->description = trim($data['description']);
$store->text = $data['text'];
$store->meta_title = $data['metaTitle'] ?? $data['name'];
$store->meta_description = $data['metaDescription'] ?? $data['metaDescription'];
$store->is_published = $data['isPublished'];
$store->slug = trim($data['slug']) ?? Str::slug($data['title'], '-');
$store->save();
}
public function update(Category $category, array $data): void
{
$category->name = trim($data['name']);
$category->icon = trim($data['icon']);
$category->description = trim($data['description']);
$category->text = $data['text'];
$category->meta_title = $data['metaTitle'] ?? $data['name'];
$category->meta_description = $data['metaDescription'] ?? $data['metaDescription'];
$category->is_published = $data['isPublished'];
$category->slug = trim($data['slug']) ?? Str::slug($data['title'], '-');
$category->save();
}
}
Вот теперь сижу и думаю, правильно ли я разнес логику, чтобы в дальнейшем проект было легко поддерживать и расширять?