Как в 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-ответ, а не редирект назад и проставление статуса в сессию.. Заранее спасибо!
Для обращения к этой логике как через 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();
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');
Таким образом, у вас будет четкое разделение логики между контроллером, сервисным классом и ajax-запросами, что делает ваш код более модульным и удобным для поддержки и расширения.
Для обращения к этой логике как через 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-запросами, что делает ваш код более модульным и удобным для поддержки и расширения.