我有一个可以生成代码的Sequence类。
$sequence = new Sequence();
$sequence->startsWith('FACT')
->followedBy('-')
->followedBy(new NumberPart(4, 'Year')) //The four indicates that the number will be 4 digits long. Zero-padded if needed
->followedBy((new NumberPart(4, 'InvoiceNo'))) //The four indicates that the number will be 4 digits long. Zero-padded if needed
->startingAt('FACT-20170020');
$sequence->checkUniqueness()->inDatabase('orders', 'order_number'); //Does not exist yet
$nextValue = $sequence->next(); //FACT-20170021
序列类可以完美地工作。我现在正尝试使用checkUniqueness方法扩展它。但是我不确定如何构建它。因为我也许还想使用这种方法:
$sequence->checkUniqueness()->inArray(['FACT-20170020', 'FACT-20170021']);
当下一个数字在任一数据库数组中都不唯一时,我希望它引发异常。
这是我正在尝试的:
checkUniqueness方法返回一个工厂(不确定这是否是正确的模式)。工厂同时具有inArray和inDatabase方法。分别可以制作一个inArrayUniquenessChecker和一个inDatabaseUniqueness检查器实例。两者都实现了称为UniquenessCheckerInterface的接口,该接口定义了函数签名:
public function isUnique(string $value): bool;
但是与此有关的问题是我不希望它返回例如inDatabaseUniqueness类实例。我希望inArray和inDatabase方法可以将其结果提供给Sequence实例。这样,在下一个-> next()调用中进行检查。
我该怎么做。这是解决此问题的正确心态/模式吗?