资源方法参数中的 Laravel 路由前缀忽略

Evg*_*nko 4 laravel laravel-5

我需要在我的项目中实施本地化。我添加了一个带有前缀的组。

Route::group([
    'prefix' => '{locale}',
    'where' => ['locale' => '[a-zA-Z]{2}'],
    'middleware' => 'setlocale'
], function () {

   ...

   Route::resource('projects', 'ProjectsController');

   ...

})

Run Code Online (Sandbox Code Playgroud)

中间件 setlocale

<?php

namespace App\Http\Middleware;

use Closure;

class SetLocale
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        app()->setLocale($request->segment(1));
        return $next($request);
    }
}
Run Code Online (Sandbox Code Playgroud)

路由器列表

+--------+----------------------------------------+--------------------------------------------+---------------------------+----------------------------------------------------------------------------+---------------------+
| Domain | Method                                 | URI                                        | Name                      | Action                                                                     | Middleware          |
+--------+----------------------------------------+--------------------------------------------+---------------------------+----------------------------------------------------------------------------+---------------------+
|        | POST                                   | {locale}/projects                          | projects.store            | App\Http\Controllers\ProjectsController@store                              | web,setlocale,auth  |
|        | GET|HEAD                               | {locale}/projects                          | projects.index            | App\Http\Controllers\ProjectsController@index                              | web,setlocale,auth  |
|        | GET|HEAD                               | {locale}/projects/create                   | projects.create           | App\Http\Controllers\ProjectsController@create                             | web,setlocale,auth  |
|        | DELETE                                 | {locale}/projects/{project}                | projects.destroy          | App\Http\Controllers\ProjectsController@destroy                            | web,setlocale,auth  |
|        | PUT|PATCH                              | {locale}/projects/{project}                | projects.update           | App\Http\Controllers\ProjectsController@update                             | web,setlocale,auth  |
|        | GET|HEAD                               | {locale}/projects/{project}                | projects.show             | App\Http\Controllers\ProjectsController@show                               | web,setlocale,auth  |
|        | GET|HEAD                               | {locale}/projects/{project}/edit           | projects.edit             | App\Http\Controllers\ProjectsController@edit                               | web,setlocale,auth  |
+--------+----------------------------------------+--------------------------------------------+---------------------------+----------------------------------------------------------------------------+---------------------+

Run Code Online (Sandbox Code Playgroud)

一切正常。但是有一个问题。当我打开路线时:

http://127.0.0.1:8000/en/projects/1(显示项目)

我收到一个错误

传递给 App\Http\Controllers\ProjectsController::show() 的参数 1 必须是 App\Project 的一个实例,给出的字符串

我将 $locale 添加到我的 show 方法中,并且它有效

+--------+----------------------------------------+--------------------------------------------+---------------------------+----------------------------------------------------------------------------+---------------------+
| Domain | Method                                 | URI                                        | Name                      | Action                                                                     | Middleware          |
+--------+----------------------------------------+--------------------------------------------+---------------------------+----------------------------------------------------------------------------+---------------------+
|        | POST                                   | {locale}/projects                          | projects.store            | App\Http\Controllers\ProjectsController@store                              | web,setlocale,auth  |
|        | GET|HEAD                               | {locale}/projects                          | projects.index            | App\Http\Controllers\ProjectsController@index                              | web,setlocale,auth  |
|        | GET|HEAD                               | {locale}/projects/create                   | projects.create           | App\Http\Controllers\ProjectsController@create                             | web,setlocale,auth  |
|        | DELETE                                 | {locale}/projects/{project}                | projects.destroy          | App\Http\Controllers\ProjectsController@destroy                            | web,setlocale,auth  |
|        | PUT|PATCH                              | {locale}/projects/{project}                | projects.update           | App\Http\Controllers\ProjectsController@update                             | web,setlocale,auth  |
|        | GET|HEAD                               | {locale}/projects/{project}                | projects.show             | App\Http\Controllers\ProjectsController@show                               | web,setlocale,auth  |
|        | GET|HEAD                               | {locale}/projects/{project}/edit           | projects.edit             | App\Http\Controllers\ProjectsController@edit                               | web,setlocale,auth  |
+--------+----------------------------------------+--------------------------------------------+---------------------------+----------------------------------------------------------------------------+---------------------+

Run Code Online (Sandbox Code Playgroud)

如何摆脱方法中的参数以免将其插入任何地方。

我试过这个方法,但它不起作用:

public function show($locale, Project $project, Request $request)
{
}
Run Code Online (Sandbox Code Playgroud)

错误

传递给 App\Http\Controllers\ProjectsController::show() 的参数 1 必须是 App\Project 的一个实例,给出 Illuminate\Http\Request 的实例

Zes*_*han 7

设置区域设置后,将其添加到您的中间件中:

$request->route()->forgetParameter('locale');
Run Code Online (Sandbox Code Playgroud)

您现在可以$locale从该show()方法或使用它的任何其他方法中删除。