依赖注入:不需要通过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);
});
Laravel
在扩展方面会使用Service Provider
的方式,让更多自定义的类可以绑定到IOC
容器当中
namespace App\Billing;
class Stripe
{
public function charge() {
dd('charged');
}
}
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();
});
}
}
所有服务提供器都在 config/app.php
配置文件中注册。该文件中有一个 providers
数组,用于存放服务提供器的类名
'providers' => [
// 其他服务提供器
App\Providers\BillingServiceProvider::class,
],
//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());
});
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);
}
}
}
为路由分配中间件:应该在 app/Http/Kernel.php
文件内为该中间件指定一个键
protected $routeMiddleware = [
//其它
'admin' => \App\Http\Middleware\MustBeAnAdmin::class,
];
Auth::loginUsingId(2);
Route::group(['prefix' => 'admin', 'middleware' => 'admin'], function (){
Route::get('/users', function (){
return 'admin only';
});
});
谢谢你看到这里,有什么想法可以在评论区留言交流,谢谢!