在我的应用程序中有客户和快递员。只有当Courier当前在线且两个用户来自同一地点时,客户才能向Courier发送交货请求。
当客户想要向Courier发送投递请求时,我的DeliveryRequest
服务有一个sendDeliveryRequest(Request request)
方法,该方法是从Controller
调用的。
public function sendDeliveryRequest(Request $request) {
$customer = $this->recognitionService->getUser();
$courier = $this->entityFactory->build('Courier');
$courier->setId( $request->post('courierId') );
$courierMapper = $this->mapperFactory->build('Courier');
$courierMapper->fetch($courier);
$deliveryRequest = $this->entityFactory->build('DeliveryRequest');
$someRequestedItems = array();
$deliveryRequest->sendRequest($customer, $courier, $someRequestedItems);
}
到目前为止,在我的sendRequest(Customer $customer, Courier $courier, Array $items)
方法中,我有:
public function sendRequest(Customer $customer, Courier $courier, Array $items) {
// Check if the couriers account is active
if( !$courier->isActive() ) {
return 'courier not active';
}
// Check if the courier is online
if( !$courier->isOnline() ) {
return 'courier not online';
}
// Check the status of the customers location, active/inactive
if( !$customer->getLocation()->isActive() ) {
return 'customers location disabled';
}
// Check if the customer and the courier live in the same location
if( !$customer->sameLocationAs($courier) ) {
return 'customer and courier in different locations';
}
// More checks
}
到目前为止,它看起来还不错并且运行良好,但我不能100%确定我是否正确地执行业务逻辑,尤其是!$customer->sameLocationAs($courier)
。
该方法使用提供的$courier
对象获取Couriers位置(具有id
的对象)并将其与Customers位置进行比较,以检查它们是否位于同一位置。它工作得很好,但我不确定这是否是完成检查两个用户是否来自同一位置的最佳方法。这是有效的业务逻辑吗?
此外,$deliveryRequest
中的项目,其数据(id
,quantity
)将位于$request
传递的Controller
对象中,因此我将在Item
中创建每个Service
并将它们放入数组中,并将带有$customer
和$courier
的数组传递给sendRequest()
方法。这意味着我必须在该方法中进行检查(检查输入数量是否不超过数量的数据库值等),是正确的方式还是不好?
我是否在我的应用程序中正确地进行了检查/验证?
任何帮助都会非常感谢。
答案 0 :(得分:0)
对于第一个问题,我会说你的方法'sameLocationAs'是有效的。另一种可能性是创建一个具有静态方法的Util类,它可以在类之间提供服务。
这是模型的工作,以检查项目是否有效(而不是控制器),因此您有两种可能性:
就像你想做的那样
创建Item对象时,可以使用观察者设计模式检查项目类中对象的有效性。 (很难而且不需要,如果你想自动保存对象很有趣)
使用可以完成工作的验证类(也会很好)
如果您的服务代码仅涉及服务利益,那么这将是一件好事。
但你所做的是正确的我会说并且有效,你应该再进一步了