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

Sia*_*osh 1 rest restful-url laravel laravel-5

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

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

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

class PhotoController {

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

     return response()->
                        json(['result' => $photos]);       
     }
}
Run Code Online (Sandbox Code Playgroud)

我们还需要一个Controller和一个method响应Web HTTP请求并返回一个网页而不是一个json响应的响应,该响应向Web用户显示所有照片

问题: 放置此方法的最佳位置在哪里和控制器是一个好的做法,将它放在同一个Controller中并返回一个视图?像下面的例子

class PhotoController{

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

            return view('views',['photos'=>$photos]);
  }
}
Run Code Online (Sandbox Code Playgroud)

或者创建另一个Controller并在那里处理Web请求并routroutes文件中添加一个新的例如:mysite.com\photos\all到routes文件?

或者我是否必须将此保留在另一个中,Controller或者我是否必须使用与以下示例相同的方法来确定请求是否来自Web:

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

}
Run Code Online (Sandbox Code Playgroud)

我还要提到我之前问过以下问题: 为RESTFul Laravel应用程序实现路由和控制器的最佳设计实践 但没有得到任何答案.

Wis*_*tar 6

上次你提出这个问题时,你可能没有得到答案.这真的取决于你的项目.我会分享自己的偏好:

我有两套路由,中间件,控制器和公共服务.

路线:

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

/For API, with versioning 
Route::resource('api/v1/photo', 'API\PhotoController');
Run Code Online (Sandbox Code Playgroud)

中间件

//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);
Run Code Online (Sandbox Code Playgroud)

控制器

//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);
     }
}
Run Code Online (Sandbox Code Playgroud)

服务

class PhotoService(){

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

    public function getAll(){
        return Photo::all(); 
    }
}
Run Code Online (Sandbox Code Playgroud)

奖金:异常处理程序

你应该看看这个RestExceptionHandlerTrait.

它似乎有很多重复,但对我而言,这比$request->wantsJson()在任何地方添加更加可读和清晰.你可能认为这是一种矫枉过正,在某些情况下,这可能是一种矫枉过正.

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

再次,这是一个偏好和项目的问题,但我希望它能回答你的问题.