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

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

鲍国兴
2023-03-14

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

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

   ...

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

   ...

})

中间件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);
    }
}

路由器列表

+--------+----------------------------------------+--------------------------------------------+---------------------------+----------------------------------------------------------------------------+---------------------+
| 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                              | html" target="_blank">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  |
+--------+----------------------------------------+--------------------------------------------+---------------------------+----------------------------------------------------------------------------+---------------------+

一切都很完美。但有一个问题。当我打开路线时:

http://127.0.0.1:8000/en/projects/1 (展览项目)

我犯了一个错误

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

我添加$locale到我的show方法,它的工作原理

public function show($locale, Project $project, Request $request)
{
}

我怎样才能去掉方法中的一个参数,这样就不会到处插入它。

我尝试了这种方法,但不起作用:

class Controller extends BaseController
{
    use AuthorizesRequests, DispatchesJobs, ValidatesRequests;

    public function callAction($method, $parameters)
    {
        unset($parameters['locale']);
        return parent::callAction($method, $parameters); // TODO: Change the autogenerated stub
    }
}

错误

传递给App\Http\Controllers\ProjectsController::show()的参数1必须是App\Project的实例,即给定的照亮\Http\Request的实例

共有1个答案

庞修贤
2023-03-14

在设置区域设置后,在中间件中添加以下内容:

$request->route()->forgetParameter('locale');

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

 类似资料:
  • 我正在使用JWt all方法(索引、存储、显示等)在laravel中创建待办事项应用程序,路由资源中的所有方法(索引、存储、显示等)工作正常,除了结果更新外,其工作正常,并获得成功响应,但数据库中没有更改 **对不起,我的英语不好 应用程序编程接口。php BaseController。php TodoController。php 这是《邮差》的结果 https://i.stack.imgur.c

  • 信息:我正在使用Larvel 6.1版。0,我希望我的网站支持不同的语言。因此,我创建了一个新的中间件,并希望为我的路由提供一个前缀,以便Laravel可以确定语言。也许有更好的方法,但这是我到目前为止所做的。 URL最终应该是这样的: mywebsite.com/en/home, url/locale/home 用于设置区域设置的中间件 在内核中注册了新的中间件setlocale。php 我的网

  • 我正在尝试利用Laravel的登录页路径。例如,默认情况下,Laravel会将您带到欢迎页面,并且斜杠后没有url文本。 在我的欢迎页面中,我使用以下条件根据路线名称应用样式。 然而,此代码不工作。如何正确查看欢迎页面的路线? 编辑:使用“请求”而不是“路由”使其工作。然而,为了保持一致性,我想知道是否也可以使用“路线”来完成。

  • 我知道本身不会向路由表添加路由。在您的操作中,您需要声明属性。我很难找到一个权威的blog/msdn页面/说明为什么by defalut不在路由表中添加路由的东西。 有没有人有一个权威的帖子,确实包含了这种情况,如果是这样,你会让我知道是谁。非常感谢。 编辑以澄清我的问题 上面的场景之所以能够工作,是因为我们显式地声明了上的操作有一个空路由。一旦我们这样做,路由就被添加到 第一个场景不起作用,因为

  • 我不认为这篇文章我如何覆盖laravel资源路由默认方法?解决了我的问题。 正常的资源路由是“索引”显示所有项目。我想做的是让“索引”显示一个特定ID的所有相关项目。 因此,当我从列表中选择一个教室时,我需要调用的索引操作,以显示该特定教室的所有人员,就像它的索引函数一样。 所以我替换了默认的资源路由 与 所以在我的控制器中,我有这样的内容: 在我的教室里,在一个特定的教室id上,我有这个 就我所

  • 资源路由 支持设置RESTFul请求的资源路由,方式如下: Route::resource('blog','index/blog'); 表示注册了一个名称为blog的资源路由到index模块的Blog控制器,系统会自动注册7个路由规则,如下: 标识 请求类型 生成路由规则 对应操作方法(默认) index GET blog index create GET blog/create create s