【问题标题】:Call a controller in Laravel 4在 Laravel 4 中调用控制器
【发布时间】:2013-03-04 15:37:41
【问题描述】:

在 Laravel 3 中,您可以使用 Controller::call 方法调用控制器,如下所示:

Controller::call('api.items@index', $params);

我查看了 L4 中的 Controller 类,发现这个方法似乎取代了旧方法:callAction()。虽然它不是静态方法,但我无法让它工作。可能不是正确的做法?

如何在 Laravel 4 中做到这一点?

【问题讨论】:

    标签: laravel laravel-4


    【解决方案1】:

    您可以使用 IoC。

    试试这个:

    App::make($controller)->{$action}();
    

    例如:

    App::make('HomeController')->getIndex();
    

    你也可以提供参数:

    App::make('HomeController')->getIndex($params);
    

    【讨论】:

    • 在这种方法中不调用过滤器
    • 这取决于你需要什么。对于您有类似/{slug} 的路由并且它可能是产品或页面的情况,您需要调用一个函数来检查数据库中的 slug,然后调用相应的控制器。
    【解决方案2】:

    如果我理解正确,您正在尝试构建一个以 API 为中心的应用程序,并希望在您的 Web 应用程序内部访问该 API,以避免发出额外的 HTTP 请求(例如使用 cURL)。对吗?

    您可以执行以下操作:

    $request = Request::create('api/items', 'GET', $params);
    return Route::dispatch($request)->getContent();
    

    请注意,您需要使用通常用于从外部访问 API 的 uri 路由,而不是指定 controller@method 目标。

    更好的是,您现在可以指定请求应响应的 HTTP 动词。

    【讨论】:

    • 这对我不起作用。我收到Symfony \ Component \ HttpKernel \ Exception \ NotFoundHttpException 错误,它说未找到的 URL 不是api/items,而是进行该调用的控制器。
    • 对 L 4.* 中的更改有什么想法吗?
    • 如何将参数作为get请求传递?如果传入数组,参数在方法中不可访问?
    • 查看 Jason Lewis 的回答,了解如何使用 Input::get stackoverflow.com/questions/16597420/…
    • 使用最新版本的 PHP,App::make( \Path\To\Controller::class )->method( $param1, [$param2] ); 让您的 IDE 知道您在做什么,并允许更轻松地重构,并且看起来更干净(我讨厌散布在 Laravel 代码中的字符串)
    【解决方案3】:

    就像 Neto 所说,您可以使用:

    App::make('HomeController')->getIndex($params);
    

    但是要发送例如带有额外数据的 POST,您可以在之前使用“合并”方法:

    $input = array('extra_field1' => 'value1', 'extra_field2' => 'value2');
    Input::merge($input);
    
    return App:make('HomeController')->someMethodInController();
    

    它对我有用!

    再见

    【讨论】:

      【解决方案4】:

      这不是最好的方法,但您可以创建一个函数来做到这一点:

      function call($controller, $action, $parameters = array())
      {
          $app = app();
          $controller = $app->make($controller);
          return $controller->callAction($app, $app['router'], $action, $parameters);
      }
      
      Route::get('/test', function($var = null) use ($params)
      {
          return call('TestController', 'index', array($params));
      });
      

      【讨论】:

      • Gabriel Koerich 这太棒了!唯一的问题是 Route::currentRouteAction() 为空,在我的情况下,我需要这些信息,你能给我你的意见吗?我在创建了一个问题
      • 那么,你能在参数中传递一个“名称”和该路由的操作吗?
      • 这对我不起作用——laravel 4.2,原型是callAction($method, $parameters),所以你不需要包含$app。此外,callAction 将参数作为参数传递,它不会将它们设置为输入值。
      • 在我回答这个问题时,该方法还需要应用程序和路由器的实例。为什么它将它作为输入值发送?它不是发送http请求,它只是调用一个方法。无论如何,您不应该使用它来调用控制器。
      【解决方案5】:

      Laurent 的解决方案有效(尽管您需要一个前导 / 并且您传递给 Request::create$params 是 GET 参数,而不是由 Laravel 处理的那些(在示例中必须将它们放在 api/items/ 之后)。

      我不敢相信没有更简单的方法可以做到这一点(不是说这很难,但对我来说它看起来有点骇人听闻)。基本上,Laravel 4 没有提供一种简单的方法来使用回调函数将路由映射到控制器?真的吗?这是世界上最常见的事情......

      我必须在我的一个项目中这样做:

      Route::controller('players', 'PlayerController');
      
      Route::get('player/{id}{rest?}', function($id)
      {
          $request = Request::create('/players/view/' . $id, 'GET');
          return Route::dispatch($request)->getContent();
      })
      ->where('id', '\d+');
      

      希望我遗漏了一些明显的东西。

      【讨论】:

      • 看起来你应该使用resourceful controllers。你在用{rest} 占位符做什么?
      • 资源控制器确实应该完成这项工作(昨天左右才开始使用 L4,还没有学习所有新东西),但我希望有一种更“可定制”的处理方式, 以防万一。我想使用 Request::create 并没有那么糟糕。 ({rest?} 是为了让标题中的 ID 后面可以有一些东西,以获得更友好的 URL。)无论如何,谢谢!
      【解决方案6】:
      $request = Request::create('common_slider', 'GET', $parameters);
      return  Controller::getRouter()->dispatch($request)->getContent();
      

      对于 laravel 5.1

      【讨论】:

        【解决方案7】:

        这是一个老问题。但也许有用。有没有别的办法。

        在您的控制器中:您可以将函数声明为 public static

        public static function functioNAME(params)
        {
            ....
        }
        

        然后在 Routes 文件或视图中:

        ControllerClassName::functionNAME(params);
        

        【讨论】:

          猜你喜欢
          • 2014-05-02
          • 2018-01-24
          • 2014-03-08
          • 2014-10-30
          • 2019-08-28
          • 2014-08-06
          • 2013-10-29
          • 2013-06-10
          • 2013-01-03
          相关资源
          最近更新 更多