将数据放入 master blade - Laravel

Putting data into master blade - Laravel

我见过几个与我类似的问题,常见的答案是使用视图编辑器。我有一个 HomeController,它通过将查询数据传递给关联的视图来显示数据库中的文章,它有效 see this image link

如您所见,有一个由主布局生成的导航栏,layout.master。

对于导航中的每个标题,我试图通过生成链接的 for 循环显示该部分的每篇文章。

我的代码是这样的。

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, 
        ]);

}

如您所见,我正在将此数据返回给欢迎 blade。

我在我的导航栏中尝试过

@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

但是一旦您离开主页,导航栏就不知道 $loans_article 是什么。

有没有一种干净的方法可以将此数据传递给主 blade 导航而不向每个子视图发送相同的数据?

您必须使用 View Composer 来实现您的目标:

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

我倾向于以这种方式使每个视图都可以使用一个变量来实现这一点:

您的所有控制器都应扩展一个基本控制器,该控制器通常位于 app/Http/Controllers/Controller.php。在此控制器中,您可以放置​​一些将由所有扩展控制器使用的代码。

在这个基本控制器中,您可以使一个变量对所有视图可用,就像这样...

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

您的所有控制器必须扩展此控制器才能正常工作。

如果您的任何控制器有自己的构造函数,您还必须确保调用 parent::__construct() 以确保上面的代码是 运行。如果您的控制器没有自己的构造函数,则可以省略调用 parent::__construct().

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

        // Your constructor code here..
    }
}

这样您应该可以在所有视图中使用 $loans_articles

<?php $contact = DB:table('tbl_contact')->get(); ?>

在顶部的 master.blade.php 中使用此代码 和 使用如

<a href='{{ $contact[0]->fbLink ? $contact[0]->fbLink : " " }}'>

如果您想与所有 blade 模板共享数据,一个简单的方法是通过 appServiceProvider.phpboot 方法。 您可以在 app/Providers/AppServideProvider.php 中找到此文件并进行如下更改:


namespace App\Providers;

use Illuminate\Support\Facades\View;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        View::share('key', 'value');
    }
}

之后您可以使用 {{ $key }}

访问所有 blade 文件中的 value

注意:不要忘记在 class

顶部使用 Illuminate\Support\Facades\View