【问题标题】:PHPMD complains about static usage of "Log"PHPMD 抱怨“日志”的静态使用
【发布时间】:2019-11-29 12:03:39
【问题描述】:

我将 phpmd 添加到我的 Laravel 项目中。

现在我对“日志”的静态用法有一点意见。

namespace App\Http\Controllers;

use Log;

class MyController extends Controller
{
/**
 * Does something
 */
public function doSomething($var)
{
Log::info('Just began to to something.');
}

phpmd 说:

避免在方法“doSomething”中使用对类“\Log”的静态访问。

在这里使用 Log 类的正确方法是什么?

我遵循了 Laravel 文档,但不知道如何更正它并且 由于我的知识有限,phpmd 文档对我没有帮助。

谢谢!

【问题讨论】:

  • 只用info('text here...'); ????
  • 它是一个门面,它实际上是另一个类的“静态代理”,你不是直接调用底层类的静态方法
  • 有人会说,正确的做法是不使用facade,使用适当的依赖注入,这完全被facade隐藏了。
  • 我不同意 Mess 检测器抱怨的关于框架的大多数事情。我认为遵循框架最佳实践比混乱检测器更重要:)

标签: php laravel phpmd


【解决方案1】:

根据 PHPMD 关于静态访问的文档

静态访问会导致对其他类的不可交换依赖,并导致难以测试代码。不惜一切代价避免使用静态访问,而是通过构造函数注入依赖项。唯一可以接受静态访问的情况是用于工厂方法。

然而,Laravel 外观可以被认为是静态类访问的有效案例,因为they can be mocked

我个人更喜欢依赖注入而不是使用像Log 这样的静态类。这样做会产生以下代码

namespace App\Http\Controllers;

use Log;
use Psr\Log\LoggerInterface;

class MyController extends Controller
{
    /**
     * @var LoggerInterface
     */
    private $logger;

    public function __construct(LoggerInterface $logger)
    {
        $this->logger = $logger;
    }

    /**
     * Does something
     */
    public function doSomething($var)
    {
        $this->logger->info('Just began to to something.');
    }
}

因此,根据偏好,可以禁用该规则,也可以在外观上使用依赖注入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-10
    • 1970-01-01
    • 2010-10-21
    • 2013-01-29
    • 2018-10-28
    • 2021-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多