小编Jer*_*auw的帖子

在PHP中输入安全的通用装饰器

我想创建一个类型安全的通用日志装饰器

我有许多存储库(接口),每个存储库都需要一个装饰器,以捕获它们可能抛出的异常,将其传递给LoggerInterface的实例,然后重新抛出它们。可以创建一个专用的装饰器并为每个装饰器进行测试,尽管这非常麻烦(尤其是很好地进行了测试),但我还是避免了。

使用__call创造一个更通用的装饰是,想到的第一种方法。但是,这将导致对象实例无法实现其装饰的存储库接口。在我的项目中,这是不可行的。有没有办法告诉PHP它确实实现了此接口,例如通过使用一些魔术反射

我已经在stackoverflow上阅读了“ 如何在PHP中实现装饰器? ”和“ 在PHP 中实现用于方法结果缓存的装饰器模式的最佳方法 ”,它们都概述了专用方法和通用方法,尽管均未提供对方法的指示。以类型安全的方式执行通用方法。这些问题发布以来已经过去了一段时间,所以也许情况已经改变了。我正在使用PHP 7,并且可以根据需要使用PHP 7.1。

PHPUnit_MockObject允许通过与getMockPHPUnit中熟悉的方法调用的代码相同的代码构造实现接口的对象。这可以作为通用装饰器的基础。但是,这将需要在生产代码中使用模拟库。此外,该库在内部使用eval完成其工作。这使它不符合我的项目的资格。

php reflection types decorator

5
推荐指数
1
解决办法
570
查看次数

在 PHPUnit 中测试可迭代对象

在 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)

有这样的功能吗?或者,是否有一种明智的测试方法,不需要在我的测试中添加一堆无关紧要的命令性代码?

php arrays phpunit iterator php-7.1

5
推荐指数
1
解决办法
4111
查看次数

在忽略@covers 的同时生成 PHPUnit 代码覆盖率

我正在使用 PHPUnit 生成代码覆盖率报告

vendor/bin/phpunit --coverage-clover coverage.clover
Run Code Online (Sandbox Code Playgroud)

我有一些代码库@covers在他们的测试中使用了这个标签,表明他们测试的服务。在这些代码库中,没有专门针对值对象之类的测试。这导致覆盖率报告表明许多代码未经测试,而实际上它是。这使得通过查看覆盖率报告很难找到实际的未经测试的代码。解决此问题的一种方法是删除@covers标记,尽管这些标记对于指示意图很有用,并且在 IDE 识别它们时有助于导航。因此我希望 PHPUnit 忽略标签。

我发现有一个--disable-coverage-ignore标志,它使 PHPUnit 忽略覆盖忽略标签。我正在寻找的东西本质上是相反的。

有没有办法生成代码覆盖率报告来计算所有执行的行,而无需通过这些整个代码库进行更改,例如删除所有@covers标签?

php testing phpunit code-coverage

5
推荐指数
1
解决办法
730
查看次数

参数类型不匹配的适当 Python 错误类型

我正在寻找等价于 PHP 的 InvalidArgumentException 以在函数获取类型不正确的参数时使用。我正在使用 Python 3。(而且我对 Python 很陌生。)

ValueError文档指出“具有正确类型但值不合适的参数”,因此不适用于此处。

TypeError文档指出“在将操作或函数应用于不适当类型的对象时引发”,因此似乎也不适用。

在我的情况下使用的正确错误类型是什么?

python typeerror python-3.x

3
推荐指数
1
解决办法
3230
查看次数

确定变量是否是 Lua 中的多个值之一

我有一个值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)

lua readability

3
推荐指数
1
解决办法
1860
查看次数

支持REST API中的多种语言

我有一组城市,我正在创建一个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都是一个很好的例子吗?

rest asp.net-web-api

2
推荐指数
1
解决办法
2200
查看次数

干净的架构图

以下是Uncle Bobs 原始博客文章中的经典Clean Architecture图。

清洁建筑

我对网关为何比用例更外向感到困惑。到目前为止,我在所有此类图中都看到了这些东西,其中包括网关或其他某种形式的数据访问机制。

我知道用例不应绑定到数据访问机制的细节,因为它们应隐藏在体系结构边界后面。同时,构成此边界的服务的唯一用户应该是用例。这与该图有很大的冲突,因为遵循视觉规则,用例不能使用网关(需要时),而框架式的东西可以使用网关(而不必)。

我想念什么吗?如果不是,是否有更正确的方法以可视方式表示“清洁建筑”的规则?

我问是因为我正在创建一个显示“干净架构+ DDD有界上下文”的图表。

在此处输入图片说明

我对DBC和服务位不在UseCase圈子之外的情况感到不满意,因为不清楚UseCases是Bounded Context的公共接口,并且不能从外部直接访问持久性。

这样的事情解决了这两个问题,但引入了一个新问题:没有数据访问层边界的指示。实际上,遵循视觉规则,该图表明,有界上下文中的所有内容都可以直接访问持久性。

在此处输入图片说明

我相信我遇到了同样的问题,导致网关在原始图中“放错了位置”,并且正在寻找解决方法。

architecture diagram clean-architecture

2
推荐指数
1
解决办法
604
查看次数

HTML 文本区域调整大小事件

我正在寻找一种在文本区域大小调整时运行一些 JS 的方法。

经过一个小时的搜索和摆弄,我得到了一些有用的东西,但还不够好。

titleTextArea.mouseup(function() {
    popup.update(); titleTextArea.focus();
});
Run Code Online (Sandbox Code Playgroud)

上述代码的问题在于,单击文本区域时它也会运行。我正在运行的代码会导致文本区域重新渲染,这在有人在其中工作时不应该发生,因为它会扰乱焦点。

我已经尝试按照此SO post使用 jQuery 可调整大小。由于某种原因,调整大小事件不会触发。事实上,我不想为此引入 jQuery UI。

有没有一种方法可以在文本框调整大小时运行代码(仅在调整大小完成后才可以),并且不会被一堆不同的操作触发?

(PS:为什么没有原版活动?!)

html javascript jquery textarea dom-events

2
推荐指数
1
解决办法
3329
查看次数

非静态调用静态方法

我遇到了这样的事情,不知道该怎么办。是否有充分的理由这样做或避免这样做?

class Foo {

  static public function bar() {}

}

someMethod() {

  $instanceOfFoo->bar();

}
Run Code Online (Sandbox Code Playgroud)

php static

0
推荐指数
1
解决办法
1414
查看次数