Laravel 在导航栏链接之间导航时将路线加倍
Laravel doubles the route when navigating between navbar links
我对 laravel 路线有疑问。我有一个带有 url /products
和 /employee
的导航栏。
我设法在没有出错的情况下完美地切换。但是,当我访问 link /products/new
并从那里尝试返回 /products
或通过导航栏转到 /employees
时,link 是 /products/products
或 /employee/employee
。我如何不复制 links?
路线
Route::get('/', function () {
return view('index');
});
Route::get('/products', 'ControllerProduct@index');
Route::get('/products/new', 'ControllerProduct@create');
Route::post('/products', 'ControllerProduct@store');
Route::get('/products/show/{id}', 'ControllerProduct@show');
Route::get('/products/delete/{id}', 'ControllerProduct@destroy');
Route::get('/products/edit/{id}', 'ControllerProduct@edit');
Route::post('/products/{id}', 'ControllerProduct@update');
app.blade
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="{{asset('css/app.css')}}">
<meta name="csrf-token" content="{{csrf_token()}}">
<style>
body {
padding: 20px;
}
.card {
padding: 20px;
}
h1, h2, h3, h4, h5 {
margin: 20px 0 20px 0;
}
</style>
</head>
<title>Products</title>
<body>
<div class="container">
@component('componente_navbar', ["current"=>$current])
@endcomponent
<main role="main">
@hasSection('body')
@yield('body')
@endif
</main>
</div>
<script src="{{asset('js/app.js')}}" type="text/javascript"></script>
</body>
</html>
index.blade
@extends('layout.app', ["current"=>"home"])
@section('body')
@endsection
producs.blade
@extends('layout.app', ["current"=>"products"])
@section('body')
<h5 class="card-title">Product Registration</h5>
<div class="card border">
<div class="card-body">
@if(count($products)>0)
<table class="table table-ordered table-hover">
<thead>
<tr>
<th>ID</th>
<th>Título</th>
<th>Ações</th>
</tr>
</thead>
<tbody>
@foreach($products $pro)
<tr>
<td>{{$pro->id}}</td>
<td>{{$pro->titulo}}</td>
<td>
<a href="/products/show/{{$pro->id}}" class="btn btn-sm btn-success">Show</a>
<a href="/products/edit/{{$pro->id}}" class="btn btn-sm btn-primary">Edit</a>
<a href="/products/delete/{{$pro->id}}" class="btn btn-sm btn-danger">Delete</a>
</td>
</tr>
@endforeach
</tbody>
</table>
@endif
</div>
<div class="card-footer">
<a href="/products/new" class="btn btn-sm btn-primary" role="button">New Products</a>
</div>
</div>
@if (session('status'))
<br>
<div class="alert alert-danger">
{{ session('status') }}
</div>
@endif
@endsection
new_products.blade
@extends('layout.app', ["current"=>"products"])
@section('body')
<h4>Products Registration</h4>
<div class="card border">
<form action="/products" method="POST">
@csrf
<div class="form-group">
<label for="title_product">Titulo:</label>
<input type="text" class="form-control" name="title_product" required>
<br>
<label for="cod_product">Código:</label>
<input type="text" class="form-control" name="cod_product" pattern="\d{3}-\d{3}-\d{1}" placeholder="Ex.: 000-000-0" required>
<br>
<label for="date_product">Data:</label>
<input type="text" class="form-control" name="date_product" pattern="\d{2}/\d{/}/\d{4}" placeholder="Ex.: dd/mm/aaa" required>
<br>
<label for="value_product">Valor:</label>
<input type="number" class="form-control" name="value_product" step="0.01" required>
<br>
</div>
<button type="submit" class="btn btn-primary btn-sm">Ok</button>
<button type="submit" class="btn btn-danger btn-sm">Cancel</button>
</form>
</div>
@endsection
componente_navbar.blade
<nav class="navbar navbar-expand-lg navbar-dark bg-dark rounded">
<div class="container-fluid">
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav">
<li class="nav-item">
<a @if($current=="home") class="nav-link active" @else class="nav-link" @endif aria-current="page" href="/">Home</a>
</li>
<li class="nav-item">
<a @if($current=="projects") class="nav-link active" @else class="nav-link" @endif href="projects">Projects</a>
</li>
<li class="nav-item">
<a @if($current=="employees") class="nav-link active" @else class="nav-link" @endif href="employees">Employees</a>
</li>
</ul>
</div>
</div>
</nav>
可以显示导航栏吗?
也许是因为你每次扩展“layout.app”时都重新定义了变量$current的值。
如果在导航栏的 return 链接中使用变量 $current 的值,则通过在每个 blade 中重新定义它们,值将被更改。
另外请注意,您应该为 href 使用以下语法:
例如新产品
<a href="{{ url('/products/new') }}" class="btn btn-sm btn-primary" role="button">New Products</a>
它确保您的链接在任何环境下都能正常工作。
问题在于您如何在 a
link 上指定 href
值,它们都是相对于当前路径定义的:
<a ... href="employees" />
以上说的是;从我目前所在的位置,带我到 employees
页面。如果您位于应用程序的根目录 (/
),则路径为 /employees
。但是,如果您在其他任何地方,则路径为 /you-are-here/employees
.
您真正想要做的是使用 Laravel URL helpers such as url()
or route()
.
之一
我个人喜欢 route
助手,因为它使用您为路由定义的名称,这意味着如果给定路由的路径发生变化,您只需在 web.php
文件中进行更改并且不必在代码库中搜索 /some/path/used/everywhere/
.
的实例
您在 web.php
文件中的路由定义中为您的路由定义了一个名称,例如:
Route::get('/products', 'ControllerProduct@index')->name('products.index');
定义了名称(顺便说一句,它们必须是唯一的),您可以将名称与 route()
帮助程序结合使用:
<a ... href="{{ route('products.index') }}">Projects</a>
现在,无论您在站点结构中有多深,您的 link 将始终带您到 /products
。
附带说明一下,鉴于您似乎在进行 CRUDDY 操作,您可能需要考虑使用 Route
上可用的 resource
方法。这为您定义了所有常用路线及其名称。
Route::resource('/products', 'ProductController');
Route::resource('/employees', 'EmployeeController');
请注意,这些假定您遵循命名约定。因此,不是 /products/new
,而是 /products/create
,您的控制器名为 {Something}Controller
。尽可能遵循框架约定,这将避免您和其他麻烦。
我对 laravel 路线有疑问。我有一个带有 url /products
和 /employee
的导航栏。
我设法在没有出错的情况下完美地切换。但是,当我访问 link /products/new
并从那里尝试返回 /products
或通过导航栏转到 /employees
时,link 是 /products/products
或 /employee/employee
。我如何不复制 links?
路线
Route::get('/', function () {
return view('index');
});
Route::get('/products', 'ControllerProduct@index');
Route::get('/products/new', 'ControllerProduct@create');
Route::post('/products', 'ControllerProduct@store');
Route::get('/products/show/{id}', 'ControllerProduct@show');
Route::get('/products/delete/{id}', 'ControllerProduct@destroy');
Route::get('/products/edit/{id}', 'ControllerProduct@edit');
Route::post('/products/{id}', 'ControllerProduct@update');
app.blade
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="{{asset('css/app.css')}}">
<meta name="csrf-token" content="{{csrf_token()}}">
<style>
body {
padding: 20px;
}
.card {
padding: 20px;
}
h1, h2, h3, h4, h5 {
margin: 20px 0 20px 0;
}
</style>
</head>
<title>Products</title>
<body>
<div class="container">
@component('componente_navbar', ["current"=>$current])
@endcomponent
<main role="main">
@hasSection('body')
@yield('body')
@endif
</main>
</div>
<script src="{{asset('js/app.js')}}" type="text/javascript"></script>
</body>
</html>
index.blade
@extends('layout.app', ["current"=>"home"])
@section('body')
@endsection
producs.blade
@extends('layout.app', ["current"=>"products"])
@section('body')
<h5 class="card-title">Product Registration</h5>
<div class="card border">
<div class="card-body">
@if(count($products)>0)
<table class="table table-ordered table-hover">
<thead>
<tr>
<th>ID</th>
<th>Título</th>
<th>Ações</th>
</tr>
</thead>
<tbody>
@foreach($products $pro)
<tr>
<td>{{$pro->id}}</td>
<td>{{$pro->titulo}}</td>
<td>
<a href="/products/show/{{$pro->id}}" class="btn btn-sm btn-success">Show</a>
<a href="/products/edit/{{$pro->id}}" class="btn btn-sm btn-primary">Edit</a>
<a href="/products/delete/{{$pro->id}}" class="btn btn-sm btn-danger">Delete</a>
</td>
</tr>
@endforeach
</tbody>
</table>
@endif
</div>
<div class="card-footer">
<a href="/products/new" class="btn btn-sm btn-primary" role="button">New Products</a>
</div>
</div>
@if (session('status'))
<br>
<div class="alert alert-danger">
{{ session('status') }}
</div>
@endif
@endsection
new_products.blade
@extends('layout.app', ["current"=>"products"])
@section('body')
<h4>Products Registration</h4>
<div class="card border">
<form action="/products" method="POST">
@csrf
<div class="form-group">
<label for="title_product">Titulo:</label>
<input type="text" class="form-control" name="title_product" required>
<br>
<label for="cod_product">Código:</label>
<input type="text" class="form-control" name="cod_product" pattern="\d{3}-\d{3}-\d{1}" placeholder="Ex.: 000-000-0" required>
<br>
<label for="date_product">Data:</label>
<input type="text" class="form-control" name="date_product" pattern="\d{2}/\d{/}/\d{4}" placeholder="Ex.: dd/mm/aaa" required>
<br>
<label for="value_product">Valor:</label>
<input type="number" class="form-control" name="value_product" step="0.01" required>
<br>
</div>
<button type="submit" class="btn btn-primary btn-sm">Ok</button>
<button type="submit" class="btn btn-danger btn-sm">Cancel</button>
</form>
</div>
@endsection
componente_navbar.blade
<nav class="navbar navbar-expand-lg navbar-dark bg-dark rounded">
<div class="container-fluid">
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav">
<li class="nav-item">
<a @if($current=="home") class="nav-link active" @else class="nav-link" @endif aria-current="page" href="/">Home</a>
</li>
<li class="nav-item">
<a @if($current=="projects") class="nav-link active" @else class="nav-link" @endif href="projects">Projects</a>
</li>
<li class="nav-item">
<a @if($current=="employees") class="nav-link active" @else class="nav-link" @endif href="employees">Employees</a>
</li>
</ul>
</div>
</div>
</nav>
可以显示导航栏吗? 也许是因为你每次扩展“layout.app”时都重新定义了变量$current的值。 如果在导航栏的 return 链接中使用变量 $current 的值,则通过在每个 blade 中重新定义它们,值将被更改。
另外请注意,您应该为 href 使用以下语法: 例如新产品
<a href="{{ url('/products/new') }}" class="btn btn-sm btn-primary" role="button">New Products</a>
它确保您的链接在任何环境下都能正常工作。
问题在于您如何在 a
link 上指定 href
值,它们都是相对于当前路径定义的:
<a ... href="employees" />
以上说的是;从我目前所在的位置,带我到 employees
页面。如果您位于应用程序的根目录 (/
),则路径为 /employees
。但是,如果您在其他任何地方,则路径为 /you-are-here/employees
.
您真正想要做的是使用 Laravel URL helpers such as url()
or route()
.
我个人喜欢 route
助手,因为它使用您为路由定义的名称,这意味着如果给定路由的路径发生变化,您只需在 web.php
文件中进行更改并且不必在代码库中搜索 /some/path/used/everywhere/
.
您在 web.php
文件中的路由定义中为您的路由定义了一个名称,例如:
Route::get('/products', 'ControllerProduct@index')->name('products.index');
定义了名称(顺便说一句,它们必须是唯一的),您可以将名称与 route()
帮助程序结合使用:
<a ... href="{{ route('products.index') }}">Projects</a>
现在,无论您在站点结构中有多深,您的 link 将始终带您到 /products
。
附带说明一下,鉴于您似乎在进行 CRUDDY 操作,您可能需要考虑使用 Route
上可用的 resource
方法。这为您定义了所有常用路线及其名称。
Route::resource('/products', 'ProductController');
Route::resource('/employees', 'EmployeeController');
请注意,这些假定您遵循命名约定。因此,不是 /products/new
,而是 /products/create
,您的控制器名为 {Something}Controller
。尽可能遵循框架约定,这将避免您和其他麻烦。