Php Laravel 5在服务提供商中绑定名称空间的原因是什么?

Php Laravel 5在服务提供商中绑定名称空间的原因是什么?,php,laravel-5,Php,Laravel 5,我读过关于Laravel服务提供商和容器的文章。我知道服务提供者是一种组织服务对象绑定到IoC的方法,在应用程序相当大时非常有用 但随后我在ready service provider文件夹中查找,看到了这个AppServiceProviderprovider和register方法,如果它: public function register() { $this->app->bind( 'Illuminate\Contracts\Auth\Registrar',

我读过关于Laravel服务提供商和容器的文章。我知道服务提供者是一种组织服务对象绑定到IoC的方法,在应用程序相当大时非常有用

但随后我在ready service provider文件夹中查找,看到了这个
AppServiceProvider
provider和register方法,如果它:

public function register()
{
    $this->app->bind(
        'Illuminate\Contracts\Auth\Registrar',
        'App\Services\Registrar'
    );
}
当您可以通过
App::make
获得名称空间而不绑定这些名称空间时,为什么它们要将名称空间绑定到IoC?在我看到这段代码之前,我一直认为我了解这项业务是如何运作的


他们为什么这样做?谢谢

例如,您希望在应用程序中使用一些文件存储

App::bind( 'MyApp/FileStorage', function(){
    return new AmazonFileStorage;
});

bind方法的第一个参数是绑定到容器的唯一id,第二个参数是每次解析FileStorage类时要执行的回调函数,我们还可以传递表示类名的字符串

所以,也许以后您想使用其他文件存储服务。 您只需更改绑定,因为在应用程序中,您将使用“MyApp/FileStorage”



在这种情况下

有两个接口:

<?php namespace Illuminate\Contracts\Auth;

interface Registrar {

/**
 * Get a validator for an incoming registration request.
 *
 * @param  array  $data
 * @return \Illuminate\Contracts\Validation\Validator
 */
public function validator(array $data);

/**
 * Create a new user instance after a valid registration.
 *
 * @param  array  $data
 * @return User
 */
public function create(array $data);

}

是的,但为什么它们只是绑定名称空间,而没有自定义名称?原因是什么?@user1604220答案在最后一段。稍后,当您想将
AmazonFileStorage
替换为
SystemFileStorage
时,您所做的更改只是绑定,而不是实际使用的所有绑定。因为“light\Contracts\Auth\register”是一个接口,而不是一个实现。因此,当您在应用程序中使用此绑定“Illumb\Contracts\Auth\Registrator”时,IoC将解析“app\Services\Registrator”。也许以后你会想换成其他的执行方式,你只需要在绑定中切换它
App::bind( 'MyApp/FileStorage', 'SystemFileStorage');
$this->app->bind(
  'Illuminate\Contracts\Auth\Registrar',
  'App\Services\Registrar'
);
<?php namespace Illuminate\Contracts\Auth;

interface Registrar {

/**
 * Get a validator for an incoming registration request.
 *
 * @param  array  $data
 * @return \Illuminate\Contracts\Validation\Validator
 */
public function validator(array $data);

/**
 * Create a new user instance after a valid registration.
 *
 * @param  array  $data
 * @return User
 */
public function create(array $data);

}
<?php namespace App\Services;

use App\User;
use Validator;
use Illuminate\Contracts\Auth\Registrar as RegistrarContract;

class Registrar implements RegistrarContract {

/**
 * Get a validator for an incoming registration request.
 *
 * @param  array  $data
 * @return \Illuminate\Contracts\Validation\Validator
 */
public function validator(array $data)
{
    return Validator::make($data, [
        'name' => 'required|max:255',
        'email' => 'required|email|max:255|unique:users',
        'password' => 'required|confirmed|min:6',
    ]);
}

/**
 * Create a new user instance after a valid registration.
 *
 * @param  array  $data
 * @return User
 */
public function create(array $data)
{
    return User::create([
        'name' => $data['name'],
        'email' => $data['email'],
        'password' => bcrypt($data['password']),
    ]);
}

}