@andressc

Где размещать логику в Laravel?

Здравствуйте! Прошу сильно не бить меня. Я новичок в Laravel. До этого с фреймворками не имел дела вообще. Первое представление о нем я конечно получил. Самую простую основу более менее понимаю. Но не понимаю одного. Где хранить логику, бизнес логику? (Для меня логика и бизнес логика - это алгоритм который берет данные и пишет их в бд попутно возможно что то с ними делая иногда. ну и не только пишет ну и вытаскивает и т.д. Да я скорее всего не прав)

Начитался статей, видео и т.д. Везде одни противоречия, что решить не могу как правильно более менее делать. Проект не самый простой (интернет магазин), поэтому в контроллерах писать мне кажется не стоит. А где все таки писать логику? Обращения к БД и т.д., чтобы это было не очень трудно к пониманию. В моделях? мне кажется нет. Я тут нарыл возможность делать все через сервисы, сервис контейнеры, сервис провайдер. Там методы прописывать ну что то типо выбрать все из базы, сохранить и т.д. И там все держать. А в контроллере просто обращаться к этим методам. Про репозитории почитал посмотрел. Не хочу о них думать. Мозг расплавился от них.

Что я нарыл я хочу спросить нормальная ли это структура приложения или колхоз? Можно ли так делать не будет больших проблем от такого? пс поддерживать приложение в основном буду я сам, но хочу, чтобы все было более менее правильно.

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

ВОТ ПРИМЕР КОДА

один сервис провайдер. В него пихать все например или можно сделать несколько
class SaveStrServiceProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->singleton('App\Helpers\Contracts\SaveStr','App\Helpers\SelectUsers');       
    }
}

вот контракт их например сделать несколько по названиям моделей например грубо говоря
namespace App\Helpers\Contracts	;
use Illuminate\Http\Request;
	
interface SaveStr {
	public static function select($type);	
	public static function selectuser($id);
	public static function selectpurchase($id);
}


вот класс исполнитель, который привязан к контракту(их тоже можно разделить несколько сделать в зависимости от действий. Ну например чтобы разделить область ответственности)
namespace App\Helpers;

use App\Helpers\Contracts\SaveStr;
use App\Order;
use App\Good;
use App\User;
use App\Purchase;
use App\Status_order;
use App\Status_purchase;
use App\Page;

class SelectUsers implements SaveStr {
	public static function select($type) {
		$pages = Page::where('type','=', $type)->get();
		return $pages;
	}
	
	public static function selectuser($id) {
		$users = User::with(['orders.purchase','orders.status_order','orders','orders.goods','orders.purchase.status_purchase'])->where('id','=',$id)->get();
		return $users;
	}
	
	public static function selectpurchase($id) {
		$purchases = Purchase::with(['orders','orders.status_order','orders.goods','status_purchase','orders.user'])->where('id','=',$id)->get();
		return $purchases;
	}	
}


ну а вот контроллер
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Helpers\Contracts\SaveStr;

use App\Order;
use App\Good;
use App\User;
use App\Purchase;
use App\Status_order;
use App\Status_purchase;

use App\Admin_role;
use App\Admin;
use App\Banner;
use App\Category;
use App\City;
use App\Point;
use App\User_role;
use App\Page;

class TestController extends Controller
{
    public function index(SaveStr $saveStr)
    {
        $purchase = $saveStr->selectpurchase(2);
        dump($purchase);
    }
}


Это только пример и вопрос можно ли так делать? Можно ли все там прописывать? Все обращения к бд и другую логику. А в контроллере использовать методы оттуда и уже передавать коллекцию во вьюху. Нормально ли это будет или вообще колхоз глубокий?
Ну или все таки объясните попроще мне как все таки делать, чтобы потом самому не запутаться в этом всем. Тот вариант, что я описал мне кажется простым к пониманию. Но вот так ли это на самом деле? Я уже не знаю что делать и как начинать.

ЗАРАНЕЕ СПАСИБО ЗА ВАШИ ОТВЕТЫ!!
  • Вопрос задан
  • 1572 просмотра
Пригласить эксперта
Ответы на вопрос 1
dmitriylanets
@dmitriylanets
веб-разработчик
направление верное
в данному примере SelectUsers это солянка из
это UserRepository и PurchaseRepository
по принципу единственной ответсвенности нужно разнести по этим двум классам

соответсвенно контроллер будет
class TestController extends Controller
{
 protected $purchaseRepository;
   public function __construct(PurchaseRepositoryInterface $purchaseRepository){
$this->purchaseRepository = $purchaseRepository;
   }
    public function index()
    {
        $purchase = $this->purchaseRepository->selectpurchase(2);
        dump($purchase);
    }
}


по организации бизнес логики, можно в сервисы, но опять же эти сервисы удобно сформировывать от use cases а не от сущностей, поэтому формируются такие классы и методы:
Shopping->addItemToShoppingCart()
Shopping->remoteItemFromShoppingCart()
Shopping->checkout()
Searching->searchByAuthor()
Searching->advancedSearch()

или же на каждое действие свой класс, паттерн команда
Shopping/AddItemToShoppingCart
Shopping/RemoteItemFromShoppingCart
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы