php 多个控制器但单个创建表单- Laravel 8

wwtsj6pe  于 2023-04-19  发布在  PHP
关注(0)|答案(1)|浏览(144)

我有一个现有的发票库存跟踪应用程序,我需要重构。
我们需要创建一个表单来创建。根据所选的类型,我们必须在创建表单中显示某个类型的一些字段,并为其他类型隐藏它们。
以前的开发人员已经为每种类型创建了单独的表单,并且相同的输入表单代码会为每种类型的文档重复一遍又一遍。代码庞大且难以维护,我必须修复它并使其更简单。
该应用程序具有表document_typedocument

单据类型表包含单据类型,如:

1.发票
1.亲发票
1.要约
1.客户订单
1.向供应商订购
1.内部仓库转移
1.批发发票
每种类型在表单中包含几乎相同的字段,只有在某些类型中,我们必须隐藏供应商输入,仓库选择,价格输入等字段。
我们希望使用单一表单来创建此数据。根据所选的document_type,显示发票的特定字段,但隐藏发票中显示的某些字段。
我的问题是为每个文档类型创建一个单独的控制器,我将传递document_type_id并在刀片中确定将显示哪些文件。还是为所有文档类型创建字段集合?
1.创建InvoiceController、ProInvoiceController、OfferController等。
1.在每个控制器中定义文档type_id
1.创建唯一的窗体,我将在其中处理
示例

<?php

class InvoiceController extens Controller
{
   private $this->document_type = 4; // Invoice type

   public function crate()
   {
      $invoices = Document::where('document_type_id', $this->document_type)->get();
        
      // etc..

      return view('admin.document.index',[
                'title' => 'Invoice',
                'invoices' => $invoices,
       ]);
        
    }

// other controllers
class OfferController extens Controller {}
class ProInvoiceController extens Controller {}

?>

Form.blade.php

<!-- Invoice-->
@if($document_type_id == 1)
  
  <input type="text" name="customer">
  <input type="text" name="price">
  <select type="text" name="delivery_id"></select>

<!-- Offer -->
@elseif($document_type_id == 2)
  <input type="text" name="comercial_customer">
  <input type="text" name="price">
  <select type="text" name="delivery_id"></select>

<!--  Internal warehouse transfer -->
@elseif($document_type_id == 2)
  <select type="text" name="wharehouse_from_id"></select>
  <select type="text" name="wharehouse_from_to"></select>

@else
<!-- Show default -->

@endif

有谁知道最好的方法吗?

kg7wmglp

kg7wmglp1#

我将在每个控制器中创建一个必需字段部分的数组,然后在单个表单模板中显示/隐藏相关的表单部分,而不是文档类型。
可以将字段数组传递给视图,也可以将对控制器的引用传递给视图;

return view('view.name')->withController($this);

然后在视图中访问任何控制器属性或方法。
我也会有相同的表单用于编辑和创建,然后使用$model-〉exists()来测试这是一个创建表单还是编辑表单,以便可以相应地调整表单路由和方法(参见https://talltips.novate.co.uk/laravel/simplify-laravel-crud-controllers),其中将空模型传递给视图可以大大简化CRUD表单。

相关问题