我阅读了有关Laravel服务提供商和容器的文章。我知道服务提供程序是一种组织服务对象绑定到IoC的方法,在您的应用程序相当大时非常有用。
然后我查看了ready service provider文件夹,看到了这个AppServiceProvider
提供程序和注册方法,如果它:
public function register()
{
$this->app->bind(
'Illuminate\Contracts\Auth\Registrar',
'App\Services\Registrar'
);
}
为什么他们将命名空间绑定到IoC,当你可以App::make
无需绑定这些命名空间就可以获取它?在我看到这段代码之前,我以为我理解了这项业务的运作方式。
为什么他们这样做?谢谢!
答案 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中阅读它,如果没有帮助,请问:)