我有一些与他们的系统交互的市场类,如Ebay,Amazon等。
我想让这些类定义一些强制函数,例如createProduct,updateProduct,getCategories,getOrders。
显然,这些市场需要不同格式的数据,所以我的功能要求每个类别中有不同类型和数量的参数。
例如
public function createProduct($product, $multi)
public function createProduct(array $products, $multi, $variations)
在这种情况下,我无法实现MarketplaceInterface
,因为它会破坏我的代码。
但我必须强制执行这些功能。 我还可以通过PHP实现其他哪些方式?
答案 0 :(得分:-2)
解决此类问题的一种常用方法是定义optionsResolver
,将其传递给您的每个类,以便进行初始化。
$optionsResolver->setRequiredOptions(array('products', 'multi', 'variations'));
然后你将参数作为一个选项数组传递(这样你可以保留你的界面):
public function createProduct($options)
您可以使用以下内容验证您的选项:
$optionsResolver->resolve($options);
要查看完整的实施示例,请查看Symfony2。
示例:强>
class Ebay implements MarketPlaceInterface
{
// ...
public function createProduct(array $options = array())
{
$resolver = new OptionsResolver();
$resolver
->setRequired(array('product', 'multi'))
->setAllowedTypes('product', 'string')
->setAllowedTypes('multi', 'boolean')
->setDefaults(array('multi' => true))
;
// Add default values.
// Check for required fields.
// Check allowed types.
// Throw an exception if the options have a wrong format.
$options = $resolver->resolve($options);
// Do the creation here.
}
}
class Amazon implements MarketPlaceInterface
{
// ...
public function createProduct(array $options = array())
{
$resolver = new OptionsResolver();
$resolver
->setRequired(array('products', 'multi', 'variations'))
->setAllowedTypes('products', 'array')
->setAllowedTypes('multi', 'boolean')
->setAllowedTypes('variations', 'array')
->setDefaults(array(
'products' => array(),
'multi' => true
))
;
$options = $resolver->resolve($options);
// Do the creation here.
}
}
您还可以在抽象类或操纵市场对象的类中设置行为。以下是具有GOF设计模式template method的抽象类的情况:
abstract class AbstractMarketPlace implements MarketPlaceInterface
{
// ...
public function createProduct(array $options = array())
{
$resolver = new OptionsResolver();
$this->setResolver($resolver);
$options = $resolver->resolve($options);
$this->doCreateProduct($options)
}
abstract protected function setResolver(OptionsResolver $resolver);
abstract protected function doCreateProduct(array $options);
}
class Ebay extends AbstractMarketPlace
{
// ...
protected function setResolver(OptionsResolver $resolver)
{
$resolver
->setRequired(array('product', 'multi'))
->setAllowedTypes('product', 'string')
->setAllowedTypes('multi', 'boolean')
->setDefaults(array('multi' => true))
;
}
protected function doCreateProduct(array $options)
{
// Do the creation here.
}
}