在线酒店预订项目 - 需要一些逻辑构建技巧来防止代码重复



项目:在线酒店预订门户
页面:用户仪表板。在这里,用户可以添加属性和详细信息(基本详细信息,房间,设施等(

问题: 在用户仪表板页面中,我们有几个页面(基本详细信息、政策、房间详细信息、图像等(。每个控制器一个控制器。对于每个控制器,我使用中间件VerifyPropertyUserMiddleware。现在我需要在每个控制器中获取属性模型。

$ppt = PropertyMaster::findOrFail($pID);

我能想到的解决方案

  1. 在中间件中创建此实例并将其传递给控制器。(但我认为中间件不应该做这项工作(
  2. 创建一个特征,在该特征中创建一个方法getProperty(但是代码重复仍然是一个问题,因为我必须在每个控制器中调用该方法(
  3. 使用会话。但是,代码重复仍然存在,因为在每个控制器中,我都必须检查 laravel 会话是否具有$ppt变量。

下面是一个用于在构建过程中丰富对象的特征示例。这种特殊的扩充模式意味着,当你的上游对象被实例化时,你将拥有它的所有属性来使用下游,或者一个异常来处理。

trait PropertyAware
{
private $property;
private function loadProperty(int $id): void
{
$this->property = PropertyMaster::findOrFail($id);
}
}
class PropertyFoo
{
use PropertyAware;
public function __construct(int $propertyId)
{
$this->loadProperty($propertyId);
}
}

至于在控制器上使用特征,我倾向于边界操作并通过协定从 URL 中实现 Property 对象:

Route::get('dashboard/properties/{property}', function (AppProperty $property) {
// Use the hydrated $property.
});

这比使用特征(或在基本控制器上使用特征,这似乎很奇怪(然后向特征方法传递 id 更有意义。

一般来说,我会建议私下应用扩充,也许是将信封过程括起来,在传输过程中它是一个标识符,但是当消息被打开或应用时(如在 url 请求中(,它可以通过特征进行丰富或丰富。

在这种情况下,扩充发生在 url 边界操作中,或者在解包以将消息传递给某种处理程序(总线模式(时发生。这里的尝试是瘦对象,它们本质上解释为已知的表示形式(例如,使用路由模型的控制器模式(,或者可以取消引用其自身关系的属性字典对象(特征对象(。

最新更新