依赖注入:不须要经过new
关键字去实例化对象,laravel
用了PHP
的一个机制:反射机制。一层一层向上找,而后自动实例化对象,而不须要本身去手动去new
类。深刻浅出理解依赖注入php
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
容器当中laravel
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
文件内为该中间件指定一个键app
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'; }); });
谢谢你看到这里,有什么想法能够在评论区留言交流,谢谢!ide