我阅读了有关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无论如何都可以在没有绑定这些命名空间的情况下获取它?在我看到这段代码之前,我认为我理解了这项业务的运作方式.
他们为什么这样做?谢谢!
例如,您想在应用程序中使用一些文件存储
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中阅读它,如果它没有帮助, 问 :)