【问题标题】:How manage classes in controller in laravel?如何在 laravel 中管理控制器中的类?
【发布时间】:2020-03-31 06:39:47
【问题描述】:

我目前正在做一个项目,该项目现在扩展太多,所以现在每个控制器的项目顶部看起来都是这样的。

use App\Helpers\Comments_Helper;
use App\Helpers\GetDeliveryRun_Helper;
use App\Helpers\Histories_Helper;
use App\Helpers\Notification_Helper;
use App\Helpers\Tables\TableHistory;
use Illuminate\Support\Facades\Queue;
use App\Helpers\Tables\TableManifest;
use App\Helpers\Tables\TableManifestConsignment;
use App\Http\Controllers\Controller;
use App\Models\Address;
use App\Models\Consignment;
use App\Models\Customer;
use App\Models\ConsignmentManifest;
use App\Models\Manifest;
use Auth;
use DB;
use File;
use Barryvdh\DomPDF\Facade as PDF;
use Illuminate\Http\Request;
use PhpOffice\PhpSpreadsheet\IOFactory;
use App\Jobs\ManifestPOD\ConsignmentDownload;
use App\Jobs\ManifestPOD\ConsignmentZipper;
use Maatwebsite\Excel\Facades\Excel;
use Response;

有没有办法全局声明这些类并在每个控制器中使用它。 这个问题的最佳编程实践是什么

【问题讨论】:

    标签: laravel laravel-5 code-reuse


    【解决方案1】:

    如果这是您的控制器中使用的类的列表,那么您使用控制器是错误的:为什么不将这些东西放在其他类中并将控制器中的代码减少到最少的部分:评估输入,将其传递给计算结果的其他(!)服务,然后返回结果。

    这种解耦技术使您的服务可测试。例如,您将如何从控制器中测试 PDF 或 Excel 生成?通过首先构建请求?不,可能这一代人只需要你在控制器中所做的所有事情的一小部分。并且该生成是否应该直接与数据库耦合,这样您需要首先创建数据库实体才能生成 PDF?不,从数据库中读取这些东西,创建数据对象,并将它们传递给消费服务——突然之间,你可以在测试中创建 DTO,将它们传递给 Excel 生成,并检查它是否有效而无需制作请求对象或使用固定装置播种数据库

    【讨论】:

      【解决方案2】:

      我同意 Nico Haase 的观点,但如果您仍想缩短导入,可以为 Helpers 和 Models 命名空间执行此操作。您可以导入 use App\Models; 而不是导入每个模型,然后在使用该命名空间中的类的地方,您可以执行 Models\AddressModels\Consignment 等。您可以对 Helpers 命名空间执行相同的操作。也可以使用 \Auth\DB 等外观,而不是导入。

      【讨论】:

        【解决方案3】:

        这些是该控制器中使用的依赖类。您可以在 composer 文件中全局自动加载所有这些命名空间。但不建议这样做。

        从屏幕截图中,我可以感觉到您拥有最糟糕的代码结构之一。这里你的控制器类看起来像 God Class

        您的所有逻辑都可以从您的控制器提取到另一个类(single responsible 服务类或action class)。这样一来,您的控制器类就可以通过精简的方法和更少的依赖项得到很好的管理。

        如果您有兴趣,我已经创建了一个带有有序嵌套文件夹结构的 laravel 样板。 PS:我更喜欢nested directory over flat,但你也可以使用平面目录。

        https://github.com/puncoz-official/laravel-boilerplate

        【讨论】:

        • “您可以在作曲家文件中全局自动加载所有这些命名空间” - 您能否展示如何做到这一点并减少 use 语句?我从来没有听说过这是可能的
        • 在 laravel 中这已经存在于数据库播种器类中。请参阅参考资料。如果你正在实现这个,请确保你的类名不会冲突。 :)
        • 你能展示它的工作代码吗?没有use语句时如何加载类?
        • 例如,laravel.com/docs/7.x/seeding 不使用任何类 (DB::table('users')) 或使用 FQDN (factory(App\User::class, 50))
        猜你喜欢
        • 2015-05-22
        • 1970-01-01
        • 2018-08-15
        • 2020-02-12
        • 2017-08-30
        • 2021-02-17
        • 2020-07-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多