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


Laravel: calling controller method from another location

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

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);
    }
}

我得到以下错误

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

我不太精通OOP。我叫错了吗?因为我认为我调用的方法会获取在控制器中注入的实例,而不是从我调用它的地方

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

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

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

然后把这个类注入到控制器中

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

对selecrandom方法的一些修改

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);
}