在我的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。我的电话不正确吗?因为我虽然我调用的方法将采用在控制器中注入的实例,而不是从我称之为的地方。
答案 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;
}
}
,只需将此类注入您的控制器