1

在我的第二次尝试中,我为我正在开发的网站实现了多语言实现,方法是Route::groupprefixesurl{locale}的第一段中使用routeMiddleware Kernel. 它工作得很好,除非Resourcesparameters.

该实现有一个小问题,因为某种原因它变成了parameter%2F{id}这是不正确的)并且不检索我PublicGalleriesController请求的资源。我不明白为什么,因为当我将鼠标悬停在生成的锚点上时,href我看到了正确的 url 格式。但是当我点击它时,会给出一条404 Not Found带有混乱网址的消息。

web.php 这是我的路由组,它用一个函数封装了所有路由

Route::group([
    'prefix' => '{locale}',
    'middleware' => 'setlocale',
], function() {

   // all my routes are within this route group including:
   Route::resource('gallery', 'PublicGalleriesController');

   Auth::routes();

   Route::group(['middleware' => 'auth'], function() {

       ...

   });

});

App/Http/Middleware/Localisation.php路由中间件 路由经过Kernel.php

public function handle($request, Closure $next)
    {
        \App::setLocale($request->segment(1));
        return $next($request);
    }

PublicGalleriesController.php 从模型中检索图像路径并将其返回到客户端视图

    public function show($id)
    {
        // Show gallery group images for given group id
        $pics = null;
        $path = null;
        $path = GalleryGroup::find($id);
        
        $pics = Gallery::select('imagefilename', 'group_id')->where('group_id', $id)->orderBy('id', 'asc')->get()->toArray();

        return view('gallery.show', compact('pics', 'path'));
    }

当我将鼠标悬停在可见的画廊组照片链接上时,index.blade它在浏览器左角显示为:localhost/en/gallery/41。检索图库组主index.blade键并在循环中构建 html 锚链接:<a href="{{ url(app()->getLocale(), 'gallery/' . $item['id']) }}">{{$item['descrp']}}</a>

当我单击此链接时,它应该通过PublicGalleriesController运行该show功能并检索所有这些画廊组照片,而是返回一个404 Not Found带有浏览器中显示的 url localhost/en/gallery%2F41。我相信是一个 Url 编码的%2F正斜杠。

php artisan route:list显示show资源如下:

| Domain | Method    | URI                         | Name         | Action   
         | Middleware                              |
+--------+-----------------------------------------+--------------+-----------------------
|        | GET|HEAD  | {locale}/gallery/{gallery}  | gallery.show | App\Http\Controllers\PublicGalleriesController@show   
         | web,setlocale                           |

有人可以帮我理解为什么网址变得如此混乱吗?

Laravel 版本:5.6.39

4

1 回答 1

2

url助手的签名是:

function url($path = null, $parameters = [], $secure = null)

$parameters是一个参数数组,而不是路径,因此它对/您正在使用的进行编码,因为参数是 URL 的一部分而不是路径。

您可以调整调用以url获得更完整的路径或使用parameters数组作为附加段,而不是路径:

url(app()->getLocale() .'/gallery/'. $item['id']); // 1 argument
url(app()->getLocale() .'/gallery', [$item['id']]); // 2 arguments
url(app()->getLocale(), ['gallery', $item['id']]);  // 2 arguments

您还可以使用route帮助程序:

route('gallery.show', ['locale' => app()->getLocale(), 'gallery' => $item['id']]);

如果您不想locale使用帮助程序生成所有要生成的 URL,则route可以调整中间件以为此参数设置默认值:

public function handle($request, Closure $next)
{
    App::setLocale($locale = $request->route('locale'));

    URL::defaults(['locale' => $locale]); // set default

    return $next($request);
}

现在您不必传递该参数:

route('gallery.show', ['gallery' => ...]);

如果您不想将locale参数传递给所有可以完成的路由“动作”(控制器方法和闭包)。您可以在返回响应之前向该中间件添加这样的行:

$request->route()->forgetParameter('locale');
于 2020-09-21T20:49:21.703 回答