Laravel中UserService调用$this->app->make报$app未定义错误如何解决
错误原因
你自定义的UserService类不属于Laravel框架自带的服务提供者类,也没有手动注入Laravel的应用容器实例作为类属性,所以$this->app本身不存在,调用时就会触发未定义属性的报错。
解决方案
根据你的使用场景可以选择以下任意一种方案:
- 方案1:直接使用App门面调用容器
不需要修改类结构,直接替换原有代码即可,适合临时调用的场景:
// 首先引入App门面 use Illuminate\Support\Facades\App; // 替换原有的make调用代码 $friendRequestService = App::make(FriendRequestService::class);
- 方案2:构造函数注入依赖(推荐)
符合Laravel依赖注入的最佳实践,不需要手动调用容器的make方法,服务容器会自动解析注入的类实例:
namespace App\Services; use Illuminate\Support\Facades\Auth; use App\Services\FriendRequestService; class UserService{ // 声明依赖属性 protected $friendRequestService; // 构造函数声明依赖,Laravel容器会自动完成实例注入 public function __construct(FriendRequestService $friendRequestService) { $this->friendRequestService = $friendRequestService; } // 后续业务代码直接调用$this->friendRequestService即可 }
- 方案3:手动注入应用容器实例
如果你确实需要在类内多处调用容器实例,可以手动注入Application对象作为类属性:
namespace App\Services; use Illuminate\Contracts\Foundation\Application; use Illuminate\Support\Facades\Auth; class UserService{ protected $app; public function __construct(Application $app) { $this->app = $app; } // 业务代码即可正常调用$this->app->make public function yourBusinessMethod() { $friendRequestService = $this->app->make(FriendRequestService::class); } }
如果你需要FriendRequestService为单例类,记得在app/Providers/AppServiceProvider.php的register方法中注册单例绑定:
public function register() { $this->app->singleton(FriendRequestService::class, function ($app) { return new FriendRequestService(); }); }
注册后不管用哪种方式调用,获取到的都是同一个FriendRequestService实例。
内容的提问来源于stack exchange,提问作者CoderTn
相关产品推荐
相关产品推荐

