【问题标题】:How to do restful ajax routes to methods in Laravel 5?如何在 Laravel 5 中为方法做宁静的 ajax 路由?
【发布时间】:2015-05-12 06:46:33
【问题描述】:

所以我有一条如下所示的路线:

Route::any('some/page', ['as' => 'some-page', 'uses' => 'SomePageController@index']);

但是,我也想在我的控制器上点击方法的同一个 URL(使用名为 ajax 的请求参数,例如:some/page/?ajax=my_action)进行 ajax 调用:

索引已经路由:'SomePageController@index' ajax = my_action 需要路由:'SomePageController@ajaxMyAction' ajax = my_other_action 需要路由:'SomePageController@ajaxMyOtherAction' ajax = blah_blah 需要路由:'SomePageController@ajaxBlahBlah ...

在我的 routes.php 文件中进行设置的优雅解决方案是什么?

【问题讨论】:

    标签: php ajax laravel laravel-5 restful-architecture


    【解决方案1】:

    检查 Laravel 的 Http Request 和 Route 类后,我发现 route()setAction() 方法可能很有用。

    所以我创建了一个中间件来处理这个问题:

    <?php namespace App\Http\Middleware;
    
    class Ajax {
    
        public function handle($request, Closure $next)
        {
            // Looks for the value of request parameter called "ajax"
            // to determine controller's method call
            if ($request->ajax()) {
                $routeAction = $request->route()->getAction();
                $ajaxValue = studly_case($request->input("ajax"));
                $routeAction['uses'] = str_replace("@index", "@ajax".$ajaxValue, $routeAction['uses']);
                $routeAction['controller'] = str_replace("@index", "@ajax".$ajaxValue, $routeAction['controller']);
                $request->route()->setAction($routeAction);
            }
    
            return $next($request);
        }
    
    } 
    

    现在我的路线看起来像:

    Route::any('some/page/', ['as' => 'some-page', 'middleware'=>'ajax', 'uses' => 'SomePageController@index']);
    

    并正确命中我的控制器方法(不干扰 Laravel 的正常流程):

    <?php namespace App\Http\Controllers;
    
    class SomePageController extends Controller {
    
        public function index()
        {
            return view('some.page.index');
        }
    
        public function ajaxMyAction(Requests\SomeFormRequest $request){
            die('Do my action here!');
        }
    
        public function ajaxMyOtherAction(Requests\SomeFormRequest $request){
            die('Do my other action here!');
        }
        ...
    

    我认为这是一个相当干净的解决方案。

    【讨论】:

    • 这项技术背后的理念直到今天仍然有效,尽管我现在更喜欢说'SomePageController@indexOrAjax',因为indexOrAjax 更加明确。
    • 我不明白“@indexOrAjax”背后的想法。有什么区别?
    • 它只是在路由文件中为新开发人员提供了更好的线索,即控制器索引方法或控制器 ajax 方法将被调用。
    • 其实我现在已经远离了这种类型的架构,所以从今年早些时候我就没有看过它。我现在将后端视为 API(您不返回视图,但更像 JSON 中的视图模型)。例如,在 Java Spring 框架中,您没有路由文件。取而代之的是,您使用您希望它成为什么样的 restful 端点来注释控制器方法。不管是不是ajax。如果您在一个控制器中有多个 http 动词(即两个 POST),那么您可以轻松地说一个控制器方法需要一个不同于另一种方法的查询参数。轻松愉快。
    • 好兄弟,感谢您与我分享您的想法。
    【解决方案2】:

    如果您保持相同的 URL,您将无法在路由层进行此调度。你有两个选择:

    1. 为您的 AJAX 调用使用不同的路由。例如,您可以在所有 ajax 调用前加上 /api。这是一种常见的方式:

      Route::group(['prefix' => 'api'], function()
      {
      
          Route::get('items', function()
          {
              //
          });
      
      });
      
    2. 如果唯一不同的是您的回复格式。您可以在控制器中使用条件。 Laravel 为此提供了方法,例如:

      public function index()
      {
          $items = ...;
      
          if (Request::ajax()) {
              return Response::json($items);
          } else {
              return View::make('items.index');
          }
      }
      

    如果您想了解更多详细信息,可以阅读此http://laravel.com/api/5.0/Illuminate/Http/Request.html#method_ajax 和此http://laravel.com/docs/5.0/routing#route-groups

    【讨论】:

    • 嗨,亚历山大,感谢您的建议。我认为#1 已经增加了一个不断增长的路由文件,而我宁愿将它保持在一行(但仍然为其他开发人员提供良好的可读路由意图)。并且#2 将通过对其他方法的大量类似开关的调用来填充我的index 方法的顶部。我还必须每次都输入这个(不像我喜欢的那样干)。
    • 但是您是正确的,似乎框架没有自然的方式来支持这一点。但是,我能够使用 middleware 插入一些方法(请参阅我的答案)。
    • 如果您使用 L5,请不要担心大量的路由,它不会降低性能,因为您可以缓存路由。免费演示:laracasts.com/series/whats-new-in-laravel-5/episodes/8
    • +1 @Kyslik,但所有内容都在一个文件中仍然存在可读性问题。在 Laravel 4.1 中,我曾经做 Route::any('some/page/', array('as' =&gt; 'some-page','uses' =&gt; (Request::ajax() ? 'SomePageController@ajax' : 'SomePageController@index'))); 并像 Alexandre 提到的那样,在我的控制器中的方法 public function ajax() 中包含所有 if/then 条件。这可能是我的偏好,但我只是认为 Http 控制器应该代表页面上发生的所有请求操作。服务/等可以重复使用,但我喜欢页面的所有请求一起显示。
    • 在您需要将其作为 API 之前,保持网站仍然是“网站”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-07
    相关资源
    最近更新 更多