从Laravel的Routes.php调用控制器函数

5
我在Laravel的Orders_Controller中有一个名为getOrders($user)的函数。它调用了原始的DB查询并构建一个JSON数组返回。
我无法从路由文件中调用这个函数。
基本上,在路由中接收POST请求,插入新订单,然后我想从这个Routes函数中调用getOrders(user)来获取给定用户的所有现有订单。
有人能帮我想办法如何从Routes.php中调用这个函数吗?
//Handle a new order POST
Route::post('order', array('do' => function() {
    ...
    ... //HANDLE POST DATA AND INSERT NEW ORDER
    ...

    //GET ALL ORDERS FOR THIS USER FROM ORDER CONTROLLER
    $userOrders = Order_Controller::myOrders($thisUser);
}

order.php(位于控制器文件夹中)

class Order_Controller extends Base_Controller
{
    public function myOrders($user){
        return DB::query("SELECT ...");
    }
}
5个回答

6

如larauser所建议,您可以将myOrders()方法移动到一个模型中,并以静态方式调用它。以下是一个示例

class Order extends Eloquent {

    public static function myOrders($user)
    {
         // DB call here
    }
}

那么在你的路由中,你可以这样做:

Route::post('order/(:num)', function($user)
{
    $userOrders = Order::myOrders($user);

    // Do stuff here
});

我猜你正在传递用户ID,这就是我在路由中使用(:num)的原因。
希望有所帮助。

那么我真的应该在控制器中处理POST数据,然后从控制器内部调用此函数吗?我正在尝试了解如何在现有网站上实现Laravel的最佳方法,但我不确定路由/控制器/模型应该如何协同工作。 - jamis0n
@jamis0n 你也可以这样做(我的首选)。如果您已经注册了控制器并且您的路由像您的情况一样简单,甚至不需要一个路由。要注册您的控制器,您需要在您的路由文件中调用Route::controller(array('order', 'anothercontroller')); - afarazit
明白了...所以如果我从Routes.php中删除POST路由,那么对于orders的POST请求将会在订单控制器中被捕获,如果Laravel示例已经添加到你的回答中,是这样吗? - jamis0n
太棒了,谢谢!我会同时探索两种方法的。你能帮我理解一下在这种情况下将函数设为静态函数的作用吗?这是因为我将其作为类的函数而不是对象实例的函数来调用所以需要这样做吗? - jamis0n
@afarazit 为什么 myOrders() 是一个静态函数? - Justin
@Justin 如果你查看他的示例,你会发现他想要静态的 $userOrders = Order_Controller::myOrders($thisUser); 所以我就跟着他的示例做了。但不一定非得是静态的。 - afarazit

6
更简单的方法是将控制器称为类。
Route::post( 'post', function() use ($user) {
  return (new OrderController)->myOrders($user);
});


5

还有一种方法,我可能用得不正确,但它可能适合你。

$userOrders = Controller::call('order@myOrders', array($thisUser))->content

如需更多信息以及如何使用,请查看Controller class的文档。


这对我不起作用;我用过更好的方法:URL::action('FooController@method'); 或相应的辅助函数:action('FooController@method');。http://laravel.com/docs/controllers#basic-controllers - ptim
是的,这个回复是基于 Laravel 3 的,所以它可能已经改变了。我有一段时间没有检查过了。 - mattl
1
刚才快速查看了一下,Laravel 4 中现在有 Controller::callAction() 这个函数,看起来它可以做同样的事情 - 去试试看,如果可行就告诉我。前往 http://laravel.com/api/4.1/ 并搜索 'callAction'。 - mattl
感谢您的跟进:我确实尝试了那个方法,但是出现了以下错误:ErrorException Non-static method Illuminate\Routing\Controller::callAction() should not be called statically。这个帖子http://forumsarchive.laravel.io/viewtopic.php?pid=39972提到了它;Taylor添加了一些东西(missingMethod?我现在已经找不到github问题了),但我没有理解它 :/ - ptim

3

myOrders函数应该放在订单模型中,因为它涉及数据访问。然后,要调用它,您可以使用Orders::myOrders($user)。


1

Routes.php

//Handle a new order POST
Route::post('orders/(:num)', function($user) {
    ...
    ... //HANDLE POST DATA AND INSERT NEW ORDER
    ...
});

Route::get('orders', function($user) {
   //GET ALL ORDERS FOR THIS USER FROM ORDER MODEL
   $userOrders = Order::myOrders($user)->get();
});

application/models/Order.php

class Order extends Eloquent
{
    public static function myOrders($user_id)
    {
        return Order::where_user_id($user_id);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接