Что лучше всего использовать в приложении Restful laravel для контроллеров и методов

Я разрабатываю спокойное приложение laravel, и мне нужно знать, как лучше всего реализовать маршруты, контроллеры и методы в Laravel для поддержки restful requests и HTTP web requests, мы можем легко создать контроллер ресурсов, а затем добавить следующую строку в файл маршрутов в Laravel:

Route::resource('Photo', 'PhotoController');

а затем в PhotoController нам просто нужно добавить следующие строки кода, которые возвращают ответ json для всех фотографий:

class PhotoController {

  public function index()
  {
     $photos = Photo::all();        

     return response()->
                        json(['result' => $photos]);       
     }
}

нам также нужны Controller и method, которые отвечают на веб-запрос HTTP и возвращают веб-страницу вместо ответа json, который отображает все фотографии для веб-пользователей.

Вопрос: где лучше всего поместить этот метод и контроллер? Рекомендуется ли помещать его в один и тот же контроллер и возвращать представление? как следующий пример

class PhotoController{

 public function getAll(){
            $photos = Photo::getAll();

            return view('views',['photos'=>$photos]);
  }
}

или создать еще один Controller и обработать там веб-запросы и добавить новый rout в файл routes, например: mysite.com\photos\all в файл маршрутов?

или мне нужно сохранить это в другом Controller, или мне нужно решить, является ли запрос из Интернета внутри того же метода, как в приведенном ниже примере:

 public function index()
{
   $photos = Photo::all();        
   if ( from web ){
      return view('views',['photos'=>$photos]);
   } else {
      return response()->
                    json(['result' => $photos]);   
   }

}

Я также должен упомянуть, что ранее задавал следующий вопрос: restful-laravel-a">Лучшая практика проектирования для реализации маршрутов и контроллеров для RESTFul-приложения Laravel, но не получил никакого ответа.


person Siavosh    schedule 13.11.2016    source источник
comment
Вероятно, вы хотите проверить, является ли запрос ajax или запрос требует ответа json. Вы пробовали использовать if ($request->wantsJson()) {?   -  person Skysplit    schedule 13.11.2016
comment
Я думаю, что есть много решений, и все зависит от вашего проекта. Мне нравится иметь 2 набора контроллеров, промежуточное ПО, обработчики ошибок и помещать всю мою логику в общие классы обслуживания.   -  person Wistar    schedule 13.11.2016


Ответы (1)


Вероятно, есть причина, по которой вы не получили ответа в прошлый раз, когда задавали этот вопрос. Это действительно зависит от вашего проекта. Поделюсь своими предпочтениями:

У меня есть два набора маршрутов, промежуточного программного обеспечения, контроллеров и общих служб.

Маршруты:

//For web
Route::resource('photo', 'PhotoController');

/For API, with versioning 
Route::resource('api/v1/photo', 'API\PhotoController');

Промежуточное ПО

//For web
public function handle($request, Closure $next, $role="view")
{
 if(Gate::denies($role.'-photo', $photo)){

        if($role == "view"){
            abort(404);
        }

        return $this->redirect($photo)->withErrors(['You are not authorized to see this photo']);;

    }
}
return $next($request);

/For API, with versioning 
 public function handle($request, Closure $next, $role="view")
{
   if(Gate::forUser(Auth::guard('api')->user())->denies($role.'-photo', $photo)){

        if($role == "view"){
            return Response::json([], 404);
        }

        return Response::json([], 403);

    }
}

return $next($request);

Контроллеры

//PhotoController
class PhotoController{

     //RESTful name here   
     public function index(){

         $photoService = new PhotoService();
         $photos = $photoService->getAll();

         return view('views',['photos'=>$photos]);
     }
}

//API\PhotoController
class PhotoController{

     //RESTful name here   
     public function index(){
         $photoService = new PhotoService();
         $photos = $photoService->getAll();

         return Response::json($photos, 200);
     }
}

Сервис

class PhotoService(){

    //You could add a _construct() that would accept Request $request or User $user

    public function getAll(){
        return Photo::all(); 
    }
}

Дополнительно: обработчик исключений

Вы должны взглянуть на этот RestExceptionHandlerTrait.

Это может показаться большим дублированием, но для меня это намного читабельнее и понятнее, чем добавление везде $request->wantsJson(). Вы можете подумать, что это перебор, а в некоторых случаях, вероятно, перебор.

Однако мне это нравится, потому что логика запроса и ответа от моего API и моего веба разделены. Поэтому я могу иметь дело с различными запросами (например, доступ к информации о пользователе) и различными ответами (например, JSON или просмотр). Он также создает выделенное пространство для каждого типа запроса, что позволяет вам выполнять дополнительную логику, если это необходимо для каждой части вашего приложения.

Опять же, это вопрос предпочтений и проекта, но я надеюсь, что это ответит на ваш вопрос.

person Wistar    schedule 13.11.2016
comment
@Siavosh С удовольствием. Пожалуйста, примите, если это отвечает на ваш вопрос - person Wistar; 13.11.2016