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

8 浏览
0 Comments

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

我有一个动态导航栏,但是在动态网页上无法显示。

当前的输出是:

错误异常

未定义的变量:navContent(视图:C:\Users\Computer

Angel\Documents\blog\resources\views\page\dynamic.blade.php)

期望的输出是我的dynamic.blade.php,其中pageContent是用户通过表单输入的动态页面内容,以及位于标签中的动态导航栏。

这是我的dynamic.blade.php:


    
        {!!$pageContent->pageContent!!}
    

这是我的NavController.php:

    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:

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'];
}

这是我的pages迁移:

public function up()
    {
        Schema::create('pages', function (Blueprint $table) {
            $table->id();
            $table->string('title');
            $table->string('URI');
            $table->text('pageContent');
            $table->timestamps();
        });
    }

这是我的nav迁移:

public function up()
    {
        Schema::create('navs', function (Blueprint $table) {
            $table->id();
            $table->string('navName');
            $table->string('navLink');
            $table->timestamps();
        });
    }

这是我的createNav.blade.php:

@csrf @error('navName')

{{ $message }} @enderror @error('navLink')

{{ $message }} @enderror

这是我的createPage.blade.php:

@csrf @error('title')

{{ $message }} @enderror @error('URI')

{{ $message }} @enderror @error('pageContent')

{{ $message }} @enderror

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

谢谢阅读! 😀

0
0 Comments

问题的出现的原因是希望在动态网页中显示动态导航栏,而不需要在每次渲染视图时都添加navContent。解决方法是使用中间件来实现,可以创建一个名为dynamicNav的中间件,并在该中间件组下注册路由。在该中间件中,可以执行获取导航内容的所有逻辑,然后使用merge方法将其添加到每个经过中间件处理的请求中。另外一种解决方法是使用cache()助手函数缓存导航内容,并在视图中检索。同时,可以重写模型的save()方法,在数据库更新时同时更新缓存。

以下是解决问题的具体步骤:

1. 创建一个名为dynamicNav的中间件,并将路由注册到该中间件组中。

2. 在中间件中执行获取导航内容的逻辑,并使用merge方法将其添加到请求中。

3. 使用cache()助手函数缓存导航内容。

4. 重写模型的save()方法,并在其中更新缓存。

示例代码如下:

// 在模型中重写save方法
public function save(array $options = [])
{
    Cache::put('nav-content', getNavContent());
    parent::save();
}

这样,当数据库更新时,缓存也会被同时更新。

在解决问题的过程中,可能会遇到其他问题或者有其他解决方案,可以参考stackoverflow.com/questions/63883304/...中的解决方案。该解决方案在boot方法中获取变量的方式非常巧妙。

0
0 Comments

问题的原因是没有将变量$navContent传递给视图。解决方法是在控制器中设置变量并传递给视图。下面是一个示例代码:

// 获取导航内容,这只是一个简单的例子
$navContent = $this->getMyNavContent();
return view('navManagement', [
    'navs'       => $navs,
    'navContent' => $navContent
]);

这并不是这个问题的解决方法。基本上,navManagement加载navManagement.blade.php,pageManagement加载pageManagement.blade.php。我想要的是如何在dynamic.blade.php中同时显示导航栏和页面内容。

主要是关于两个控制器的show函数,PageController的show函数显示动态页面内容,NavController的show函数显示动态导航栏。但当我想要同时显示导航栏和页面内容时,它不起作用。

0