Как сделать это более грамотно в Laravel

263
06 сентября 2018, 21:50

У меня есть в базе данных 2 таблицы, новости и история. История само собой выводится на главной странице.
Так вот у меня есть форма, я отправляю post запрос, и у меня должно добавлять одновременно в две базы данных, в историю и новости.
Как это реализовать более грамотно? Чтобы к примеру не писать вот так в одном контроллере:

public function addNews()
{
    $history = new History;
            $history->admin_id = Auth::user()->id;
            $history->title = $request->title;
            $history->action = "Добавил новость";
            $history->url_address = "news/create";
    $addNews = new News;
       $addNews->author_id = Auth::user()->id;
            $addNews->title = $request->title;
            $addNews->description = $request->description;
...

То по моему мнению так не грамотно писать будет, так как не соответствует solid принципам.

Answer 1

1.Сразу предлагаю Вам вынести валидацию в отдельный класс, поскольку здесь Вы получаете все данные из $request, который сейчас даже нигде не описан. Примерно так:

public function addNews(StoreNewsRequest $request)
{
...
}

2.Историю лучше вести с привязкой через полиморфические связи. Таким образом, в БД всегда будет храниться история взаимодействий с данной новостью, а Вы сможете легко посмотреть, кто и что делал с этой новостью на протяжении всего времени. Больше про полиморфические связи в Eloquent здесь.

3.Писать в коде прямым текстом вот так: $history->action = "Добавил новость"; - зло. Лучше это вынести в константу модели History:

class History 
{
   const USER_ADDED_NEWS = "Добавил новость";
}    
...
$history->action = History::USER_ADDED_NEWS;

В заключении посоветую почитать эти best practices, явно много нового и полезного для себя найдете :)

READ ALSO
Связать LDAP, MSSQL, PHP

Связать LDAP, MSSQL, PHP

Имеется сервер MSSQL и настроенные логины-пользрватели, привязанные к доменным учеткамХочу связать web приложение с базой так, чтобы при аутентификации...

271
OPENCV стек в KERNELBASE.dll

OPENCV стек в KERNELBASE.dll

работаю на VC++2010 после компиляции выдаёт ошибку Необработанное исключение в "0x751ec54f" в "OPCVexe": Исключение Microsoft C++: cv::Exception по адресу 0x0038f3f8

272
c++, boost::random: генерация случайных данных с равномерным распределёнием

c++, boost::random: генерация случайных данных с равномерным распределёнием

Приветствует, стоит задача на некотором действительном отрезке (условно от 00 до limit) случайно сгенерировать N точек, при этом точки должны...

274