gpt4 book ai didi

php - Laravel 5 在服务提供者中绑定(bind)命名空间的原因是什么?

转载 作者:可可西里 更新时间:2023-11-01 12:57:39 24 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

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

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

或者

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

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

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

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



在这种情况下

$this->app->bind(
'Illuminate\Contracts\Auth\Registrar',
'App\Services\Registrar'
);

有接口(interface) 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'中注入(inject)

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

关于php - Laravel 5 在服务提供者中绑定(bind)命名空间的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29927906/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com