对于控制器和方法,Restful laravel应用程序的最佳实践是什么

对于控制器和方法,Restful laravel应用程序的最佳实践是什么,rest,laravel,laravel-5,restful-url,Rest,Laravel,Laravel 5,Restful Url,我正在开发一个restful laravel应用程序,我需要知道实现路由的最佳实践是什么,Laravel中的控制器和方法要同时支持restful请求和HTTP web请求,我们可以轻松创建一个资源控制器,然后将以下行添加到Laravel中的routes文件中: Route::resource('Photo','PhotoController') 然后在PhotoController中,我们只需要添加以下代码行,这些代码从所有照片返回json响应: class PhotoController {

我正在开发一个restful laravel应用程序,我需要知道实现路由的最佳实践是什么,Laravel中的控制器和方法要同时支持
restful请求
HTTP web请求
,我们可以轻松创建一个资源控制器,然后将以下行添加到Laravel中的routes文件中:

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

然后在
PhotoController
中,我们只需要添加以下代码行,这些代码从所有照片返回
json
响应:

class PhotoController {

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

     return response()->
                        json(['result' => $photos]);       
     }
}
我们还需要一个
控制器
和一个
方法
,该方法响应web
HTTP
请求并返回一个网页,而不是向web用户显示所有照片的
json
响应

问题: 放置此方法和控制器的最佳位置是哪里?将其放置在同一控制器中并返回视图是否是一种良好的做法?就像下面的例子一样

class PhotoController{

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

            return view('views',['photos'=>$photos]);
  }
}
或者创建另一个
Controller
并在那里处理web请求,并在
routes
文件中添加新的
rout
,例如:
mysite.com\photos\all
到routes文件

或者我必须将其保存在另一个
控制器中
,或者我必须确定请求是否来自同一方法中的web,如下面的示例所示:

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

}
我还必须提到,我以前问过以下问题:
但是没有得到任何答案。

上次你问这个问题时没有得到答案可能是有原因的。这取决于你的项目。我将分享我自己的偏好:

我有两组路由、中间件、控制器和公共服务

路线:

//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);
     }
}
控制器

//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(); 
    }
}
奖金:异常处理程序

你应该看看这个

这看起来可能有很多重复,但对我来说,这比在任何地方添加
$request->wantsJson()
都更具可读性和清晰性。你可能会认为这是一种过度杀戮,在某些情况下,这可能是一种过度杀戮

但是,我喜欢这样,因为api和web的请求和响应逻辑是分开的。因此,我可以处理不同的请求(例如:访问用户信息)和不同的响应(例如:JSON或view)。它还为每种类型的请求创建专用空间,允许您在应用程序的每个部分需要时执行额外的逻辑


同样,这是一个偏好和项目的问题,但我希望它能回答你的问题。

上次你问这个问题时没有得到答案可能是有原因的。这取决于你的项目。我将分享我自己的偏好:

我有两组路由、中间件、控制器和公共服务

路线:

//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);
     }
}
控制器

//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(); 
    }
}
奖金:异常处理程序

你应该看看这个

这看起来可能有很多重复,但对我来说,这比在任何地方添加
$request->wantsJson()
都更具可读性和清晰性。你可能会认为这是一种过度杀戮,在某些情况下,这可能是一种过度杀戮

但是,我喜欢这样,因为api和web的请求和响应逻辑是分开的。因此,我可以处理不同的请求(例如:访问用户信息)和不同的响应(例如:JSON或view)。它还为每种类型的请求创建专用空间,允许您在应用程序的每个部分需要时执行额外的逻辑


同样,这是一个偏好和项目的问题,但我希望它能回答您的问题。

您可能需要检查请求是ajax还是json响应。您是否尝试过使用
if($request->wantsJson()){
?我认为有很多解决方案,这取决于您的项目是什么。我喜欢有两套控制器、中间件、错误处理程序,并将我的所有逻辑放在公共服务类中。您可能想检查请求是ajax还是请求需要json响应。您是否尝试使用
if($request->wantsJson()){
?我认为它们有很多解决方案,这完全取决于您的项目是什么。我希望有两套控制器、中间件、错误处理程序,并将所有逻辑放在公共服务中classes@Siavosh不客气。如果这符合你的要求,请接受question@Siavosh我很乐意。如果这能回答你的问题,请接受