如何在 laravel 的控制器中管理 类?
How manage classes in controller in laravel?
我目前正在做一个项目,现在扩展太多了,所以现在每个控制器的项目顶部都像这样。
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;
有什么方法可以全局声明这些类并在每个控制器中使用它。
这个问题的最佳编程实践是什么
如果那是你的 控制器 中使用过的 类 的列表,那么你使用的控制器是错误的:为什么不把这些东西放在其他 类并将控制器中的代码减少到最少的部分:评估输入,将其传递给计算结果的其他(!)服务,然后 return 结果。
这种解耦技术使您的服务可测试。例如,您将如何从控制器中测试 PDF 或 Excel 生成?通过先构造一个请求?不,可能这样的一代只需要你在控制器中所做的所有事情的一小部分。那一代应该直接耦合到数据库,这样你需要先创建数据库实体来生成PDF吗?不,从数据库中读取这些东西,创建数据对象,并将它们传递给消费服务 - 突然之间,您可以在测试中创建 DTO,将它们传递给 Excel 代,并检查是否无需制作请求对象或使用固定装置播种数据库即可工作
我同意 Nico Haase 的观点,但如果您仍想缩短导入时间,可以为 Helpers 和 Models 命名空间做这件事。您可以导入 use App\Models;
而不是导入每个模型,然后在您使用该名称空间中的 class 的地方,您可以执行 Models\Address
、Models\Consignment
等操作。您可以对 Helpers 命名空间执行相同的操作。还可以使用像这样的外观 \Auth
、\DB
等,而不是导入。
这些是该控制器中使用的依赖项 classes。您可以在 composer 文件中全局自动加载所有这些命名空间。但不推荐这样做。
从屏幕截图中,我可以感觉到您的代码结构是最糟糕的。这里你的控制器 classes 看起来像 God Class
您的所有逻辑都可以从您的控制器提取到另一个 class (single responsible service class or action class)。这样你的控制器 class 就可以用瘦方法和更少的依赖关系得到很好的管理。
如果您有兴趣,我已经创建了一个 laravel 样板文件,其中包含有组织的嵌套文件夹结构。 PS:我更喜欢 nested directory over flat,但您也可以使用平面目录。
我目前正在做一个项目,现在扩展太多了,所以现在每个控制器的项目顶部都像这样。
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;
有什么方法可以全局声明这些类并在每个控制器中使用它。 这个问题的最佳编程实践是什么
如果那是你的 控制器 中使用过的 类 的列表,那么你使用的控制器是错误的:为什么不把这些东西放在其他 类并将控制器中的代码减少到最少的部分:评估输入,将其传递给计算结果的其他(!)服务,然后 return 结果。
这种解耦技术使您的服务可测试。例如,您将如何从控制器中测试 PDF 或 Excel 生成?通过先构造一个请求?不,可能这样的一代只需要你在控制器中所做的所有事情的一小部分。那一代应该直接耦合到数据库,这样你需要先创建数据库实体来生成PDF吗?不,从数据库中读取这些东西,创建数据对象,并将它们传递给消费服务 - 突然之间,您可以在测试中创建 DTO,将它们传递给 Excel 代,并检查是否无需制作请求对象或使用固定装置播种数据库即可工作
我同意 Nico Haase 的观点,但如果您仍想缩短导入时间,可以为 Helpers 和 Models 命名空间做这件事。您可以导入 use App\Models;
而不是导入每个模型,然后在您使用该名称空间中的 class 的地方,您可以执行 Models\Address
、Models\Consignment
等操作。您可以对 Helpers 命名空间执行相同的操作。还可以使用像这样的外观 \Auth
、\DB
等,而不是导入。
这些是该控制器中使用的依赖项 classes。您可以在 composer 文件中全局自动加载所有这些命名空间。但不推荐这样做。
从屏幕截图中,我可以感觉到您的代码结构是最糟糕的。这里你的控制器 classes 看起来像 God Class
您的所有逻辑都可以从您的控制器提取到另一个 class (single responsible service class or action class)。这样你的控制器 class 就可以用瘦方法和更少的依赖关系得到很好的管理。
如果您有兴趣,我已经创建了一个 laravel 样板文件,其中包含有组织的嵌套文件夹结构。 PS:我更喜欢 nested directory over flat,但您也可以使用平面目录。