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

时间:2015-04-28 19:11:20

标签: php laravel-5

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

然后我查看了ready service provider文件夹,看到了这个AppServiceProvider提供程序和注册方法,如果它:

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

为什么他们将命名空间绑定到IoC,当你可以App::make无需绑定这些命名空间就可以获取它?在我看到这段代码之前,我以为我理解了这项业务的运作方式。

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

1 个答案:

答案 0 :(得分:3)

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

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

或者

App::bind( 'MyApp/FileStorage', 'AmazonFileStorage');

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

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

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

}

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

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