对于控制器和方法,Restful laravel应用程序的最佳实践是什么
我正在开发一个restful laravel应用程序,我需要知道实现路由的最佳实践是什么,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请求
和HTTP web请求
,我们可以轻松创建一个资源控制器,然后将以下行添加到Laravel中的routes文件中:
Route::resource('Photo','PhotoController')代码>
然后在PhotoController
中,我们只需要添加以下代码行,这些代码从所有照片返回json
响应:
class PhotoController {
public function index()
{
$photos = Photo::all();
return response()->
json(['result' => $photos]);
}
}
我们还需要一个控制器
和一个方法
,该方法响应webHTTP
请求并返回一个网页,而不是向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我很乐意。如果这能回答你的问题,请接受