Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/249.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel:从另一个位置调用控制器方法_Php_Oop_Laravel_Laravel 5 - Fatal编程技术网

Php 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

在我的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。我叫错了吗?因为我认为我调用的方法将采用注入控制器中的实例,而不是从我调用它的位置。

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