在其他刀片文件 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' =&gt; collect()])(或null等) 嗨蒂姆,非常感谢你,我确实按照你说的添加了行并且能够加载页面。然而,除了猫菜单中的一些背景样式外,它没有显示任何内容。然后我看着关闭并注意到 /includes/categories.blade.php 有这个代码: 是的,它很可能是空白的,因为$categories 现在是一个空集合,所以如果你的subcategories.blade.php 中有一个@foreach($categories as $category),那么该块中的任何内容都不会呈现。而不是['categories' =&gt; 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 组件

@include 之后刀片未在刀片中显示内容 - Laravel 4.2

将刀片文件中的数据直接传递给 Vue 实例

从刀片 Laravel 传递时,Prop 反应性不起作用

如何在控制器传递变量(laravel)中使用刀片进行 foreach