Как в 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
189 +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 Апр 2024 в 13:10
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир