在 Laravel 6 的中间件中注入依赖项的实现
1、查看现有的代码,基于函数 app 实现。app 函数返回 服务容器 实例。无法通过点击 getByName() 跳转至对应的方法。如图1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | <?php namespace App\Http\Middleware; use App\Services\ThemeService; use Carbon\Carbon; use Closure; use Illuminate\Support\Facades\Route; class CurrentTheme { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle( $request , Closure $next ) { $service = app(ThemeService:: class ); // ... $theme = $service ->getByName( $decrypt [ 'name' ]); // ... return $next ( $request ); } } |
2、参考服务容器的自动注入。可以简单地使用「类型提示」 的方式在类的构造函数中注入那些需要容器解析的依赖项,包括 控制器,事件监听器,队列任务,中间件,等 。实际上,这才是大多数对象应该被容器解析的方式。
3、参考网址:https://stackoverflow.com/questions/35439234/laravel-dependency-injection-in-middleware
4、基于构造函数实现。已可通过点击 getByName() 跳转至对应的方法。如图2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | protected $themeService ; public function __construct(ThemeService $themeService ) { $this ->themeService = $themeService ; } /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle( $request , Closure $next ) { $theme = $this ->themeService->getByName( 'vogue' ); } |
近期评论