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



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

电流输出为:ErrorException未定义的变量:navContent(视图:C:\Users\ComputerAngel\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 AppHttpControllers;
use IlluminateHttpRequest;
use AppNav;
use DB;
use IlluminateDatabaseMySqlConnection;
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 = AppNav::where('navName', $request->navName)
->update([
'navLink' => $request->navLink
]);
return redirect('/n');
}
public function destroy(Request $request)
{
$obj = AppNav::where('navName', $request->navName)
->delete();
return redirect('/n');
}
}

这是我的PageController.php:

<?php
namespace AppHttpControllers;
use AppPage;
use IlluminateHttpRequest;
use DB;
use IlluminateDatabaseMySqlConnection;
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 = AppPage::where('URI', $request->URI)
->update([
'title' => $request->title,
'pageContent' => $request->pageContent
]);
return redirect('/p');
}
public function destroy(Request $request)
{
$obj = AppPage::where('URI', $request->URI)
->delete();
return redirect('/p');
}
}

这是我的Nav.php:

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

这是我的页面。hp:

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.hp:

<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.hp:

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

这是我的网页。hp:

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

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(来实现这一点,并在该中间件组下注册路由。

在该中间件中,您可以完成获取导航内容的所有逻辑,然后使用类似merge的东西,如下所示:$request->merge(['dynamicNav' => $navContent]);

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

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

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

最新更新