【问题标题】:Laravel 5.5 Route model binding with customized key nameLaravel 5.5 带有自定义键名的路由模型绑定
【发布时间】:2018-11-25 01:58:35
【问题描述】:

我在 SO 上搜索了很多相关的主题。我无法使其与 Controller 方法一起使用,但是当我将它添加到这样的路由文件中时它可以工作:

这两种方法在 Application 模型又名 app/Application 中都有这个:

class Application extends Model
{

    public function getRouteKeyName(): string
    {
        return 'token';
    }
    ...

所以我的 routes/web.php 看起来像这样:

Route::get('/application/{locale}/{application}', function (string $locale, App\Application $application) {
    return view(
        'application.application.main',
        [
            'application' => $application,
            'isLanguageNeeded' => false,
        ]
    );

});


我的 app/Http/Controllers/ApplicationController.php,它返回 an Application not found 错误,如下所示:

    public function application(string $locale,  \App\Application $application)
{
    return view(
        'application.application.main',
        [
            'application' => $application,
            'isLanguageNeeded' => false,
        ]
    );
}

routes/web.php

Route::get('/application/{locale}/{application}', 'ApplicationController@application');

【问题讨论】:

  • 只是为了定位问题,您是否尝试过使用以下作为控制器的方法? public function application(string $locale, string $application) { $application = \App\Application::where('token', $application)->first(); return view(...); }(或者换句话说:您是否尝试手动加载模型?)
  • 是的,我已经手动尝试过了。不幸的是,我得到了相同的 Application not found 错误
  • 您确定链接没有问题并且您传递的是正确的token(而不是id)?我猜你知道覆盖 getRouteKeyName() 做了什么?
  • 即使您使用function(string $locale, string $application) 也不行?顺便说一句,dd($var) (dump and die) 是var_dump($var); die(); 的快捷方式。

标签: php laravel


【解决方案1】:

刚刚重新创建了一个项目。为方法和其他使用虚拟名称。

在 ApplicationsController 我添加了:

`public function index(string $locale, \App\Application $application)
{
  dd('here');
}`

在网络路由中: Route::get('applications/{locale}/{application}', 'ApplicationsController@index');

在应用模型中:

public function getRouteKeyName() : string { return 'token'; }

然后php artisan servehttp://127.0.0.1:8000/applications/el/test1 我得到了正确的回应你可以尝试显式绑定 https://laravel.com/docs/5.7/routing#explicit-binding

另请注意,当没有找到记录时使用 404 响应。例如,如果我没有带有 test1 令牌的应用程序,我会得到 404;

希望对你有帮助。

【讨论】:

  • 你的项目是哪个 laravel 版本?
  • 它是 5.7,但据我所知,本节与 5.5 相比没有任何变化。我最近将一个项目从 5.5 更新到 5.7,并且在本节中一切都很好,没有任何变化。您是否禁用了任何中间件? Laravel 使用中间件进行路由模型绑定。
  • 你的应用模型中的@metanerd 命名空间应该是这个命名空间App;
  • 我找到了,我添加了一些我很久以前创建的中间件,我不知道它存在 :facepalm: 非常感谢!
【解决方案2】:

Laravel 自动将请求作为第一个参数传递给控制器​​...因此,您应该像这样编辑控制器:

public function application(Illuminate\Http\Request $request ,string  $locale,\App\Application $application)
{
    return view(
      'application.application.main',
    [
        'application' => $application,
        'isLanguageNeeded' => false,
    ]
 );
}

【讨论】:

  • 这不是问题。 Laravel 将尝试按名称绑定函数参数。如果这不起作用,框架将按顺序传递它们。但是您不必一定要添加Request 作为参数。
  • 是的,我想我已经尝试过了。同样的找不到应用程序错误。
猜你喜欢
  • 1970-01-01
  • 2022-01-21
  • 2018-05-26
  • 2018-03-21
  • 2021-05-14
  • 2021-05-24
  • 2016-06-04
  • 2018-01-08
  • 2018-06-12
相关资源
最近更新 更多