当前位置: 首页 > 知识库问答 >
问题:

段未移位/无法在控制器中获取正确的参数

甄鹏云
2023-03-14

我正在尝试为现有的Laravel项目实现一个简单的本地化。

基于以下教程实现本地化:
https://laraveldaily.com/multi-language-routes-and-locales-with-auth/

以下是本地化实施前的简化代码:

web.php

Route::get('/poll/{poll_id}', 'App\Http\Controllers\PollsController@view');

PollsController@view

public function view($poll_id){
    echo "poll_id: ".$poll_id;
}

测验

网址:http://domain.name/poll/1

结果:poll_id: 1

以下是本地化所需的简化更改和我得到的结果:

web.php

Route::group(['prefix' => '{locale}', 'where' => ['locale' => '[a-zA-Z]{2}'], 'middleware' => 'setlocale'], function() {    
    Route::get('/poll/{poll_id}', 'App\Http\Controllers\PollsController@view');
});

中间件/设置语言环境

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

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

PollsController@view保持不变。

现在,当我打开以下URL(http://domain.name/en/poll/1)时,结果是:

结果:poll_id: en

问题

有没有办法忽略“前缀”=

最简单的修复方法是在PollsController@view按照以下方式,但闻起来不太好闻,因此我需要向所有函数添加locale参数,尽管我没有在那里使用它:

public function view($locale, $poll_id){
    echo "poll_id: ".$poll_id;
}

共有1个答案

端木望
2023-03-14

在中间件中,您可以告诉Route实例忘记该Route参数,这样它就不会试图将其传递给Route操作:

public function handle($request, $next)
{
    app()->setLocale($request->route('locale'));

    // forget the 'locale' parameter
    $request->route()->forgetParameter('locale');

    return $next($request);
}
 类似资料:
  • 问题内容: 我在AngularJS应用程序中为i18n 使用angular-translate。 对于每个应用程序视图,都有一个专用的控制器。在下面的控制器中,我设置了要显示为页面标题的值。 码 的HTML 的JavaScript 我正在使用angular-translate-loader-url扩展名加载翻译文件。 问题 在初始页面加载时,将显示翻译键,而不是该键的翻译。翻译是,但我看到了。 第

  • 我试图设置cookie来定义用户首选的语言。我通过一个指向助手控制器的链接做到了这一点: /设置区域设置/{locale} 我知道这是正确的,因为如果我这样做: 它显示所选择的正确区域设置。所以下一步是使用中间件实际应用这个选择的语言环境,我把它命名为“设置语言环境”: 但如果我执行 在中间件中,它读取所有加扰的cookie。所以我的问题是为什么它会这样做,我如何从这里正确地读取cookie?

  • null 现在的问题是: > 作为控制器方法执行的结果,我将返回对象的映射,该映射将解析为JSON。可能的实体是: {“结果”:“12”} 我应该如何提供基于结果的附加消息?我能想到两个解决办法: > 返回映射,该映射在肯定验证结果的情况下具有result=true,在否定验证结果的情况下具有result=false,以及带有相应消息的errorCode 返回指示验证结果的布尔值,并另外对否定结果

  • 我有一个复杂的对象,我需要在提交表单时传递给控制器。这个复杂对象有一个对象和一个对象列表。这是我的Web API控制器,它通过使用Ajax的post接收复杂对象: 这是我的html表单: 这是我通过Ajax发送复杂对象的jQuery代码:

  • 我想在缓存控制头中设置max age以响应。我已经写了如下,但仍然有max-age 0。我想只为一种方法设置max age,所以我不想禁用默认值。我认为应该是ovveride。 有人知道我做错了什么吗?