【问题标题】:What is best practice in a Restful laravel app for Controllers and methods控制器和方法的 Restful laravel 应用程序中的最佳实践是什么
【发布时间】:2016-11-13 00:20:19
【问题描述】:

我正在开发一个宁静的 laravel 应用程序,我需要知道在 Laravel 中实现路由、控制器和方法以同时支持 restful requestsHTTP 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 并在那里处理网络请求并在routes 文件中添加一个新的rout 例如:mysite.com\photos\all 到路由文件?

或者我是否必须将其保存在另一个 Controller 中,或者我是否必须确定该请求是否来自 Web 内的相同方法,如下例所示:

 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 但没有得到任何答复。

【问题讨论】:

  • 您可能想检查请求是 ajax 还是请求需要 json 响应。您是否尝试过使用if ($request->wantsJson()) {
  • 我认为它们有很多解决方案,这完全取决于您的项目是什么。我喜欢有 2 套控制器、中间件、错误处理程序,并将我的所有逻辑放在公共服务类中

标签: rest laravel laravel-5 restful-url


【解决方案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 和我的 web 的请求和响应逻辑是分开的。因此,我可以处理不同的请求(例如:访问用户信息)和不同的响应(例如:JSON 或视图)。它还为每种类型的请求创建专用空间,允许您在应用程序的每个部分需要时执行额外的逻辑。

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

【讨论】:

  • @Siavosh 很高兴。如果这回答了您的问题,请接受
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-24
相关资源
最近更新 更多