【问题标题】:How do I show a dynamic navigation bar on a dynamic web page in Laravel?如何在 Laravel 的动态网页上显示动态导航栏?
【发布时间】:2021-01-01 00:56:38
【问题描述】:

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

当前输出为: 错误异常 未定义变量:navContent(查看:C:\Users\Computer Angel\Documents\blog\resources\views\page\dynamic.blade.php)

所需的输出是我的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>

这是我的 NavController.php:

    <?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Nav;
use DB;
use Illuminate\Database\MySqlConnection;
class NavController extends Controller
{
    public function index()
    {
        $navs = Nav::all();
        return view('navManagement', compact('navs'));
    }
    public function create()
    {
        return view('createNav');
    }
    public function store(Request $request)
    {
        $data = request()->validate([
            'navName'            =>  'required',
            'navLink'              =>  'required',
       ]);
        $nav = new Nav([
            'navName'            =>    $request->get('navName'),
            'navLink'              =>    $request->get('navLink'),
        ]);
        $nav->save();
        return redirect('/n');
    }
    public function show($navName)
    {
        $navContent = DB::table('navs')->where('navName',$navName)->first();
        return view('page.dynamic', ['navContent' => $navContent]);
    }
    public function edit($navName)
    {
        $navContent = DB::table('navs')->where('navName',$navName)->first();
        return view('editNav', ['navContent' => $navContent]);
    }
    public function update(Request $request)
    {
        $data = $request->validate([
            'navName' => 'required|exists:navs,navName',
            'navLink' => 'required'
        ]);
        $obj = \App\Nav::where('navName', $request->navName)
            ->update([
                'navLink' => $request->navLink
           ]);
        return redirect('/n');
    }
    public function destroy(Request $request)
    {
        $obj = \App\Nav::where('navName', $request->navName)
        ->delete();
        return redirect('/n');
    }
}

这是我的 PageController.php:

<?php

namespace App\Http\Controllers;
use App\Page;
use Illuminate\Http\Request;
use DB;
use Illuminate\Database\MySqlConnection;
class PageController extends Controller
{
    public function index()
    {
        $pages = Page::all();
        return view('pageManagement', compact('pages'));
    }
    public function create()
    {
        //This will load create.blade.php
        return view('createPage');
    }
    public function store(Request $request)
    {
        $data = request()->validate([
            'title'            =>  'required',
            'URI'              =>  'required|min:5|max:10|',
            'pageContent'      =>  'required',
        ]);
        $page = new Page([
            'title'            =>    $request->get('title'),
            'URI'              =>    $request->get('URI'),
            'pageContent'      =>    $request->get('pageContent'),
        ]);
        $page->save();
        return redirect('/p');
    }
    public function show($URI)
    {
        $pageContent = DB::table('pages')->where('URI',$URI)->first();
        return view('page.dynamic', ['pageContent' => $pageContent]);
    }
    public function edit($URI)
    {
        $pageContent = DB::table('pages')->where('URI',$URI)->first();
        return view('editPage', ['pageContent' => $pageContent]);
    }
    public function update(Request $request)
    {
        $data = $request->validate([
            'title' => 'required',
            'URI' => 'required|min:5|max:10|exists:pages,URI',
            'pageContent' => 'required'
        ]);
        $obj = \App\Page::where('URI', $request->URI)
            ->update([
                'title' => $request->title,
                'pageContent' => $request->pageContent
           ]);
        return redirect('/p');
    }
    public function destroy(Request $request)
    {
        $obj = \App\Page::where('URI', $request->URI)
        ->delete();
        return redirect('/p');
    }
}

这是我的 Nav.php:

class Nav extends Model
{
    protected $fillable = ['navName', 'navLink'];
}

这是我的 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:

<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>

这是我的 createPage.blade.php:

<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>

这是我的 web.php:

Route::get('/page/{URI}', 'PageController@show');
Route::get('/page/{URI}/edit', 'PageController@edit');
Route::get('/p', 'PageController@index');
Route::get('/createPage', 'PageController@create');
Route::post('/storePage', 'PageController@store');
Route::patch('/page/{URI}', 'PageController@update');
Route::delete('/page/{URI}', 'PageController@destroy');
Route::get('/nav/{navName}/edit', 'NavController@edit');
Route::get('/n', 'NavController@index');
Route::get('/createNav', 'NavController@create');
Route::post('/storeNav', 'NavController@store');
Route::patch('/nav/{navName}', 'NavController@update');
Route::delete('/nav/{navName}', 'NavController@destroy');

以下是我的 github 存储库链接,如果您想查看我的完整代码,或者您想尝试在集成开发环境中运行代码。 https://github.com/xiaoheixi/blog

感谢阅读! :D

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    如果抱怨找不到名为 $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
    ]);
    

    【讨论】:

    • 这不是这个问题的方法。基本上 navManagement 加载 navManagement.blade.php 和 pageManagement 加载 pageManagement.blade.php。我要问的是,如何将两个不同控制器的 navContent 和 pageContent 显示到 dynamic.blade.php。
    • 主要讲两个控制器上的show函数,在PageController中的show函数,显示动态页面内容。在 NavController 上,show 函数显示动态导航栏。但是当我希望导航栏和页面内容都显示时,它就不起作用了。
    【解决方案2】:

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

    在该中间件中,您可以执行获取导航内容的所有逻辑,然后使用merge 之类的东西,如here 所示: $request-&gt;merge(['dynamicNav' =&gt; $navContent]);

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

    我要做的是缓存导航内容并使用cache()帮助器在视图中检索,然后覆盖模型的save()方法以在更新数据库时也更新缓存(以避免重复代码,您可以为获取导航创建一个特征)。示例:

    // in your model
    
    public function save(array $options = [])
    {
        Cache::put('nav-content', getNavContent());
        parent::save();
    }
    

    【讨论】:

    • 我已经修好了,其实修起来超级容易。让我分享一下我的解决方案。
    • 这个问题是我的另一个问题,它显示了我的解决方案并且对我有用。这样做的想法非常巧妙,只需在引导方法中获取变量即可。
    猜你喜欢
    • 2018-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-30
    • 1970-01-01
    • 2016-04-02
    • 2019-08-10
    • 1970-01-01
    相关资源
    最近更新 更多