Laravel:从另一个位置调用控制器方法

时间:2015-08-31 11:46:15

标签: php oop laravel laravel-5

在我的Laravel应用程序中,我有以下控制器,它将弹性搜索的实例作为第一个参数,然后是另一个变量:

use Elasticsearch\Client;
use App\Http\Requests;
use App\Http\Controllers\Controller;

use Illuminate\Http\Request;

class AngularController extends Controller {
    public function selectRandom(Client $es, $numRows) {
        # ...search params here
        $results = $es->search($searchParams);
        return $results;
    }
}

我需要从另一个控制器调用上面控制器的方法,我这样做:

class HomeCtrl extends Controller {

    public function index() {

        $featured = new AngularController();

        return $featured->selectRandom(12);
    }

}

我收到以下错误

  

参数1传递给   App \ Http \ Controllers \ AngularController :: selectRandom()必须是   Elasticsearch \ Client的实例,给定的整数

我不熟悉OOP。我的电话不正确吗?因为我虽然我调用的方法将采用在控制器中注入的实例,而不是从我称之为的地方。

2 个答案:

答案 0 :(得分:2)

在你的AngularController类selectRandom方法中,第一个参数是一个类实例,第二个是数字,这就是你得到这个错误的原因。如果你想使用对象形式另一个控制器访问这个方法,你需要设置第一个参数这个对象和第二个是你的id。另一个解决方案就在这里

selectRandom方法中的一些修改

public function selectRandom($numRows) {
    # ...search params here
    $es = new Client();
    $results = $es->search($searchParams);
    return $results;
}

然后你使用这个功能

public function index() {

    $featured = new AngularController();

    return $featured->selectRandom(12);
}

答案 1 :(得分:2)

  

当您从控制器调用方法到另一个时   控制器意味着你做错了。为此,你应该   使用服务。

在app \ Services Utility.php中创建一个类

use Elasticsearch\Client;

class Utility {

    public function selectRandom(Client $es, $numRows) {
        # ...search params here
        $results = $es->search($searchParams);
        return $results;
    }
}
  

,只需将此类注入您的控制器