Php 如何在Laravel中的动态网页上显示动态导航栏?

Php 如何在Laravel中的动态网页上显示动态导航栏?,php,laravel,Php,Laravel,我创建了一个动态导航栏,但它不会显示在动态网页上 电流输出为: 错误例外 未定义变量:navContent(视图:C:\Users\Computer Angel\Documents\blog\resources\views\page\dynamic.blade.php) 所需的输出是my dynamic.blade.php,其中pageContent是用户通过表单和标签中的动态导航栏输入的动态页面内容 这是我的dynamic.blade.php: <nav> @foreach

我创建了一个动态导航栏,但它不会显示在动态网页上

电流输出为: 错误例外 未定义变量:navContent(视图:C:\Users\Computer Angel\Documents\blog\resources\views\page\dynamic.blade.php)

所需的输出是my dynamic.blade.php,其中pageContent是用户通过表单和标签中的动态导航栏输入的动态页面内容

这是我的dynamic.blade.php:

<nav>
    @foreach($navContent as $nav)
    <a href="{!!$nav->navLink!!}">{!!nav-navName!!}</a>
    @endforeach        
    </nav>
    <body>
        {!!$pageContent->pageContent!!}
    </body>
<form action="/storeNav" method="post">
@csrf
  <label for="navName">Navigation Bar Option Name:</label><br>
  <input type="text" id="navName" name="navName" autocomplete="off" value="{{ old('navName') }}"> 
<br>
  @error('navName') <p style="color: red">{{ $message }}</p> @enderror
  <label for="navLink">Navigation Bar Option Link:</label><br>
  <input type="text" id="navLink" name="navLink" autocomplete="off" value="{{ old('navLink') }}"> 
<br>
  @error('navLink') <p style="color: red">{{ $message }}</p> @enderror
  <input type="submit" value="Submit">
</form>
<form action="/storePage" method="post">
@csrf
  <label for="title">Title:</label><br>
  <input type="text" id="title" name="title" autocomplete="off" value="{{ old('title') }}"><br>
  @error('title') <p style="color: red">{{ $message }}</p> @enderror
  <label for="URI">URI:</label><br>
  <input type="text" id="URI" name="URI" autocomplete="off" value="{{ old('URI') }}"><br>
  @error('URI') <p style="color: red">{{ $message }}</p> @enderror
  <label for="pageContent">Page Content:</label><br>
  <textarea id="pageContent" name="pageContent" value="{{ old('pageContent') }}"></textarea>
  @error('pageContent') <p style="color: red">{{ $message }}</p> @enderror
  <input type="submit" value="Submit">
</form>
这是my Page.php:

class Page extends Model
{
    protected $fillable = ['title', 'URI', 'pageContent'];
}
这是我的页面迁移:

public function up()
    {
        Schema::create('pages', function (Blueprint $table) {
            $table->id();
            $table->string('title');
            $table->string('URI');
            $table->text('pageContent');
            $table->timestamps();
        });
    }
这是我的导航迁移:

public function up()
    {
        Schema::create('navs', function (Blueprint $table) {
            $table->id();
            $table->string('navName');
            $table->string('navLink');
            $table->timestamps();
        });
    }
这是我的createNav.blade.php:

<nav>
    @foreach($navContent as $nav)
    <a href="{!!$nav->navLink!!}">{!!nav-navName!!}</a>
    @endforeach        
    </nav>
    <body>
        {!!$pageContent->pageContent!!}
    </body>
<form action="/storeNav" method="post">
@csrf
  <label for="navName">Navigation Bar Option Name:</label><br>
  <input type="text" id="navName" name="navName" autocomplete="off" value="{{ old('navName') }}"> 
<br>
  @error('navName') <p style="color: red">{{ $message }}</p> @enderror
  <label for="navLink">Navigation Bar Option Link:</label><br>
  <input type="text" id="navLink" name="navLink" autocomplete="off" value="{{ old('navLink') }}"> 
<br>
  @error('navLink') <p style="color: red">{{ $message }}</p> @enderror
  <input type="submit" value="Submit">
</form>
<form action="/storePage" method="post">
@csrf
  <label for="title">Title:</label><br>
  <input type="text" id="title" name="title" autocomplete="off" value="{{ old('title') }}"><br>
  @error('title') <p style="color: red">{{ $message }}</p> @enderror
  <label for="URI">URI:</label><br>
  <input type="text" id="URI" name="URI" autocomplete="off" value="{{ old('URI') }}"><br>
  @error('URI') <p style="color: red">{{ $message }}</p> @enderror
  <label for="pageContent">Page Content:</label><br>
  <textarea id="pageContent" name="pageContent" value="{{ old('pageContent') }}"></textarea>
  @error('pageContent') <p style="color: red">{{ $message }}</p> @enderror
  <input type="submit" value="Submit">
</form>
下面是我的github存储库链接,如果您想查看我的完整代码,或者想在集成开发环境中尝试运行代码。


谢谢你的阅读D

If抱怨找不到名为
$navContent
的变量

我看不到您将它传递给从
index()
函数调用的任何视图

return view('navManagement', compact('navs'));
return view('pageManagement', compact('pages'));
您需要设置该变量并将其传递给视图

// Get the nav content however you want, this is just a crude example
$navContent = $this->getMyNavContent();

return view('navManagement', [
    'navs'       => $navs,
    'navContent' => $navContent
]);

我猜您希望找到一种嵌入动态导航的方法,而不必在每次渲染视图时添加
navContent
,因为这正是另一个答案所建议的。您可以使用中间件来实现这一点,比如说
dynamicNav
,并在该中间件组下注册您的路由

在该中间件中,您可以执行获取nav内容的所有逻辑,然后使用类似于
merge
,如图所示:
$request->merge(['dynamicNav'=>$navContent])

这样,您的中间件将向通过它的每个请求添加数据,尽管我不推荐这种解决方案

我要做的是缓存nav内容并使用
cache()
助手在视图中检索,然后重写模型的
save()
方法,以便在更新DB时也更新缓存(为了避免重复代码,您可以为nav的获取创建特征)。例如:

//在您的模型中
公共函数保存(数组$options=[])
{
Cache::put('nav-content',getNavContent());
父::save();
}

这不是解决这个问题的方法。基本上,navManagement加载navManagement.blade.php,pageManagement加载pageManagement.blade.php。我要问的是,如何在dynamic.blade.php上显示两个不同控制器的navContent和pageContent。主要是在两个控制器上都显示函数,在PageController中显示函数显示动态页面内容。在导航控制器上,显示功能显示动态导航栏。但是当我想同时显示导航栏和页面内容时,它就不起作用了。我已经修复了它,它实际上非常容易修复。让我和你们分享我的解决方案。这个问题是我的另一个问题,它展示了我的解决方案,它对我很有效。这是一个非常巧妙的想法,通过在boot方法中获取变量来实现。
// Get the nav content however you want, this is just a crude example
$navContent = $this->getMyNavContent();

return view('navManagement', [
    'navs'       => $navs,
    'navContent' => $navContent
]);