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

use*_*220 7 php laravel-5

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

但后来我在准备好的服务提供程序文件夹中查找并看到了这个AppServiceProvider提供程序和注册方法,如果它:

public function register()
{
    $this->app->bind(
        'Illuminate\Contracts\Auth\Registrar',
        'App\Services\Registrar'
    );
}
Run Code Online (Sandbox Code Playgroud)

为什么他们将命名空间绑定到IoC,当你App::make无论如何都可以在没有绑定这些命名空间的情况下获取它?在我看到这段代码之前,我认为我理解了这项业务的运作方式.

他们为什么这样做?谢谢!

Kri*_*psv 4

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

App::bind( 'MyApp/FileStorage', function(){
    return new AmazonFileStorage;
});
Run Code Online (Sandbox Code Playgroud)

或者

App::bind( 'MyApp/FileStorage', 'AmazonFileStorage');
Run Code Online (Sandbox Code Playgroud)

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

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

App::bind( 'MyApp/FileStorage', 'SystemFileStorage');
Run Code Online (Sandbox Code Playgroud)



在这种情况下

$this->app->bind(
  'Illuminate\Contracts\Auth\Registrar',
  'App\Services\Registrar'
);
Run Code Online (Sandbox Code Playgroud)

有接口注册器:

<?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);

}
Run Code Online (Sandbox Code Playgroud)

和服务注册商

<?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']),
    ]);
}

}
Run Code Online (Sandbox Code Playgroud)

然后在'App\Http\Controllers\Auth\AuthController'中注入

这背后的概念是“将接口绑定到实现”您可以在官方 laravel 5 文档http://laravel.com/docs/5.0/container#binding-interfaces-to-implementations中阅读它,如果它没有帮助, 问 :)