适用于控制器和方法的Restful laravel应用程序的最佳实践

时间:2016-11-13 00:20:19

标签: rest laravel laravel-5 restful-url

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

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

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

class PhotoController {

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

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

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

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

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]);   
   }

}

我还要提到我之前问过以下问题: Best design practice to implement routes and controllers for a RESTFul Laravel app 但没有得到任何答案。

1 个答案:

答案 0 :(得分:6)

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

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

<强>路线:

//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或视图)。它还为每种类型的请求创建专用空间,允许您在应用程序的每个部分都需要时执行额外的逻辑。

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