0

I'm writing an yii2 app that is mainly used as an console application. I have components or (micro)services that fetches some data from a server, handle them and save the information I need to db. Of course there are several for loops and in these loops I output my current progress with the use of yii\helpers\Console::updateProgress or just echo to watch the progress and testing output (like starting with xxx products). On some events I log important informations with Yii::info() or Yii::error() and so on. Normally a cron handling tasks like pullProductUpdates or something else and i.

However in some cases I need the method (i.e. pullProductUpdates) in my webapplication too. But then there must not be any echo command active or Console::updateProgress commands.

Of course I don't have problems with the logging methods from Yii because I configured the log targets and they will not echoing something. But I'm uncertain how to handle the echo commands...

One way is to check wether $_SERER['REMOTE_ADDR'] is set or not. In console it will evaluate to null so I can warp an if {} else {} around. A probably better solution is to write a log() or progress() method. A trait could be useful?

So how should I design a solution? Is there any pattern for this? Should my services implement an interface like loggable or proressable? Or use an Logger/ Progress objects and use some kind of DI (dependency injection)? Because I don't want to write those log() or progress() methods functions more than one time. Besides I can't use a progress function in a webapplication. One reason is I don't know how to to that (if its possible with php here), but this would be another question.

Thanks in advance.

Nordseebaer
  • 138
  • 10

1 Answers1

0

As a PHP programmer you should be aware of and use the PSR. In this case you should use dependency injection and the LoggerInterfaces.

For web application you should configure your composition root to use a logger implementation that logs to a file. For console application you should log to the terminal.

The composition root is the place where you configure your Dependency Injection Container (DIC). See more about Yii DIC here.

In order to do that you should be able to switch between these two composition roots by an environment variable or by php_sapi_name.

Constantin Galbenu
  • 16,951
  • 3
  • 38
  • 54