一、Service Container的工作机制
1.1 IOC Container的工作机制
依赖注入:不需要通过new
关键字去实例化对象,laravel
用了PHP
的一个机制:反射机制。一层一层向上找,然后自动实例化对象,而不需要自己去手动去new
类。深入浅出理解依赖注入
class Bar {
}
class Foo {
public $bar;
public function __construct(Bar $bar)
{
$this->bar = $bar;
}
}
Route::get('/ioc', function (Foo $foo) {
dd($foo);
});
1.2 Service Container
1.2.1 Service Container 类的依赖管理和依赖注入
管理类的依赖(识别和绑定)和自动new类,不需要我们收到创建:
1.2.2 Service Container Binding - 如何绑定类和服务
(第二种方式
)Binding:(注册)手动实现类与类的依赖关系绑定。your service container bindings will be registered within service providers.
Or
$this->app->singleton('HelpSpot\API', function ($app) {
return new HelpSpot\API($app->make('HttpClient'));
});
1.2.3 Service Container 不使用依赖注入如何解析对象或服务
或:resolve('Family')、 app()['Family']、app()->make('Family')
//这四种解析方式Family可以是任意名称(和bind对应),而依赖注入方式不能这样。
二、理解Service Provider
不但是注册中心,而且是启动中心,最核心的作用是整合vender中的包。然后Service Container 可以很方便地调用这些服务。
2.1 向IOC 容器添加自己的类
Laravel
在扩展方面会使用Service Provider
的方式,让更多自定义的类可以绑定到IOC
容器当中
2.1 根据PSR4生成自定义类
namespace App\Billing;
class Stripe
{
public function charge() {
dd('charged');
}
}
2.2 根据命令生成ServiceProvider
class BillingServiceProvider extends ServiceProvider
{
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
//
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{
//在容器中注册绑定
$this->app->bind('billing', function(){
return new Stripe();
});
}
}
2.3 注册提供器
所有服务提供器都在 config/app.php
配置文件中注册。该文件中有一个 providers
数组,用于存放服务提供器的类名
'providers' => [
// 其他服务提供器
App\Providers\BillingServiceProvider::class,
],
2.4 访问
//Route::get('/provider', function () {
//// dd(app()->make('files')->get(__DIR__.'/console.php'));
// $billing = app('billing');
// dd($billing->charge());
//});
//依赖注入方式
Route::get('/provider', function (\App\Billing\Stripe $billing) {
dd($billing->charge());
});
Facade 伪静态方式调用如:
Route::get('/cache', function () {
return Cache::get('key');
});
三、中间件
3.1 中间件
php artisan make:middleware MustBeAnAdmin
class MustBeAnAdmin
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if ($request->user() && $request->user()->isAdmin()){
return $next($request);
}
}
}
3.2 注册中间件
为路由分配中间件:应该在 app/Http/Kernel.php
文件内为该中间件指定一个键
protected $routeMiddleware = [
//其它
'admin' => \App\Http\Middleware\MustBeAnAdmin::class,
];
3.3 为路由分配中间件
Auth::loginUsingId(2);
Route::group(['prefix' => 'admin', 'middleware' => 'admin'], function (){
Route::get('/users', function (){
return 'admin only';
});
});
致谢
谢谢你看到这里,有什么想法可以在评论区留言交流,谢谢!