依賴注入:不須要經過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