【问题标题】:Laravel resource always return nullLaravel 资源总是返回 null
【发布时间】:2020-06-11 15:38:00
【问题描述】:

我遇到了奇怪的问题。资源方法总是返回 null。

表名

operating_days

型号

class OperatingDay extends Model
{
    /**
     * @var string[]
     */
    protected $fillable = ['day', 'date'];
}

控制器@edit

public function edit(OperatingDay $operatingDay)
{
    return view('admin.day.form')->with('operatingDay', $operatingDay)->with('title', __('admin.day.edit_day'));
}

路线

Route::resource('days', 'OperatingDayController')->names([
    'index'   => 'admin.days.index',
    'store'   => 'admin.days.store',
    'create'  => 'admin.days.create',
    'show'    => 'admin.days.show',
    'update'  => 'admin.days.update',
    'destroy' => 'admin.days.destroy',
    'edit'    => 'admin.days.edit',
]);

在视图中添加 var

@dd($operatingDay)


App\OperatingDay {#1400 ▼
  #fillable: array:2 [▶]
  #connection: null
  #table: null
  #primaryKey: "id"
  #keyType: "int"
  +incrementing: true
  #with: []
  #withCount: []
  #perPage: 15
  +exists: false
  +wasRecentlyCreated: false
  #attributes: []
  #original: []
  #changes: []
  #casts: []
  #classCastCache: []
  #dates: []
  #dateFormat: null
  #appends: []
  #dispatchesEvents: []
  #observables: []
  #relations: []
  #touches: []
  +timestamps: true
  #hidden: []
  #visible: []
  #guarded: array:1 [▶]
}

@dd($operatingDay->id)

// output null

【问题讨论】:

  • 我认为问题在于您将资源命名为 days,因此 Laravel 试图将其路由到名为 Day 的模型,但您的模型名为 OperatingDay。您能否尝试将以下内容添加到您的 RouteServiceProvider 的启动方法中:Route::model('day', OperatingDay::class); 并检查它是否有效。
  • 完美,非常感谢。解决。 :)
  • 我添加了一个带有文档链接的答案。

标签: laravel eloquent


【解决方案1】:

问题是您将资源命名为 days,因此 Laravel 将尝试将其路由到名为 Day 的模型,但您的模型称为 OperatingDay,以便将 days 路由到 OperatingDay 您可以使用显式绑定。

来自docs

要注册显式绑定,请使用路由器的模型方法 指定给定参数的类。你应该定义你的 RouteServiceProvider 的 boot 方法中的显式模型绑定 类:

public function boot()
{
    parent::boot();

    Route::model('user', App\User::class);
}

所以在你的情况下,它看起来像这样:

use App\OperatingDay; // or whatever the namespace to your model is
use Illuminate\Support\Facades\Route;

public function boot()
{
    parent::boot();

    Route::model('day', OperatingDay::class);
}


如果您只需要在一个路由中使用它,您还可以重命名路由参数:

来自docs

默认情况下,Route::resource 会为你创建路由参数 基于资源“单一化”版本的资源路由 姓名。您可以通过使用轻松地在每个资源的基础上覆盖它 参数方法。传入参数方法的数组 应该是资源名称和参数名称的关联数组:

Route::resource('users', 'AdminUserController')->parameters([
    'users' => 'admin_user'
]);

所以在你的情况下,它会是这样的:

Route::resource('days', 'OperatingDayController')
    ->names([
        'index' => 'admin.days.index',
        'store' => 'admin.days.store',
        'create' => 'admin.days.create',
        'show' => 'admin.days.show',
        'update' => 'admin.days.update',
        'destroy' => 'admin.days.destroy',
        'edit' => 'admin.days.edit',
    ])
    ->parameters(['days' => 'operatingDay']);

【讨论】:

  • 您的回复对我有帮助。但我用另一种方式修复了它。我刚刚将路由名称重命名为operatingDay 并修复。但是,如果我想保持路线名称不变,该建议会很有帮助。
  • 我还添加了更改路由参数名称的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-10
  • 2021-01-09
  • 2017-08-31
  • 1970-01-01
  • 2021-11-17
  • 2014-08-15
  • 2018-03-05
相关资源
最近更新 更多