如何在Laravel中的动态网页上显示一个动态导航栏?
如何在Laravel中的动态网页上显示一个动态导航栏?
我有一个动态导航栏,但是在动态网页上无法显示。
当前的输出是:
错误异常
未定义的变量:navContent(视图:C:\Users\Computer
Angel\Documents\blog\resources\views\page\dynamic.blade.php)
期望的输出是我的dynamic.blade.php,其中pageContent是用户通过表单输入的动态页面内容,以及位于标签中的动态导航栏。
这是我的dynamic.blade.php:
@foreach($navContent as $nav) {!!nav-navName!!} @endforeach {!!$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:
这是我的createPage.blade.php:
这是我的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
谢谢阅读! 😀
问题的出现的原因是希望在动态网页中显示动态导航栏,而不需要在每次渲染视图时都添加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
方法中获取变量的方式非常巧妙。
问题的原因是没有将变量$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函数显示动态导航栏。但当我想要同时显示导航栏和页面内容时,它不起作用。