Php Laravel:从另一个位置调用控制器方法
在我的Laravel应用程序中,我有以下控制器,它将弹性搜索实例作为第一个参数,然后是另一个变量:Php Laravel:从另一个位置调用控制器方法,php,oop,laravel,laravel-5,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(Clien
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。我叫错了吗?因为我认为我调用的方法将采用注入控制器中的实例,而不是从我调用它的位置。在AngularController类selectRandom method中,第一个参数是类实例,第二个参数是数字,这就是为什么会出现此错误。如果要从另一个控制器使用对象访问此方法,则需要设置此对象的第一个参数,第二个参数是您的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);
}
当您从控制器向另一个控制器调用方法时
这意味着你做错了。为此,您应该
使用服务。
在app\Services Utility.php中创建一个类
只需将该类注入控制器
感谢您推荐了一个从控制器调用类的干净方法。我按照您所写的那样做了,但是如果我将实例作为参数注入类中,那么当我从控制器调用此实用程序类的方法时,会发生相同的错误,因为当我调用此
selectRandom
方法时,它期望Elasticsearch实例被传递,即使我已将此实例注入类本身。因此,我想我必须在类内实例化Elasticsearch,正如另一个答案所建议的那样。或者还有其他解决方案?@dmit我刚刚写了一个指南,但我不确定您是否传递了$numRows
参数,但您没有使用它,而且您使用的$searchParams
变量未从任何地方初始化。这可能是导致错误的原因。
use Elasticsearch\Client;
class Utility {
public function selectRandom(Client $es, $numRows) {
# ...search params here
$results = $es->search($searchParams);
return $results;
}
}