我正在编写一个主要用作控制台应用程序的yii2应用程序。我有组件或(微)服务从服务器获取一些数据,处理它们并保存我需要db的信息。当然有几个 for循环,在这些循环中,我使用yii\helpers\Console::updateProgress
或仅echo
输出我当前的进度来观察进度和测试输出(如从xxx产品开始)。在某些事件中,我使用Yii::info()
或Yii::error()
记录重要信息,依此类推。通常是一个cron处理任务,如pullProductUpdates
或其他东西和我。
但在某些情况下,我也需要在我的网络应用程序中使用该方法(即pullProductUpdates
)。但是,不能有任何echo
命令激活或Console::updateProgress
命令。
当然我对Yii的日志记录方法没有问题,因为我配置了日志目标,但它们不会回显某些内容。但我不确定如何处理echo
命令...
一种方法是检查是否设置了$_SERER['REMOTE_ADDR']
。在控制台中,它将评估为null
,因此我可以围绕if {} else {}
扭曲。一个可能更好的解决方案是编写log()
或progress()
方法。特质可能有用吗?
那么我该如何设计解决方案呢?这有什么模式吗?我的服务应该实现loggable
或proressable
这样的界面吗?或者使用Logger / Progress对象并使用某种DI(依赖注入)?因为我不想多次编写那些log()
或progress()
方法函数。此外,我不能在webapplication中使用进度函数。一个原因是我不知道该怎么做(如果它可能在这里使用php),但这将是另一个问题。
提前致谢。
答案 0 :(得分:0)
作为PHP程序员,您应了解并使用PSR。在这种情况下,您应该使用依赖注入和LoggerInterfaces。
对于Web应用程序,您应该将组合根配置为使用记录到文件的记录器实现。对于控制台应用程序,您应该登录终端。
组合根是您配置依赖注入容器(DIC)的位置。详细了解Yii DIC here。
为了做到这一点,您应该能够通过环境变量或php_sapi_name在这两个组合根之间切换。