在库方法中提示的类型提示请求对象抛出缺少参数错误

时间:2016-06-01 08:37:51

标签: php laravel laravel-5

在Laravel 5.2中, suggested 在控制器方法声明中键入提示请求对象:

我试图在我的一个库中做同样的事情:

<?php

namespace App\Libraries;

use Illuminate\Http\Request;

class MyLibrary {

    public static function doStuff(Request $request) {
        //...
    }
}

但是,当我尝试使用下面代码中显示的库方法时,我得到一个缺少的参数错误:

<?php

namespace App\Http\Controllers;

use App\Libraries\MyLibrary;

class DefaultController extends Controller {

    public function __construct() {
        MyLibrary::doStuff(); // => trows missing argument error
    }

}

现在,我已将Request对象提示为doStuff()方法。为什么我需要传递一个参数?我认为类型提示是一种将所需资源注入方法的方法,因此它们不必总是直接传递。我是否错误地理解了这个概念?

2 个答案:

答案 0 :(得分:2)

你声明了一个方法doStuff(),它接受一个参数,而Argument必须是Request Class的一个实例。

Typehinting只是说出Argument必须是什么类型。

例如

function sum(int $x, int $y) {
    return $x+$y;
}

sum(1,2); // ok
sum('1', 2); // error

所以当你打电话给doStuff时,你必须自己传递请求。

<?php

namespace App\Http\Controllers;

use App\Libraries\MyLibrary;

class DefaultController extends Controller {

    public function __construct() {
        $request = get regest object from laravel;
        MyLibrary::doStuff($request);
    }

}

在php docs上阅读有关类型声明的更多信息:http://php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration

答案 1 :(得分:1)

如果你只用MyLibrary::doStuff()执行一个方法,那么你所要求的正是发生的事情 - 调用doStuff方法时没有任何参数,因此错误。

如果要将任何服务注入到方法中,则需要使用服务容器调用该方法。以下代码应该可以解决问题:

\App::call(['App\Libraries\MyLibrary', 'doStuff']);

服务容器将查看类型提示并注入一个值(如果有)。