【问题标题】:Laravel 8 Missing required parameters for [Route: shop.show] [URI: {language}/shop/{shop}]Laravel 8 [Route: shop.show] [URI: {language}/shop/{shop}] 缺少必需的参数
【发布时间】:2021-03-08 20:24:03
【问题描述】:

我有错误:

缺少 [Route: shop.show] [URI: {language}/shop/{shop}] 的必需参数。 (查看:C:\xampp\htdocs\frile\resources\views\inc\header.blade.php)

我想我理解我的问题,但我不确定。

我正在尝试通过资源路径访问我的产品的详细信息页面。如果我没有语言切换器,这很好用。

我的语言切换器需要当前的路由名称,因此他可以在其前面添加“en”或“nl”。但是我的资源路由'shop.show'需要一个参数,切换器不能给他。

有解决方法吗?这是我的代码:

路线:

Route::redirect('/', '/en');

Route::group(['prefix' => '{language}'], function () {

   /* pages */
   Route::get('/', [PagesController::class, 'index']) -> name('home');
   /* shop is in the products section */
   Route::get('/projects', [PagesController::class, 'projects']) -> name('projects');
   Route::get('/about', [PagesController::class, 'about']) -> name('about');
   Route::get('/contact', [PagesController::class, 'contact']) -> name('contact');

   /* products */
   Route::resource('shop', ProductController::class);
});

控制器(我将参数产品与它一起提供,这样我的语言切换器就不会崩溃):

public function show($product, $id)
{
    $product = Product::find($id);

    return view('pages.shop.product', [app()->getLocale(), 'product' => $product]);
}

header.blade.php(我的语言切换器所在的位置):

<header>
<h1><a href="{{ route('home', app()->getLocale()) }}">FRILE</a></h1>
<nav>
    <ul>
        <li><a href="{{ route('shop.index', app()->getLocale()) }}">{{ __('nav.shop') }}</a></li>
        <li><a href="{{ route('projects', app()->getLocale()) }}">{{ __('nav.projects') }}</a></li>
        <li><a href="{{ route('about', app()->getLocale()) }}">{{ __('nav.about') }}</a></li>
        <li><a href="{{ route('contact', app()->getLocale()) }}">{{ __('nav.contact') }}</a></li>
        <ul id="languageSwitcher">
            <li><a href="{{ route(Route::currentRouteName(), 'en') }}">en</a></li>
            <li><a href="{{ route(Route::currentRouteName(), 'nl') }}">nl</a></li>
        </ul>
    </ul>
</nav>
</header>

shop.blade.php(我的详细页面链接在哪里):

@extends('layouts.app')

@section('content')

   <h2>shop</h2>
   <a href="{{ route('shop.create', app()->getLocale()) }}">create product</a>

   @if (count($products) > 0)
       @foreach ($products as $product)
           <p><a href="{{ route('shop.show', [app()->getLocale(), $product -> id]) }}">{{ $product -> name }}</a></p>
       @endforeach
       {{ $products->links() }}
   @else
       <p>No products yet</p>
   @endif

@endsection

setLanguage的中间件:

public function handle(Request $request, Closure $next)
{
    App::setLocale($request->language);

    return $next($request);
}

【问题讨论】:

标签: php laravel localization parameter-passing laravel-8


【解决方案1】:

根据您的 show 方法,您正在接受两个参数 $product 和 $id,从 show 方法中删除 $product,因为您没有指定它将在函数中做什么,也没有将它传递给view,我觉得是这个问题,你可以这样放着

public function show ($id) 
{
    ...
}

【讨论】:

  • 这不起作用,我的应用认为我需要提供第二个参数,因为语言切换器,我已经尝试过了。我仍然得到同样的错误。谢谢你的回答。
【解决方案2】:

好吧,所以我以一种糟糕的方式做到了,我只是在我的 header.blade.php 中设置了一个 isset 和空值,它可以工作,但如果有人知道更好的答案,lmk。

header.blade.php:

<header>
<h1><a href="{{ route('home', app()->getLocale()) }}">FRILE</a></h1>
<nav>
    <ul>
        <li><a href="{{ route('shop.index', app()->getLocale()) }}">{{ __('nav.shop') }}</a></li>
        <li><a href="{{ route('projects', app()->getLocale()) }}">{{ __('nav.projects') }}</a></li>
        <li><a href="{{ route('about', app()->getLocale()) }}">{{ __('nav.about') }}</a></li>
        <li><a href="{{ route('contact', app()->getLocale()) }}">{{ __('nav.contact') }}</a></li>
        <ul id="languageSwitcher">
            @isset($product)
                <li><a href="{{ route(Route::currentRouteName(), ['en', $product->id]) }}">en</a></li>
                <li><a href="{{ route(Route::currentRouteName(), ['nl', $product->id]) }}">nl</a></li>
            @endisset
            @empty($product)
                <li><a href="{{ route(Route::currentRouteName(), 'en') }}">en</a></li>
                <li><a href="{{ route(Route::currentRouteName(), 'nl') }}">nl</a></li>
            @endempty
        </ul>
    </ul>
</nav>
</header>

【讨论】:

    【解决方案3】:

    我在网上搜索了将近 3 小时才分析问题,其实很容易解决。

    只需验证您是否拥有所有路由实例的 app()->getLocale(),例如:

    {{ route('password.update', app()->getLocale() ) }}
    

    【讨论】:

      【解决方案4】:

      如果您要传递额外的参数,例如: Shop.blade.php 文件=>

      <p><a href="{{ route('shop.show', [app()->getLocale(), $product -> id]) }}">{{ $product -> name }}</a></p>
      

      使用 app()-.getLocale() 作为第二个参数:

      <p><a href="{{ route('shop.show', [$product ->
      id,app()->getLocale()]) }}">{{ $product -> name }}</a></p>
      

      也许它对你有用。

      【讨论】:

        猜你喜欢
        • 2021-07-12
        • 2023-04-03
        • 2021-11-06
        • 2021-06-09
        • 1970-01-01
        • 2020-07-14
        • 1970-01-01
        • 2020-07-16
        • 1970-01-01
        相关资源
        最近更新 更多