Я создаю в Laravel собственный институциональный веб-сайт с некоторым динамическим контентом, таким как: продукты, новости, пользователи и т. Д., И у меня возникли сомнения по поводу контроллеров и лучших практик.
В то время как некоторые страницы полностью статичны (информация об услугах, …), другие, такие как список товаров, являются динамическими
Я не уверен, нужно ли мне создавать контроллеры по страницам или объектам. Например:
ProductController => shows the page for a single product
ProductsController => shows the page for listing all the products
SearchController => shows the page for searching products
AboutController => shows the about page
ServicesController => shows the page for listing services
vs
ProductsController => shows the page for single and multiple products, and the search products page
PagesController / StaticController => shows all static pages (like "about" and "services")
Каков наилучший подход для этого?
Контроллер будет ответственным за отображение значений сущностей. Таким образом, вы должны использовать ваш второй пример, контроллеры по сущности.
Например, у вас есть функция «Показать мой статический сайт», это одна функция, одна ответственность, поэтому один класс / контроллер. Если вы разделите его на множество контроллеров, это даст вам дублирующий код.
Вы можете создать только один маршрут и один метод для статических страниц, которые будут использовать слагы для получения данных для статических страниц из БД.
Route::get('\static\{slug}', 'ContentController@buildStaticPage');
public function buildStaticPage($slug)
{
....
Я думаю, что нет «лучше» и «хуже», так как это всегда зависит от вашего варианта использования. Тем не менее, как Laravel намерен с
php artisan make:controller MyController --resource
Контроллер МОЖЕТ представлять основные функциональные возможности относительно одного объекта. Поэтому, вероятно, подход 2 вашего вопроса — это то, что вы ищете.
Как предложил @Alexey Mezenin, вы можете, конечно, создать контроллер, который предназначен для возврата ваших статических страниц — или вы можете даже вернуть их встроенными в свои страницы.
Route::get('my-static', function() { return view('static.my-page' ); });