Home  >  Q&A  >  body text

How to initialize a given function in Laravel controller

I want to initialize a specific variable and reuse it in the class without having to rewrite the entire code again and again in the class.

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

The variables above are the ones I want to reuse.

I tried using constructor

protected $profileInfo;

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

But when I load the blade view in the browser, I get Too few parameters to the function App\Http\Controllers\ProfileController::index(), 0 Passed .

Please help?

P粉404539732P粉404539732306 days ago295

reply all(1)I'll reply

  • P粉627027031

    P粉6270270312024-01-11 14:11:54

    You are in trouble because you are confusing concepts. Dependency injection, local instance variables, and possibly route model binding or route variable binding.

    Dependency injection requires Laravel to provide you with an instance of a class. In situations where Laravel loads something, it will usually try to fill in unknowns using DI. For the constructor, you ask Laravel to provide the constructor with a new instance of the Profile class under the variable name $profileInfo. You won't end up using this variable in the constructor, so there's no need to request it here.

    Next (still in the constructor) set the local variable profileInfo and assign it to the controller class instance.

    Continuing, when the route attempts to trigger the index method, there is a variable requirement for $profileInfo. Laravel has no idea what this is, and it doesn't match anything in the route (see Route Model Binding in the documentation). Therefore, you get the "Too few parameters" message. If this variable does not exist, you should have the profileInfo set previously.

    If you want to keep local variables, you can do this:

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

    Here is another suggestion for you to consider...

    Since this is called a profile, it seems like we should ask the user model for the appropriate profile record.

    // 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);
    }
    

    reply
    0
  • Cancelreply