Php Laravel 5在服务提供商中绑定名称空间的原因是什么?
我读过关于Laravel服务提供商和容器的文章。我知道服务提供者是一种组织服务对象绑定到IoC的方法,在应用程序相当大时非常有用 但随后我在ready service provider文件夹中查找,看到了这个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',
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']),
]);
}
}