在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()
方法。为什么我需要传递一个参数?我认为类型提示是一种将所需资源注入方法的方法,因此它们不必总是直接传递。我是否错误地理解了这个概念?
答案 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']);
服务容器将查看类型提示并注入一个值(如果有)。