首页 > 解决方案 > Laravel OOP 与继承

问题描述

我正在开发一个 Laravel 应用程序来管理啤酒物品的集合,例如眼镜和瓶子。我目前有一张名为 beeritems 的桌子,每件物品都可以是玻璃或瓶子

Schema::create('beeritems', function (Blueprint $table) {
  $table->increments('id');
  $table->unsignedInteger('user_id');
  $table->unsignedInteger('category_id');
  $table->string('item_type');
  $table->string('item_name');
  $table->text('item_description');
  $table->timestamps();
});

我有一个名为“BeerItem”的模型。一个玻璃杯或一个瓶子有很多属性(例如名称、描述),但有些是不同的。然而,为简单起见,我将眼镜和瓶子都存储到 beeritems 表中(一些属性将是空的。我知道这不符合数据库规范化标准,但有一些原因)。

为了能够处理不同的属性,我正在执行以下操作:

Route::post('beerglasses/store','BeerglassController@storeBeerglass')->name('beerglasses.store');
Route::post('beerbottles/store','BeerbottleController@storeBeerbottle')->name('beerglasses.store');

这个想法是,在每个控制器中,我可以验证所需的属性并使用正确的“item_type”将对象存储在“Beeritem”表中。由于“瓶子”和“玻璃”之间的属性可能有很大不同

从一个角度来看:

public function create(Request $request) {
    //stuff omitted for clarity
    return view('beeritems.create', compact('name'));

}

然后,在视图中,我根据类型根据类型进行区分。有些属性不需要显示。

@switch( strtolower($name)  )
  @case('beerglasses')
     @include('beeritems.create.beerglass')
     @break
  @case('beerbottles')
     @include('beeritems.create.beerbottle')
     @break
@endswitch

这一切都有效,但感觉不对,因为每个控制器中有很多类似的代码。本质上,每个控制器中的 store 方法几乎是相同的(只是在某些属性上有所不同)。

有人可以提示我一些更好的解决方案(使用 Laravel)保持一个 Beeritem 表吗?

标签: laravel

解决方案


推荐阅读