Как в Laravel архитектурно правильно оформить метод, который вызывается и через action контроллера и через ajax? Всем привет.
Подскажите, пожалуйста, по следующему вопросу:
Есть готовый проект в котором имеется action:
NewsController@makeRevision
Action помечает новости в БД для определенных нужд.public function makeRevision(){
$ids = $request->input('ids');
$news = News::whereIn('id', $ids)->get();
... некая логика и заполнение БД ...
Session::flash('status', 'Complete');
return back();
}
Для этого экшена имеется путь для post-запроса: Route::post('/makerevision', 'NewsController@makerevision')->name('makerevision')Вопрос: подскажите, к какому методу архитектурно правильно обратиться через ajax, чтобы выполнилась логика этого экшена? (т.е. куда ее можно вынести?)
Service layer в проекте отсутствует.
Для ajax-запроса нужно вернуть json-ответ, а не редирект назад и проставление статуса в сессию..
Заранее спасибо!

21 Авг 2019 в 06:59
169 +1
0
Ответы
1

Для обращения к этой логике как через action контроллера, так и через ajax, я бы порекомендовал вынести эту логику в отдельный сервисный класс.

Примерно так:

Создайте новый сервисный класс (например, NewsService) в папке Services.В этом классе создайте метод makeRevision, в котором перенесите всю логику из метода makeRevision контроллера:
namespace App\Services;

use App\News;
use Illuminate\Support\Facades\Session;

class NewsService
{
public function makeRevision($ids)
{
$news = News::whereIn('id', $ids)->get();

// ... некая логика и заполнение БД ...
return $news;
}

}

3. В контроллере уберите всю логику из метода makeRevision и замените её вызовом метода из сервисного класса:
```php
namespace App\Http\Controllers;
use App\Services\NewsService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Session;
class NewsController extends Controller
{
protected $newsService;
public function __construct(NewsService $newsService)
{
$this->newsService = $newsService;
}
public function makeRevision(Request $request)
{
$ids = $request->input('ids');
$news = $this->newsService->makeRevision($ids);
Session::flash('status', 'Complete');
return response()->json(['news' => $news]);
}
}Для ajax-запроса создайте новый маршрут для этого метода и обновите javascript код, чтобы отправлять ajax-запрос на этот маршрут и обрабатывать ответ в формате json:
Route::post('/makerevision', 'NewsController@makeRevision')->name('makerevisionAjax');

Javascript:

$.ajax({
url: "{{ route('makerevisionAjax') }}",
type: 'POST',
data: {
ids: [1, 2, 3] // передайте нужные id
},
success: function(response) {
console.log(response);
}
});

Таким образом, у вас будет четкое разделение логики между контроллером, сервисным классом и ajax-запросами, что делает ваш код более модульным и удобным для поддержки и расширения.

20 Апр в 13:10
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 718 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир