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。尽可能遵循框架约定,这将避免您和其他麻烦。