2016-11-13 54 views
1

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

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

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

class PhotoController { 

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

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

我们还需要一个Controllermethod这是为了响应网络HTTP请求,并返回一个网页,而不是它显示所有的照片传到网上用户

质疑json响应: 在哪里放置这个方法和Controller的最好的地方是把它放在同一个Controller中并返回一个视图是一个好习惯?像下面的例子

class PhotoController{ 

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

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

或创建另一个Controller和处理网络请求,这并在routes文件,例如添加新routmysite.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

您可能想检查请求是否是ajax或请求是否需要json响应。你尝试使用'if($ request-> wantsJson()){'? – Skysplit

+1

我认为他们有很多解决方案,这一切都取决于你的项目是什么。我喜欢有2套控制器,中间件,错误处理程序,并把我所有的逻辑放在公共服务类 – Wistar

回答

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

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

+0

非常感谢您分享您的经验 – Siavosh

+0

@Siavosh我的荣幸。请接受,如果这回答你的问题 – Wistar