依赖注入Laravel


Dependency Injection Laravel

我有一个立面类

use App'Http'Response 
class RUser
{
    public function signup(TokenGenerator $token_generator, $data)
    {
        $response = [];
        $access_token = $token_generator->generate(32);
        dd($access_token);
        $user = User::create($data);
        $response['user_id'] = $user->_id;
        $response[''];
    }
}

现在,在我的UserController中,我正在尝试使用下面中的RUser::signup()函数

class UserController extends Controller
{
    public function store(Request $request)
    {
        $this->request = $request;
        $payload = json_decode($this->request->getContent());
        if($this->validateJson('user.create', $payload)) {
            $validator = Validator::make((array) $payload, User::$rules);
            if ($validator->fails()) {
                $messages = $validator->errors();
                return $this->sendResponse(false, $messages);
            }
            FUser::signup($payload);
            return $this->sendResponse(true, $response);
        }
    }
}

我认为Laravel会自动解决这些依赖关系,我不应该显式地传递TokenGenerator的实例。但我得到了以下错误。

Argument 1 passed to App'Http'Responses'RUser::signup() must be an instance of App'Utils'TokenGenerator, instance of stdClass given, called in 
默认情况下,Laravel只在构造函数中注入自定义类中的实例。控制器操作也将接收注入的实例。

因此,您的示例需要这样的更改才能正常工作:

class RUser
{
    protected $token_generator;
    public function __construct(TokenGenerator $token_generator)
    {
        $this->token_generator = $token_generator;
    }
    public function signup($data)
    {
        $response = [];
        $access_token = $this->token_generator->generate(32);
        dd($access_token);
        $user = User::create($data);
        $response['user_id'] = $user->_id;
        $response[''];
    }
}

class UserController extends Controller
{
    public function store(Request $request, RUser $ruser)
    {
        $this->request = $request;
        $payload = json_decode($this->request->getContent());
        if($this->validateJson('user.create', $payload)) {
            $validator = Validator::make((array) $payload, User::$rules);
            if ($validator->fails()) {
                $messages = $validator->errors();
                return $this->sendResponse(false, $messages);
            }
            $ruser->signup($payload);
            return $this->sendResponse(true, $response);
        }
    }
}

要在自己实例化类时触发外部依赖注入,需要调用Illuminate''Foundation''Application实例的make()方法,如下所示:

$fooBar = $this->app->make('FooBar');

参见Laravel文档

我认为您对Facades和依赖注入的使用感到困惑。你应该在这里遵循的是依赖注入,据我所知,你可以在这里直接使用这个类,它将毫无问题地工作。要清楚地知道什么时候使用facade,什么时候使用依赖注入,请检查这个链接