在其他刀片文件 Laravel 中传递 @include('includes.categories') 时遇到问题
Posted
技术标签:
【中文标题】在其他刀片文件 Laravel 中传递 @include(\'includes.categories\') 时遇到问题【英文标题】:Trouble passing @include('includes.categories') in other blade file Laravel在其他刀片文件 Laravel 中传递 @include('includes.categories') 时遇到问题 【发布时间】:2021-11-09 00:10:43 【问题描述】:所以我忙于我的第一个 laravel 项目。 现在我编辑了我的问题。
无论如何,我的导航栏在所有页面上都可见。 但是我也想要我的 /resources/views/master/search.blade.php 和我的 /resources/views/includes/categories.blade.php 在所有页面上对 auth 用户可见。
对此最好的方法是什么? 尝试了很多东西也尝试使用 https://laravel.com/docs/8.x/views#sharing-data-with-all-views 方法无效。
我最近的尝试是在不同的页面上使用 @include。
现在在页面wishlist.blade.php 上尝试使用categories.blade.php,它有一个@include 本身到subcategories.blade.php
@extends('master.profile')
@section('title', 'Wishlist')
@section('profile-content')
@include('includes.flash.success')
@include('includes.flash.error')
@include('includes.categories', ['categories' => 'categories'])
这给了我错误:“为 foreach() 提供的参数无效
<?php $__currentLoopData = $categories; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $cat): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
<li class="nav-item dropdown" style="list-style: none;">
<a class="btn-dark btn-sm text-white" href="<?php echo e(route('category.show', $cat)); ?>" class="dropdown-item list-group-item-action list-inline-item" id="navbarDropdownMenuLink" aria-haspopup="true" aria-expanded="true"><?php if(isset($category) && $cat -> isAncestorOf(optional($category))): ?>
<?php endif; ?><small><?php echo e($cat -> name); ?></small></a>
<?php if($cat -> children -> isNotEmpty()): ?>
<span class="btn-info btn-sm text-white"><?php echo e($cat -> num_products); ?></span>
<ul class="dropdown-menu-2 text-white" aria-labelledby="navbarDropdownMenuLink">
<?php echo $__env->make('includes.subcategories', ['categories' => $cat -> children], \Illuminate\Support\Arr::except(get_defined_vars(), array('__data', '__path')))->render(); ?>
</ul>
<?php endif; ?>
</li>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
任何建议表示赞赏。
这里是初学者
与此同时,我尝试定义一个变量(请注意,我是初学者,所以即使这对我也不起作用。) 我不知道我是否需要在控制器中执行此操作?
我还尝试了有关查看共享项目的所有内容。 也没有成功,无论我尝试了什么。
我唯一想要的是在我的导航栏下的项目中的所有页面上显示 2 个刀片文件。 因为这 2 个刀片文件将我的导航栏作为一个整体完成。 导航栏(这个在所有页面上) 搜索(这个只在主页面和分类页面) 类别(同上)
我去任何其他页面它只是导航栏。 怎么能轻松解决这个问题。
这就是我现在试图在所有页面上显示的类别导航栏。 我将@include 添加到我的主目录中。
<!doctype html>
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<!-- Bootstrap CSS -->
<link rel="stylesheet" href="/css/app.css">
@hasSection('title')
<title>config('app.name') - @yield('title')</title>
@else
<title>config('app.name')</title>
@endif
</head>
<body class="pb-4">
@auth
@include('master.navbar')
@include('master.search')
@include('includes.categories', ['categories' => $category])
@endauth
@yield('content')
@include('master.footer')
</body>
</html>
这是我得到的错误:
未定义变量:类别
<?php if (! empty(trim($__env->yieldContent('title')))): ?>
<title><?php echo e(config('app.name')); ?> - <?php echo $__env->yieldContent('title'); ?></title>
<?php else: ?>
<title><?php echo e(config('app.name')); ?></title>
<?php endif; ?>
</head>
<body class="pb-4">
<?php if(auth()->guard()->check()): ?>
<?php echo $__env->make('master.navbar', \Illuminate\Support\Arr::except(get_defined_vars(), array('__data', '__path')))->render(); ?>
<?php echo $__env->make('master.search', \Illuminate\Support\Arr::except(get_defined_vars(), array('__data', '__path')))->render(); ?>
<?php echo $__env->make('includes.categories', ['categories' => $category], \Illuminate\Support\Arr::except(get_defined_vars(), array('__data', '__path')))->render(); ?>
<?php endif; ?>
<?php echo $__env->yieldContent('content'); ?>
<?php echo $__env->make('master.footer', \Illuminate\Support\Arr::except(get_defined_vars(), array('__data', '__path')))->render(); ?>
</body>
</html>
这是用于获取类别导航栏的刀片文件:/includes/categories.blade.php
<div class="container-fluid">
<nav class="navbar profile-bg-carbon justify-content-around">
@include('includes.subcategories', ['categories' => $categories])
</nav>
</div>
和 /includes/subcategories.blade.php :
@foreach($categories as $cat)
<li class="nav-item dropdown" style="list-style: none;">
<a class="btn-dark btn-sm text-white" href=" route('category.show', $cat) " class="dropdown-item list-group-item-action list-inline-item" id="navbarDropdownMenuLink" aria-haspopup="true" aria-expanded="true">@if(isset($category) && $cat -> isAncestorOf(optional($category)))
@endif<small> $cat -> name </small></a>
@if($cat -> children -> isNotEmpty())
<span class="btn-info btn-sm text-white"> $cat -> num_products </span>
<ul class="dropdown-menu-2 text-white" aria-labelledby="navbarDropdownMenuLink">
@include('includes.subcategories', ['categories' => $cat -> children])
</ul>
@endif
</li>
@endforeach
这里是 \App\Category 模型
<?php
namespace App;
use App\Traits\Uuids;
use Illuminate\Database\Eloquent\Model;
class Category extends Model
use Uuids;
public $incrementing = false;
protected $primaryKey = 'id';
protected $keyType = 'string';
/**
* Returns collection of root categories
*
* @return \Illuminate\Support\Collection
*/
public static function roots()
return self::whereNull('parent_id') -> get();
/**
* Returns the collection of all categories A-Z ordered
*
* @return \Illuminate\Support\Collection
*/
public static function nameOrdered()
return self::orderBy('name') -> get();
/**
* @return \App\Category parent category, null for root category
*/
public function parent()
return $this -> hasOne(self::class, 'id', 'parent_id');
public function parents()
$ancestorsCollection = collect();
$currentParent = $this -> parent;
while($currentParent != null)
$ancestorsCollection -> push($currentParent);
$currentParent = $currentParent -> parent;
return $ancestorsCollection -> reverse();
/**
* @return collection of category's children
*/
public function getChildrenAttribute()
return self::where('parent_id', $this -> id) -> get();
/**
* Relationship with products
*
* @return collection of \App\Product that belongs to this category
*/
public function products()
return $this -> hasMany(\App\Product::class, 'category_id', 'id')
-> where('active', true);
/**
* @var \App\Category $childCategory
* @return boolean, true if this category is ancestor of $childCategory
*/
public function isAncestorOf($childCategory)
if(is_null($childCategory)) return false;
// starting from parent of the child category
$tempCategory = $childCategory;
// while is not root
while($tempCategory)
// true, if tempCategory equals this category
if($tempCategory -> id == $this -> id)
return true;
$tempCategory = $tempCategory -> parent;
// otherwise $this is not ancestor
return false;
/**
* @return int num products this cateogy and all subcategories sumed up
*/
public function getNumProductsAttribute()
$numProducts = count($this -> products);
$otherCategories = Category::where('id', '<>', $this -> id) -> get();
foreach($otherCategories as $categ)
if($this -> isAncestorOf($categ))
$numProducts += count($categ -> products);
return $numProducts;
/**
* Returns collection of all ancestors, gets the recursivly
*
* @return mixed
*/
public function allChildren()
// get all children
$children = $this -> children;
// foreach child category call recursivly
foreach ($this -> children as $childCategory)
$children = $children-> merge($childCategory -> allChildren());
return $children;
/**
* Array of all subcategories ids
*
* @return mixed
*/
public function allChildrenIds() : array
return $this -> allChildren() -> pluck('id') -> toArray();
/**
* Array of all subcategories names
*
* @return mixed
*/
public function allChildrenNames() : array
return $this -> allChildren() -> pluck('name') -> toArray();
/**
* Returns paginated collection of products of this category and all children categories
*
* @return mixed
*/
public function childProducts()
$allAcceptedCategoriesIds = array_merge([$this -> id], $this -> allChildrenIds());
return Product::where('active', true) -> whereIn('category_id', $allAcceptedCategoriesIds) -> orderByDesc('created_at')
-> paginate(config('market.products_per_page'));
【问题讨论】:
你的错误很明显;您的categories.blade.php
引用了一个名为 $categories
的变量,但您没有提供它。如果你要去@include()
需要一个变量的东西,请确保它在@include()
ing 它的视图中定义,或者传递一个空变量,如@include('includes.categories', ['categories' => collect()])
(或null
等)
嗨蒂姆,非常感谢你,我确实按照你说的添加了行并且能够加载页面。然而,除了猫菜单中的一些背景样式外,它没有显示任何内容。然后我看着关闭并注意到 /includes/categories.blade.php 有这个代码:
是的,它很可能是空白的,因为$categories
现在是一个空集合,所以如果你的subcategories.blade.php
中有一个@foreach($categories as $category)
,那么该块中的任何内容都不会呈现。而不是['categories' => collect()])
,您必须定义 something 来传递。
刚刚将模型添加到我拥有的帖子中
听起来像是一个单独的问题。我会在下面添加一个答案(您可以回答自己的问题)并包含您用来完成此操作的所有代码,然后可能会走开一点并尝试自己弄清楚。如果您仍然遇到问题,请提出一个新问题。
【参考方案1】:
这解决了问题
<?php
namespace App\Providers;
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
View::share('categories', (new \App\Category)->roots());
/**
* Register any application services.
*
* @return void
*/
public function register()
if ($this->app->environment() !== 'production')
$this->app->register(\Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class);
【讨论】:
您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。以上是关于在其他刀片文件 Laravel 中传递 @include('includes.categories') 时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章
在 laravel 中使用 ajax 从控制器刀片文件中传递搜索数据时遇到问题
无法将 Laravel 刀片文件中的道具传递给 Vue 组件