将数据放入 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 来实现您的目标:
我倾向于以这种方式使每个视图都可以使用一个变量来实现这一点:
您的所有控制器都应扩展一个基本控制器,该控制器通常位于 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.php
和 boot
方法。
您可以在 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
我见过几个与我类似的问题,常见的答案是使用视图编辑器。我有一个 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 来实现您的目标:
我倾向于以这种方式使每个视图都可以使用一个变量来实现这一点:
您的所有控制器都应扩展一个基本控制器,该控制器通常位于 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.php
和 boot
方法。
您可以在 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 }}
value
注意:不要忘记在 class
顶部使用Illuminate\Support\Facades\View