在导航条链接之间导航时,Laravel将路线加倍



我对laravel路由有问题。我有一个导航栏,网址是/products/employee。我设法完美地在两者之间切换,没有出错。然而,当我访问链接/products/new,并从那里尝试返回到/products或通过导航栏转到/employees时,链接是/products/products/employee/employee。如何不复制链接?

路线

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');

应用程序刀片

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

索引刀片

@extends('layout.app', ["current"=>"home"])
@section('body')
@endsection

生产刀片

@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

新产品刀片

@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

组件_导航条.刀片

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

问题是如何在a链接上指定href值,它们都被定义为相对于当前路径:

<a ... href="employees" />

上面所说的是;从我目前所在的位置,带我进入employees页面。如果您位于应用程序的根(/(,则路径为/employees。但是,如果您在其他地方,则路径为/you-are-here/employees

您真正想要做的是使用Laravel URL帮助程序之一,如url()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>

现在,无论你在网站结构中有多深,你的链接都会带你进入/products

附带说明一下,鉴于您似乎在执行CRUDDY操作,您可能需要考虑使用Route上可用的resource方法。这为您定义了所有常用路线及其名称。

Route::resource('/products', 'ProductController');
Route::resource('/employees', 'EmployeeController');

请注意,这些假设您遵循命名约定。因此,它不是/products/new,而是/products/create和您的控制器名为{Something}Controller。在可能的情况下遵循框架约定,这将省去您和其他麻烦。

可以显示导航栏吗?也许这是因为你每次扩展"$current"时都会重新定义变量$current的值;layout.app";。如果在导航栏中的返回链接中使用变量$current的值,则通过在每个刀片中重新定义它们,值将发生更改。

另一句话,您应该在href中使用以下语法:对于新产品,例如

<a href="{{ url('/products/new') }}" class="btn btn-sm btn-primary" role="button">New Products</a>

它可以确保您的链接在任何环境中都能工作。

最新更新