具有反射参数的Laravel类方法

时间:2018-10-12 05:29:23

标签: laravel laravel-5.4

我通常使用这样的参数:

public function test($parameter)
{
 echo 'Parameter value: ' . $parameter;
}

看着laravel service container时,我看到了这段代码。

 public function __construct(UserRepository $users)
    {
        $this->users = $users;
    }

根据文档,它使用反射。但是我不明白。

我不知道参数UserRepository $users的工作方式。那是别名还是什么?

2 个答案:

答案 0 :(得分:2)

这称为类型提示,用于在构造函数中注入依赖项或验证将正确的参数类型传递给函数。注入只是意味着,如果使用make方法调用该类,Laravel将自动提供构造函数所需的类的实例。

例如,如果您有一个函数public function something(string $something),并且将String以外的任何其他类型传递给该函数,则会确保输入正确的数据。

从laravel文档中:

  

或者,重要的是,您可以“暗示”由容器解析的类的构造函数中的依赖关系,包括控制器,事件侦听器,队列作业,中间件等。实际上,这就是容器应解决的大多数对象的方式。
  例如,您可以在控制器的构造函数中键入由应用程序定义的存储库的提示。存储库将自动解析并注入到类中:

答案 1 :(得分:0)

Laravel具有出色的服务容器,它可以进行所有依赖项注入,因此您无需将参数传递给类,而laravel可以为您完成。

没有容器,您必须传递此参数

class A {
public $foo;

public function __construct (Foo $foo){
   $this->foo
}

$classA = new A((new Foo))

当laravel遇到这些类时,它会resolves

您还可以使用singleton()bind()方法手动定义这些类

$this->app->singleton('FooBar', function($app)
{
    return new FooBar($app['SomethingElse']);
});

或者您可以使用界面。您可以将实现的类绑定到接口和laravel,当遇到这种干扰时,它将按您希望的方式解决

$this->app->bind('App\ICacheManager', 'App\RedisManager');

public $redis;

public function __contruct(ICacheManager $redis){
  $this->redis = $redis;
}

有关更多详情,请查看laravel service container