【问题标题】:Laravel 5 what is the reason of binding namespaces in Service Provider?Laravel 5 在服务提供者中绑定命名空间的原因是什么?
【发布时间】:2015-07-07 19:18:48
【问题描述】:

我阅读了有关 Laravel 服务提供者和容器的文章。我了解 Service Provider 是一种组织服务对象绑定到 IoC 的方法,当您的应用程序相当大时很有用。

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

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

当您可以通过App::make 获得它而不绑定这些命名空间时,为什么他们将命名空间绑定到 IoC?在看到这段代码之前,我以为我了解了该业务的运作方式。

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

【问题讨论】:

    标签: php laravel-5


    【解决方案1】:

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

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

    有接口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 中阅读它,如果它没有帮助,问:)

    【讨论】:

    • 是的,但为什么它们只是绑定命名空间,没有自定义名称?是什么原因?
    • @user1604220 答案在最后一段。稍后,当您想将 AmazonFileStorage 换成 SystemFileStorage 时,您所做的只是绑定,而不是实际使用的任何地方。
    • 因为 'Illuminate\Contracts\Auth\Registrar' 是一个接口而不是一个实现。因此,当您在应用程序中使用此绑定“Illuminate\Contracts\Auth\Registrar”时,IoC 将解析“App\Services\Registrar”。也许以后你会想要改变到其他的实现,你只需在绑定中切换它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-19
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    • 2016-08-05
    • 2019-03-30
    • 1970-01-01
    相关资源
    最近更新 更多