Laravel控制器中如何初始化给定的函数
P粉404539732
P粉404539732 2024-01-10 16:51:22
0
1
315

我希望初始化一个特定的变量并在类中重用它,而不需要在类中一次又一次地重写整个代码。

$profileInfo = Profile::with('address')->where('id', '=', '1')->get();

上面的变量是我想要重用的。

我尝试使用构造函数

protected $profileInfo;

public function __construct(Profile $profileInfo){
   $this->profileInfo = Profile::with('address')->where('id', '=', '1')->get();
}
public function index($profileInfo){
  $this->profileInfo;
  dd($profileInfo);
}

但是当我在浏览器中加载刀片视图时,我得到 Too少的参数到函数 App\Http\Controllers\ProfileController::index(), 0 Passed

请帮忙吗?

P粉404539732
P粉404539732

全部回复(1)
P粉627027031

您遇到麻烦是因为您混淆了概念。依赖注入、本地实例变量,以及可能的路由模型绑定或路由变量绑定。

依赖注入要求 Laravel 为您提供一个类的实例。在 Laravel 加载某些内容的情况下,它通常会尝试使用 DI 来填充未知数。对于构造函数,您要求 Laravel 为构造函数提供变量名 $profileInfo 下的 Profile 类的新实例。您最终不会在构造函数中使用此变量,因此没有必要在此处请求它。

接下来(仍在构造函数中)设置局部变量 profileInfo 并将其分配给控制器类实例。

继续,当路由尝试触发 index 方法时,存在 $profileInfo 的变量要求。 Laravel 不知道这是什么,并且它与路由中的任何内容都不匹配(请参阅文档中的路由模型绑定)。因此,您会收到“参数太少”消息。 如果此变量不存在,您应该拥有之前设置的 profileInfo

如果你想保留局部变量,你可以这样做:

protected $profileInfo;

public function __construct(){
   $this->profileInfo = Profile::with('address')->where('id', '=', '1')->get();
}
public function index(){
  dd($this->profileInfo);
}

这是另一个建议供您考虑...

由于这称为个人资料,因此似乎我们应该向用户模型询问适当的个人资料记录。

// in your user model, set up a relationship

public function profile(){
  return $this->hasOne(Profile::class);
}

// In controller, if you're getting a profile for the logged in user

public function index(){
   $profile = Auth::user()->profile;
   dd($profile);
}

// In controller, if you're getting profile for another user via route model binding

public function index(User $user){
   $profile = $user->profile;
   dd($profile);
}
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板