我需要在我的项目中实施本地化。我添加了一个带有前缀的组。
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)
一切正常。但是有一个问题。当我打开路线时:
我收到一个错误
传递给 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 的实例
设置区域设置后,将其添加到您的中间件中:
$request->route()->forgetParameter('locale');
Run Code Online (Sandbox Code Playgroud)
您现在可以$locale从该show()方法或使用它的任何其他方法中删除。
| 归档时间: |
|
| 查看次数: |
1030 次 |
| 最近记录: |