Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#2 Хорошие практики (FAQ) » Практика написания роутов для ajax-запросов в js-скрипте » 18.12.2017 11:53:51

PeterKravets
Ответов: 2

Скажите, пожалуйста, как лучше всего указывать роуты для ajax-запросов в js-скриптах?
Нашел такие пакеты как:
 — https://github.com/aaronlord/laroute
 — https://github.com/tightenco/ziggy

где благодаря им в js файлах можно указывать роуты по их имени
т.е.

PHP
var post = {id1title'Ziggy Stardust'};

return 
axios.get(route('posts.show'post))
    .
then((response) => {
        return 
response.data;
    });

Но здесь меня смущает момент что используя этот подход у нас становятся доступны и видны все роуты и их пути в отдельно генерируемом js-файле, которые потом можно легко считать постороннему пользователю.
Какой правильный способ, что-бы указывать роуты:
 — использовать такие пакеты, или
 — просто указывать все роуты в js-script файле вручную — «users/1/update», но тогда поменяв путь у каких-то с роутов, нужно бегать по всех js файлах и переимонывать и там также
 — или, например, если ajax событие висит на какой-то кнопке то прописывать роут в аттрибуте href а в js уже считывать этот аттрибут и передавать в ajax-метод?
PHP<button href="route('users.update')">Обновить</button>

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

PHP
<ul id="locations">
<
li><a>Россия</a></li>
<
li><a>Украина</a></li>
<
li><a>Америка</a></li>
</
ul>

То здесь тогда указывать роут в каком-то общем родительскем элементе, например, в теге ul?

Как правильно поступать?

#3 Re: Хорошие практики (FAQ) » Вопросы о вызове сервисов и их взаимодействии с репозиториями/моделями » 01.12.2017 10:05:00

[QUOTE]даже если в сервисе будет 1-2 методаЭто не проблема[/QUOTE]
Будет ли хорошо в таком случае в контролер внедрять множество сервисов? Например, мне нужен будет и fileService с 1-2 методами, и calendarService с 1 методом и, например, postService. При этом также в контролер как контейнеры инжектятся и мои модели.

И будет что-то такое:

PHP
public function __construct(Specialization $specializationLanguage $languageLocation $locationLawyerService $lawyerServiceFileService $fileServiceCalendarService $calendarService)
    {
        
$this->specialization $specialization;
        
$this->language $language;
        
$this->location $location;
        
$this->lawyerService $lawyerService;
        
$this->fileService $fileService;
        
$this->calendarService $calendarService;
    }

Нормально ли это?

2) И стоит ли использовать сервисы как обертку над методами create(), update(), где обрабатываются как-то данные и в сервисе вызывается же $this->post->create/update. Или create/update должен вызывать контролер, а сервис возвращает только некие подготовленные данные?
т.е.

PHP
//Controller:
public function store(Request $request)
{
  
$this->lawyerService->create($request);
}

//LawyerService:

public function create(Request $request)
{
  
//здесь как-то обрабатываются данные $request

  
$this->post->create($request); //и в сервисе идет вызов create() с модели
}

Или сервисы как-то только формируют данные, возвращают их в контролер и контролер вызывает на моделе create/update

3) Также сам вызов для рассылки email-ов через —>notify() происходит в контролере?

4) Ты упоминаешь о трансформерах. Что это такое? Ранее не сталкивася с этим определением.

#4 Re: Хорошие практики (FAQ) » Вопросы о вызове сервисов и их взаимодействии с репозиториями/моделями » 30.11.2017 15:24:33

Спасибо за ответы.

Зависит от ситуации, но если логика сложная, то лучше вызвать сервис или трансформер из контроллера

Т.е. правильно ли я понял, если логика простая то мы можем отфильтровать эти данные прямо в моделе, не вызывая при этом сервиса для этого?

Позволь задать, пожалуйста, еще пару вопросов.
1) Что также лучше передавать с контролера в сервис, весь обьект $request или только его параметры $request->all() ? И почему именно так?

2) Как лучше разбивать сервисы? У меня пока получается идет разбивка сервисов по моделях. Для тех моделей где он нужен - создается сервис. И у них у всех есть один общий, родительский где вынесены методы общие, которые могут быть полезны для всех. Правильный ли это подход для не слишком большого проекта? Или нужно разбивать всегда по логике(даже если в сервисе будет 1-2 метода) в независимости большой проект или нет и по моделях не разбивать?

#5 Хорошие практики (FAQ) » Вопросы о вызове сервисов и их взаимодействии с репозиториями/моделями » 29.11.2017 21:54:16

PeterKravets
Ответов: 9

Начал изучать для себя вопрос хороших практик на Laravel, но все же сейчас остались некоторые вопросы на какие не могу найти ответы. Мог бы помочь, пожалуйста, разобратся с этим? Знакомство началаось через эти две теми: Тема#1 , Тема#2 . А потом и через статьи о SRP, именовании, ну и конечно же сам репозиторий хороших практик. Очень сильно помогло разобраться и еще лучше разложить для себе все по полочкам ☺

Как я понял, твоя позиция такова, что нет смысла использовать репозитории, как обертку над елокмент(в репозитории есть смысл только если используешь сырые запросы или квери билдер). Сначала не понимал(так как «все» говорят что репозиторий нужен), но после прочтения этой статьи понял твое видение и почему это «бесполезно» и лишний слой абстракции.

Сам я сейчас для себя решил также работать без репозиториев и выносить запросы в модель Елокмент а саму модель подключаю через IoC — контейнеры.
1) Но вот также, какие именно запросы стоит туда выносить? Как я понимаю, все которые повторяються и те, которые посложнее? А если такие как PHP$this->post->where('date''>''now')->orderBy('title') ? Здесь уже как, считается что присутствует логика и их нужно выносить? Или нет?

2) Может ли репозиторий(в моем случае модель Елокмент) вызывать сервисы? Или он должен быть только коллекцией запросов? Например, нужно обработать какие-то данные передаваемые с реквеста что-бы использовать их в выборке. Каков тогда правильный алгоритм последовательности действий? С контролера вызываем метод репозитория для выборки данных и в него же передаем реквест-данные, где внутри метода репозитория вызываем сервис, их обрабатываем и уже передаем в саму выборку? Например:

PHP
//Controller:
$posts $this->post->getPostsWithFilters($request);

//Model/Repository:
public function getPostsWithFilters($request)
{
   
$data $this->postService->getPreparedData($request);

   return 
$this->all()->where($data) ...//возвращаем запрос с обработанными данными
}

Или вызываем в контролере сервис, который сделает уже обработку данных и + вызовет метод репозитория и вернет результат выборки в контролер, и тогда мы получается с репозиторием напрямую через контролер и не общались. Например:

PHP
//Controller:
$posts $this->postService->getPostsWithFilters($request);

//postService:
public function getPostsWithFilters($request)
{
   
$request modify($request); //обрабатываем как-то данные

   
return $this->post->getPostsWithFilters($request);
}

//Model/Repository:
class Post extends Model
{
    public function 
getPostsWithFilters($request)
    {
        return 
$this->all()->where($data) ...//возвращаем запрос с обработанными данными
    
}
}

Или же вызываем в контролере сервис, который только лишь обрабатывает данные и + вызываем в контролере метод репозитория куда и передаем эти подготовленные данные. Например:

PHP
//Controller:
$data $this->postService->getPreperedData($request);
$posts $this->post->getPostsWithFilters($data);

//или так
$posts $this->post->getPostsWithFilters($this->postService->getPreperedData($request))

А сервис и модель соответственно будуть вылядеть так:

PHP
//Model/Repository:
class Post extends Model
{
    public function 
getPostsWithFilters($request)
    {
        return 
$this->all()->where($request) ...//возвращаем запрос с обработанными данными
    
}
}

//postService:
public function getPreparedData($request)
{
    
$prepared_data modify($request); //обрабатываем как-то данные

    
return $prepared_data;
}

Как правильно по архитекуте и по лучших практиках делать?

3) Также если нужно совсем немного модифицировать некоторые данные(или же какой-то совсем один параметр) в реквесте, можно ли это делать напрямую в конотролере? Без сервисов? Например:

PHP
//Controller
public function store($request)
{

  
$data $request->all();
  
$data['cost'] = $this->tovar->find($data['tovar_id'])->first()->cost;

  
$this->booking->create($data);
}

И можно ли такое использовать в мутаторах?
Например, чтобы совсем не писать эту часть кода ни в сервисе ни в контролере:

PHP
//Model Booking
class Booking extends Model
{
    public function 
setCostAttribute($value)
    {
        
$this->attributes['cost'] = Tovar::find($this->tovar_id)->first()->cost;
    }
}

Можно ли делать так? То есть могут ли две модели елокмент общаться бежду собой? И как правильно тогда их внедрять? Если я использую по всму приложению контейнеры то не будет ли глупо там использовать фасад?(так как вроде внедрить через конструктор как контейнер не получиться). И насколько вообще хороша практика использования мутаторов и аксесоров?

Есть еще несколько вопросов по SPR и RESTFull Api. Был бы очень сильно благодарен за твои ответы и помощь

Подвал раздела