Страницы

Поиск по вопросам

среда, 22 января 2020 г.

Laravel 5 - где размещать основную логику?

#laravel #модель_данных


Переношу со своего самописа на laravel. Контроллер laravel, который отвечает за рефералов:
вывод их данных, подсчет рефералов, подсчет первой линни, и т.п. - всего 5 методов. 

Гуглеж дал знать, что в контроллере их размещать нежелательно. С этим я согласен,
т.к. и у меня эти методы были вынесены в модель.

Но в laravel модель - это жесткая привязка к таблице, значит нужно использовать что-то
другое.

Далее, пишут что надо создавать некоторые сервис провайдеры. Посмотрел что это такое
- и никак не могу врубиться в эту логику. Не совсем понятно - зачем создавать интерфейсы,
и кучу других лишних движений?

В итоге создал в app директорию models2 , в ней модель class Team . И в контроллере
Team - получаю через 

public function index(Team $team)


Можно ли так делать, и если нет то как правильно? Разве создавать интерфесы - правильное
решение?
    


Ответы

Ответ 1



Ну, на такой вопрос вряд ли уложиться в несколько листов, но я все равно попробую :) Во первых, что такое сервисы и репозитории, и что это нам даст: Это освободит контроллеры и модели от некой бизнес-логики и позволит вам легко поддерживать код. То есть можно написать какой нибудь небольшой код и воткнуть его в метод, который можно будет многократно использовать. Например, есть у нас 2 контроллера: UsersController, DashboardController И есть 2 модели: User, Post Представьте себе, что вам нужно вывести пользователей с их постами, предварительно отфильтровав, а потом добавив какую-нибудь ещё логику. В таких случаях создается некий класс, назовём его UserService, И некий публичный метод getUsersAndPostsByAttr Который будет возвращать пользователей с его постами. namespace App\Http\Services; // Или куда-нибудь еще: App\Services может быть use User,Post; // это модели class UserService { // Тут можно как угодно извращаться :) public function getUsersAndPostsByAttr($data) { // Какая-то логика } } И уже вызывать его в контроллерах UsersController , DashboardController new \ App\Http\Srvices\UserService()->gtUsersAndPostsByAttr([id,name,emial ...]) Тут у нас возник bug или код должен быть дополнен какой то логикой(Скрыть часть строки емайл а вместо дополнит многоточием (aa@aaa.com => aaa@a...)). И чтоб изменения были везде. Тут нам придется это реализовать всего лишь в одном месте в сервисe. Это работает по принципу что если бы мы инициализировали переменную в начале файла присвоив ей значение и использовали бы его там где нам нужно, а не передавали значение во многих местах и потом вспоминали где мы эти значения писали․ А что касается интерфейсов можно почитать тут Можно ли так делать, и если нет то как правильно? Отвечаю: Допустим есть роут типо Route::get('user/{name}', 'ShowProfile@index');, и контроллер ShowProfile с вашим приведенным примером action public function index(Team $team) и url соответствующий вашему роутеру выглядит так http://site.ru/user/Вася, где name=Вася Вася-это строка, а не объект. А в актион index(Team $team) вы ожидаете значение по типу данного объекта, и у вас будет ошибка, поскольку Вася это строка а не объект. **Один из вариантов как можно: ** Routing: Route::get('user/{type}', 'HomeController@index'); HomeController@index: public function index($type) { $res = Team::where('type',$type)->firstOrFail(); dd($res); } site.ru/team/friends P.S: Поскольку это из тех вопросов который порождает дискуссию и скорей всего меня станут упрекать в том, что сказал об одном, но не сказал о другом и так далее, а некоторые будут умничать ... То советую понять саму суть сказанного и уже в своей практике улучшить, дополнить её и поделиться с людьми которые будут нуждаться в этом совете.

Комментариев нет:

Отправить комментарий