Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Putting data into master blade - Laravel

Tags:

php

laravel

blade

I have seen a few similar questions to mine, with the common answer being to use a view composer. I have a HomeController that shows articles from a database by passing query data to an associated view, which works see this image link

As you can see there is a nav bar, which is generated by the master layout, layout.master.

For each title in the navigation I am trying to show each article for that section via a for loop which generates the links.

My code is this.

public function index()
{
    $loans_articles = Article::byDepartment('Loans')->get();
    $digital_articles = Article::byDepartment('Digital')->get();
    $consulting_articles = Article::byDepartment('Consulting')->get();

    return view('welcome', 
        [
        'loans_articles' => $loans_articles, 
        'digital_articles' => $digital_articles, 
        'consulting_articles' => $consulting_articles, 
        ]);

}

As you can see I'm returning this data to the welcome blade.

In my nav bar I tried

@if(count($loans_articles) > 0)
            @foreach($loans_articles as $ls)

        <!--for each loop which grabs the articles with department Loans-->
        <li><a href="/article/{{ $ls->id }}">{{  $ls->title }}</a></li>

            @endforeach
        @endif

But as soon as you navigate away from the home page the nav bar doesn't know what $loans_article is.

Is there a clean way to pass this data to the master blade navigation without sending the same data to every subview?

like image 799
Jesse Orange Avatar asked Aug 26 '16 10:08

Jesse Orange


2 Answers

The way I tend to achieve this is by making a variable available to every view in this way:

All of your controller should extend a base controller, which is usually located in app/Http/Controllers/Controller.php. Inside this controller you can put some code that will be used by all extending controllers.

In this base controller you can make a variable available to all views, like this...

class Controller extends BaseController
{
    public function __construct()
    {
        // Load your objects
        $loans_articles = Article::byDepartment('Loans')->get();

        // Make it available to all views by sharing it
        view()->share('loans_articles', $loans_articles);
    }
}

All of your controllers must extend this controller for this to work.

If any of your controllers have their own constructors, you must also make sure to call parent::__construct() to ensure the above code is run. If your controllers don't have their own constructors, you can omit calling parent::__construct().

public class HomeController extends Controller
{
    public function __construct()
    {
        parent::__construct();

        // Your constructor code here..
    }
}

This way you should be able to use $loans_articles in all of your views.

like image 107
Jonathon Avatar answered Oct 13 '22 23:10

Jonathon


You must use View Composer to achieve what you are trying to do :

https://laravel.com/docs/5.2/views

like image 21
pkdq Avatar answered Oct 13 '22 23:10

pkdq