Laravel-Class 具有反射参数的方法

Laravel-Class Method with Reflected Parameters

我通常使用这样的参数:

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

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

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

根据它使用的文档reflection.But我不明白。

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

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

例如,如果您有一个函数 public function something(string $something),如果将 String 以外的任何其他类型传递给此函数,它会抛出错误,确保使用正确的数据。

来自 laravel 文档:

Alternatively, and importantly, you may "type-hint" the dependency in the constructor of a class that is resolved by the container, including controllers, event listeners, queue jobs, middleware, and more. In practice, this is how most of your objects should be resolved by the container.
For example, you may type-hint a repository defined by your application in a controller's constructor. The repository will automatically be resolved and injected into the class:

Laravel 有一个很棒的服务容器,它会进行所有依赖注入,所以你不需要传递一个 class 参数,laravel 会为你做。

没有容器你必须传递这个参数

class A {
public $foo;

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

$classA = new A((new Foo))

当laravel遇到这些class时,它resolves他们。

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

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

或者您可以使用接口。您可以将已实现的 class 绑定到接口,laravel 遇到该接口时,它将按您的意愿解析

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

public $redis;

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

进一步查看 laravel service container