在Facades Underlying Class中使用时,Laravel DI无法正常工作

时间:2016-03-24 14:58:37

标签: php laravel dependency-injection

这是我的Facades Class

(.)\1{9,}

这就是我如何绑定到IOC(不确定我是否使用正确的术语)

<?php 

namespace App\Facades;

use Illuminate\Support\Facades\Facade;

class UserFacade extends Facade 
{
    protected static function getFacadeAccessor()
    {
        return 'user';
    }
}

这是包含用户实体

的实际代码的基础类
<?php

namespace App\Providers;


use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\App;

class RUserServiceProvider extends ServiceProvider
{
    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        App::bind('user', function() {
            return new \App\Http\Responses\RUser;
        });
    }
}

这就是我在UserController中使用我的RUser类的方法

<?php 

namespace App\Http\Responses;

use Illuminate\Database\Eloquent\ModelNotFoundException;
use App\Utils\TokenGenerator;
use App\Models\User;
use Validator;
use Hash;

class RUser
{
    protected $token_generator;

    public function __construct(TokenGenerator $token_generator)
    {
        $this->token_generator = $token_generator;
    }

    /**
     * Signup User
     * @param  Request $request 
     * @return array $response
     */
    public function signup($data)
    {
        $response = [];
        $access_token = $this->token_generator->generate(32);
        $user = User::create([
            'email' => $data->email,
            'password' => Hash::make($data->password),
            'company_name' => $data->company_name,
            'access_token' => $access_token
        ]);
        $response['user_id'] = $user->_id;
        $response['access_token'] = $user->access_token;
        return $response;
    }
}

现在问题出现在我的RUser类中,我希望Laravel能够自动注入TokenGenerator Dependency,因为它通常会在Controller类中注入依赖项。但我不明白为什么不这样做。

这就是我得到的

  

RUser.php第15行中的ErrorException:参数1传递给   App \ Http \ Responses \ RUser :: __ construct()必须是。的实例   App \ Utils \ TokenGenerator,没有给出,调用   第29行/var/www/html/MyApp/app/Providers/RUserServiceProvider.php   和定义

1 个答案:

答案 0 :(得分:0)

如果您希望容器注入依赖项,则需要使用容器的make()方法而不是本机new运算符:

App::bind('user', function($app) {
    return $app->make('App\Http\Responses\RUser');
});

可以更简洁地写成:

App::bind('user', 'App\Http\Responses\RUser');