The Problem
It has always considered a poor practice of Developers on directly querying database from the blade files in Laravel
. For example, in your template file, you may have used something like this:
@foreach(App\User::all() as $user) <li>{{$user}}</li> @endforeach
This may work Ok, but you're directly calling the User
model inside of your blade file. Good practice says your view file shouldn't know whats happening inside & outside your database at all.
We'll look on a couple of solution to tackle this efficiently.
Solution # 1 - Pass it from the View
In your UserController
method you're using. You may pass your variables like so
$users = App\User::all(); return view('user',compact('users'));
This may be a workaround, but think of it as you have to pass on users to every single view you want to display your users on. Well don't just lose hope, Laravel
got you covered.
Solution # 2 - View Composers
In your AppServiceProvider.php
, utilize your boot()
method to pass on the view composer to your application and use it wherever you want to.
public function boot() { \View::share('users',App\User::all()); }
You can now use users
variable inside of any of your application's blade files without any hassle.
The Use-Case
Now you can simply use in your file.blade.php
@foreach($users as $user) <li>{{$user}}</li> @endforeach
Conclusion
You can create a separate ServiceProvider
for your View Composers
, but thats not necessary unless your appServiceProvider
is overloading. Play around with it & let us know if you stuck in between.
If you liked this blog, do share it with your fellow developer friends. You can also follow us on Twitter.