我想创建一个类型安全的通用日志装饰器。
我有许多存储库(接口),每个存储库都需要一个装饰器,以捕获它们可能抛出的异常,将其传递给LoggerInterface的实例,然后重新抛出它们。可以创建一个专用的装饰器并为每个装饰器进行测试,尽管这非常麻烦(尤其是很好地进行了测试),但我还是避免了。
使用__call创造一个更通用的装饰是,想到的第一种方法。但是,这将导致对象实例无法实现其装饰的存储库接口。在我的项目中,这是不可行的。有没有办法告诉PHP它确实实现了此接口,例如通过使用一些魔术反射?
我已经在stackoverflow上阅读了“ 如何在PHP中实现装饰器? ”和“ 在PHP 中实现用于方法结果缓存的装饰器模式的最佳方法 ”,它们都概述了专用方法和通用方法,尽管均未提供对方法的指示。以类型安全的方式执行通用方法。这些问题发布以来已经过去了一段时间,所以也许情况已经改变了。我正在使用PHP 7,并且可以根据需要使用PHP 7.1。
PHPUnit_MockObject允许通过与getMockPHPUnit中熟悉的方法调用的代码相同的代码构造实现接口的对象。这可以作为通用装饰器的基础。但是,这将需要在生产代码中使用模拟库。此外,该库在内部使用eval完成其工作。这使它不符合我的项目的资格。
在 PHPUnit 中,很容易断言两个数组包含相同的值:
$this->assertEquals( [1, 2, 3], [1, 2, 3] );
Run Code Online (Sandbox Code Playgroud)
PHP 的最新版本使迭代器和生成器的使用更具吸引力,并且 PHP 7.1 引入了可迭代伪类型。这意味着我可以编写函数来获取和返回,iterable而不必绑定到我正在使用普通旧的array或使用惰性Generator.
如何断言返回 an 的函数的返回值iterable?理想情况下我可以做类似的事情
$this->assertIterablesEqual( ['expected', 'values'], $iterable );
Run Code Online (Sandbox Code Playgroud)
有这样的功能吗?或者,是否有一种明智的测试方法,不需要在我的测试中添加一堆无关紧要的命令性代码?
我正在使用 PHPUnit 生成代码覆盖率报告
vendor/bin/phpunit --coverage-clover coverage.clover
Run Code Online (Sandbox Code Playgroud)
我有一些代码库@covers在他们的测试中使用了这个标签,表明他们测试的服务。在这些代码库中,没有专门针对值对象之类的测试。这导致覆盖率报告表明许多代码未经测试,而实际上它是。这使得通过查看覆盖率报告很难找到实际的未经测试的代码。解决此问题的一种方法是删除@covers标记,尽管这些标记对于指示意图很有用,并且在 IDE 识别它们时有助于导航。因此我希望 PHPUnit 忽略标签。
我发现有一个--disable-coverage-ignore标志,它使 PHPUnit 忽略覆盖忽略标签。我正在寻找的东西本质上是相反的。
有没有办法生成代码覆盖率报告来计算所有执行的行,而无需通过这些整个代码库进行更改,例如删除所有@covers标签?
我正在寻找等价于 PHP 的 InvalidArgumentException 以在函数获取类型不正确的参数时使用。我正在使用 Python 3。(而且我对 Python 很陌生。)
ValueError文档指出“具有正确类型但值不合适的参数”,因此不适用于此处。
TypeError文档指出“在将操作或函数应用于不适当类型的对象时引发”,因此似乎也不适用。
在我的情况下使用的正确错误类型是什么?
我有一个值armyName,需要一个函数来检查它是否是 8 个值之一。由于我对 Lua 很陌生,我正在寻找进行此类检查的最佳方法是什么。
这有效:
local function isPlayerArmyName(armyName)
return armyName == "ARMY_1"
or armyName == "ARMY_2"
or armyName == "ARMY_3"
or armyName == "ARMY_4"
or armyName == "ARMY_5"
or armyName == "ARMY_6"
or armyName == "ARMY_7"
or armyName == "ARMY_8"
end
Run Code Online (Sandbox Code Playgroud)
这也有效:
local function isPlayerArmyName(armyName)
local names = {
["ARMY_1"] = true, ["ARMY_2"] = true, ["ARMY_3"] = true, ["ARMY_4"] = true,
["ARMY_5"] = true, ["ARMY_6"] = true, ["ARMY_7"] = true, ["ARMY_8"] = true,
}
return names[armyName] or …Run Code Online (Sandbox Code Playgroud) 我有一组城市,我正在创建一个REST API(我的第一个REST API).每个城市都有许多与语言无关的东西,例如创建日期和人口数量.城市也有依赖于语言的东西,例如标题和简短描述.在城市内部文件具有以下格式:
{
"population": 9042,
"name": {
"en": "Berlin",
"nl": "Berlijn",
// ...
},
// ...
}
Run Code Online (Sandbox Code Playgroud)
我的API的用户总是希望仅查看特定语言的城市信息,并返回如下内容:
{
"population": 9042,
"name": Berlin,
// ...
}
Run Code Online (Sandbox Code Playgroud)
我做了通过这些访问/cities/:id/:language_code,例如cities/123/en.现在我要实施城市列表:GET /cities.那里也需要所要求的语言.由于这会导致/cities/:language_code,我得到的印象是把它放在网址的末尾并不是一个好主意,并怀疑我会更好/en/cities/...whatever....
这通常是如何在REST API中完成的?任何大的,很好实现的API都是一个很好的例子吗?
以下是Uncle Bobs 原始博客文章中的经典Clean Architecture图。
我对网关为何比用例更外向感到困惑。到目前为止,我在所有此类图中都看到了这些东西,其中包括网关或其他某种形式的数据访问机制。
我知道用例不应绑定到数据访问机制的细节,因为它们应隐藏在体系结构边界后面。同时,构成此边界的服务的唯一用户应该是用例。这与该图有很大的冲突,因为遵循视觉规则,用例不能使用网关(需要时),而框架式的东西可以使用网关(而不必)。
我想念什么吗?如果不是,是否有更正确的方法以可视方式表示“清洁建筑”的规则?
我问是因为我正在创建一个显示“干净架构+ DDD有界上下文”的图表。
我对DBC和服务位不在UseCase圈子之外的情况感到不满意,因为不清楚UseCases是Bounded Context的公共接口,并且不能从外部直接访问持久性。
这样的事情解决了这两个问题,但引入了一个新问题:没有数据访问层边界的指示。实际上,遵循视觉规则,该图表明,有界上下文中的所有内容都可以直接访问持久性。
我相信我遇到了同样的问题,导致网关在原始图中“放错了位置”,并且正在寻找解决方法。
我正在寻找一种在文本区域大小调整时运行一些 JS 的方法。
经过一个小时的搜索和摆弄,我得到了一些有用的东西,但还不够好。
titleTextArea.mouseup(function() {
popup.update(); titleTextArea.focus();
});
Run Code Online (Sandbox Code Playgroud)
上述代码的问题在于,单击文本区域时它也会运行。我正在运行的代码会导致文本区域重新渲染,这在有人在其中工作时不应该发生,因为它会扰乱焦点。
我已经尝试按照此SO post使用 jQuery 可调整大小。由于某种原因,调整大小事件不会触发。事实上,我不想为此引入 jQuery UI。
有没有一种方法可以在文本框调整大小时运行代码(仅在调整大小完成后才可以),并且不会被一堆不同的操作触发?
(PS:为什么没有原版活动?!)
我遇到了这样的事情,不知道该怎么办。是否有充分的理由这样做或避免这样做?
class Foo {
static public function bar() {}
}
someMethod() {
$instanceOfFoo->bar();
}
Run Code Online (Sandbox Code Playgroud) php ×4
phpunit ×2
architecture ×1
arrays ×1
decorator ×1
diagram ×1
dom-events ×1
html ×1
iterator ×1
javascript ×1
jquery ×1
lua ×1
php-7.1 ×1
python ×1
python-3.x ×1
readability ×1
reflection ×1
rest ×1
static ×1
testing ×1
textarea ×1
typeerror ×1
types ×1