diff --git a/composer.json b/composer.json index b531f1f..5bff9c6 100644 --- a/composer.json +++ b/composer.json @@ -31,7 +31,6 @@ "ext-simplexml": "*", "ext-intl": "*", "ext-mbstring": "*", - "monolog/monolog": "*" }, "require-dev" : { "phpunit/phpunit": "^7", diff --git a/lib/Ogone/AbstractRequest.php b/lib/Ogone/AbstractRequest.php index 8d2ef79..c9b44db 100644 --- a/lib/Ogone/AbstractRequest.php +++ b/lib/Ogone/AbstractRequest.php @@ -11,7 +11,8 @@ namespace Ogone; use InvalidArgumentException; -use Psr\Log\LoggerInterface; +use Ogone\Logger\AdapterInterface; +use Ogone\Logger\MonologAdapter; use RuntimeException; use BadMethodCallException; use Ogone\ShaComposer\ShaComposer; @@ -158,11 +159,9 @@ abstract class AbstractRequest implements Request protected $parameters = array(); - /** @var LoggerInterface|null */ + /** @var Logger */ protected $logger; - - protected $ogoneFields = array( 'orig', 'shoppingcartextensionid', 'pspid', 'orderid', 'com', 'amount', 'currency', 'language', 'cn', 'email', 'cardno', 'cvc', 'ed', 'ownerzip', 'owneraddress', 'ownercty', 'ownertown', 'ownertelno', @@ -233,13 +232,26 @@ abstract class AbstractRequest implements Request /** * Sets Logger. * - * @param LoggerInterface|null $logger + * @param AdapterInterface $logger * * @return $this + * @throws \Exception */ - public function setLogger(LoggerInterface $logger = null) + public function setLogger($logger) { - $this->logger = $logger; + if (interface_exists('\Psr\Log\LoggerInterface') && + $logger instanceof \Psr\Log\LoggerInterface + ) { + $this->logger = new Logger( + new MonologAdapter(['logger' => $logger]) + ); + } + + if (!$logger instanceof AdapterInterface) { + throw new \Exception('Argument $logger must be instance of AdapterInterface.'); + } + + $this->logger = new Logger($logger); return $this; } diff --git a/lib/Ogone/AbstractResponse.php b/lib/Ogone/AbstractResponse.php index 9341692..de29845 100644 --- a/lib/Ogone/AbstractResponse.php +++ b/lib/Ogone/AbstractResponse.php @@ -11,7 +11,8 @@ namespace Ogone; use InvalidArgumentException; -use Psr\Log\LoggerInterface; +use Ogone\Logger\AdapterInterface; +use Ogone\Logger\MonologAdapter; abstract class AbstractResponse implements Response, \ArrayAccess { @@ -100,7 +101,7 @@ abstract class AbstractResponse implements Response, \ArrayAccess */ protected $shaSign; - /** @var LoggerInterface|null */ + /** @var Logger */ protected $logger; /** @@ -127,13 +128,26 @@ public function __construct(array $httpRequest) /** * Sets Logger. * - * @param LoggerInterface|null $logger + * @param AdapterInterface $logger * * @return $this + * @throws \Exception */ - public function setLogger(LoggerInterface $logger = null) + public function setLogger($logger) { - $this->logger = $logger; + if (interface_exists('\Psr\Log\LoggerInterface') && + $logger instanceof \Psr\Log\LoggerInterface + ) { + $this->logger = new Logger( + new MonologAdapter(['logger' => $logger]) + ); + } + + if (!$logger instanceof AdapterInterface) { + throw new \Exception('Argument $logger must be instance of AdapterInterface.'); + } + + $this->logger = new Logger($logger); return $this; } diff --git a/lib/Ogone/Logger.php b/lib/Ogone/Logger.php new file mode 100644 index 0000000..97cd65f --- /dev/null +++ b/lib/Ogone/Logger.php @@ -0,0 +1,130 @@ +adapter = $adapter; + } + + /** + * Logs with emergency level. + * + * @param string $message + * @param array $context + */ + public function emergency($message, array $context = []) + { + $this->log(self::EMERGENCY, $message, $context); + } + + /** + * Logs with error level. + * + * @param string $message + * @param array $context + */ + public function alert($message, array $context = []) + { + $this->log(self::ALERT, $message, $context); + } + + /** + * Logs with critical level. + * + * @param string $message + * @param array $context + */ + public function critical($message, array $context = []) + { + $this->log(self::CRITICAL, $message, $context); + } + + /** + * Logs with error level. + * + * @param string $message + * @param array $context + */ + public function error($message, array $context = []) + { + $this->log(self::ERROR, $message, $context); + } + + /** + * Logs with warning level. + * + * @param string $message + * @param array $context + */ + public function warning($message, array $context = []) + { + $this->log(self::WARNING, $message, $context); + } + + /** + * Logs with notice level. + * + * @param string $message + * @param array $context + */ + public function notice($message, array $context = []) + { + $this->log(self::NOTICE, $message, $context); + } + + /** + * Logs with info level. + * + * @param string $message + * @param array $context + */ + public function info($message, array $context = []) + { + $this->log(self::INFO, $message, $context); + } + + /** + * Logs with debug level. + * + * @param string $message + * @param array $context + */ + public function debug($message, array $context = []) + { + $this->log(self::DEBUG, $message, $context); + } + + /** + * Logs with an arbitrary level. + * + * @param mixed $level + * @param string $message + * @param array $context + */ + public function log($level, $message, array $context = []) + { + $this->adapter->log($level, $message, $context); + } +} diff --git a/lib/Ogone/Logger/AdapterInterface.php b/lib/Ogone/Logger/AdapterInterface.php new file mode 100644 index 0000000..959decf --- /dev/null +++ b/lib/Ogone/Logger/AdapterInterface.php @@ -0,0 +1,15 @@ +file = $options['file']; + } else { + $this->file = sys_get_temp_dir() . '/ingenico_sdk.log'; + } + } + + /** + * Logs with an arbitrary level. + * + * @param mixed $level + * @param string $message + * @param array $context + */ + public function log($level, $message, array $context = []) + { + if ($this->file) { + $message = sprintf( + '[%s] %s %s %s', + date('Y-m-d H:i:s'), + $level, + $message, + count($context) > 0 ? var_export($context, true) : '' + ); + + file_put_contents($this->file, $message . "\n", FILE_APPEND); + } + } +} diff --git a/lib/Ogone/Logger/MonologAdapter.php b/lib/Ogone/Logger/MonologAdapter.php new file mode 100644 index 0000000..d5e8b48 --- /dev/null +++ b/lib/Ogone/Logger/MonologAdapter.php @@ -0,0 +1,37 @@ +logger = $options['logger']; + } + } + + /** + * Logs with an arbitrary level. + * + * @param mixed $level + * @param string $message + * @param array $context + */ + public function log($level, $message, array $context = []) + { + if ($this->logger) { + $this->logger->log($level, $message, $context); + } + } +} \ No newline at end of file diff --git a/tests/Ogone/Tests/AbstractRequestTest.php b/tests/Ogone/Tests/AbstractRequestTest.php new file mode 100644 index 0000000..9dbe22a --- /dev/null +++ b/tests/Ogone/Tests/AbstractRequestTest.php @@ -0,0 +1,16 @@ + sys_get_temp_dir() . '/log.txt']); + } +} \ No newline at end of file diff --git a/tests/Ogone/Tests/Logger/FileAdapterTest.php b/tests/Ogone/Tests/Logger/FileAdapterTest.php new file mode 100644 index 0000000..266bd04 --- /dev/null +++ b/tests/Ogone/Tests/Logger/FileAdapterTest.php @@ -0,0 +1,22 @@ + $logFile]); + $this->assertInstanceOf(AdapterInterface::class, $adapter); + + $adapter->log(Logger::INFO, 'Test'); + $this->assertEquals(true, file_exists($logFile)); + } +} diff --git a/tests/Ogone/Tests/Logger/MonologAdapterTest.php b/tests/Ogone/Tests/Logger/MonologAdapterTest.php new file mode 100644 index 0000000..ee2856c --- /dev/null +++ b/tests/Ogone/Tests/Logger/MonologAdapterTest.php @@ -0,0 +1,18 @@ + null]); + $this->assertInstanceOf(AdapterInterface::class, $adapter); + $this->assertNull($adapter->log(Logger::INFO, 'Test')); + } +} diff --git a/tests/Ogone/Tests/LoggerTest.php b/tests/Ogone/Tests/LoggerTest.php new file mode 100644 index 0000000..94873e8 --- /dev/null +++ b/tests/Ogone/Tests/LoggerTest.php @@ -0,0 +1,47 @@ + $logFile]); + $logger = new Logger($adapter); + + $logger->log($logger::INFO, 'Test'); + $this->assertEquals(true, file_exists($logFile)); + + $logger->emergency('Test'); + $this->assertEquals(true, stripos(file_get_contents($logFile), $logger::EMERGENCY) !== false); + + $logger->alert('Test'); + $this->assertEquals(true, stripos(file_get_contents($logFile), $logger::ALERT) !== false); + + $logger->critical('Test'); + $this->assertEquals(true, stripos(file_get_contents($logFile), $logger::CRITICAL) !== false); + + $logger->error('Test'); + $this->assertEquals(true, stripos(file_get_contents($logFile), $logger::ERROR) !== false); + + $logger->warning('Test'); + $this->assertEquals(true, stripos(file_get_contents($logFile), $logger::WARNING) !== false); + + $logger->notice('Test'); + $this->assertEquals(true, stripos(file_get_contents($logFile), $logger::NOTICE) !== false); + + $logger->info('Test'); + $this->assertEquals(true, stripos(file_get_contents($logFile), $logger::INFO) !== false); + + $logger->debug('Test'); + $this->assertEquals(true, stripos(file_get_contents($logFile), $logger::DEBUG) !== false); + + return $this; + } +} \ No newline at end of file