diff --git a/src/FCMServiceProvider.php b/src/FCMServiceProvider.php index 63cc65151..c19907aa0 100644 --- a/src/FCMServiceProvider.php +++ b/src/FCMServiceProvider.php @@ -5,6 +5,9 @@ use LaravelFCM\Sender\FCMGroup; use LaravelFCM\Sender\FCMSender; use Illuminate\Support\ServiceProvider; +use Monolog\Logger; +use Monolog\Handler\StreamHandler; +use Monolog\Handler\NullHandler; class FCMServiceProvider extends ServiceProvider { @@ -31,23 +34,35 @@ public function register() return (new FCMManager($app))->driver(); }); + $this->app->singleton('fcm.logger', function ($app) { + $logger = new Logger('Laravel-FCM'); + if ($app[ 'config' ]->get('fcm.log_enabled', false)) { + $logger->pushHandler(new NullHandler()); + } else { + $logger->pushHandler(new StreamHandler(storage_path('logs/laravel-fcm.log'))); + } + return $logger; + }); + $this->app->bind('fcm.group', function ($app) { $client = $app[ 'fcm.client' ]; $url = $app[ 'config' ]->get('fcm.http.server_group_url'); + $logger = $app[ 'fcm.logger' ]; - return new FCMGroup($client, $url); + return new FCMGroup($client, $url, $logger); }); $this->app->bind('fcm.sender', function ($app) { $client = $app[ 'fcm.client' ]; $url = $app[ 'config' ]->get('fcm.http.server_send_url'); + $logger = $app[ 'fcm.logger' ]; - return new FCMSender($client, $url); + return new FCMSender($client, $url, $logger); }); } public function provides() { - return ['fcm.client', 'fcm.group', 'fcm.sender']; + return ['fcm.client', 'fcm.group', 'fcm.sender', 'fcm.logger']; } } diff --git a/src/Response/BaseResponse.php b/src/Response/BaseResponse.php index b7433c4b7..448160ed8 100644 --- a/src/Response/BaseResponse.php +++ b/src/Response/BaseResponse.php @@ -6,6 +6,7 @@ use LaravelFCM\Response\Exceptions\ServerResponseException; use LaravelFCM\Response\Exceptions\InvalidRequestException; use LaravelFCM\Response\Exceptions\UnauthorizedRequestException; +use Monolog\Logger; /** * Class BaseResponse. @@ -22,13 +23,21 @@ abstract class BaseResponse */ protected $logEnabled = false; + /** + * The logger. + * + * @var \Monolog\Logger + */ + protected $logger; + /** * BaseResponse constructor. * * @param \Psr\Http\Message\ResponseInterface $response */ - public function __construct(ResponseInterface $response) + public function __construct(ResponseInterface $response, Logger $logger) { + $this->logger = $logger; $this->isJsonResponse($response); $this->logEnabled = app('config')->get('fcm.log_enabled', false); $responseInJson = json_decode($response->getBody(), true); diff --git a/src/Response/DownstreamResponse.php b/src/Response/DownstreamResponse.php index a2081e1ef..ba19a523b 100644 --- a/src/Response/DownstreamResponse.php +++ b/src/Response/DownstreamResponse.php @@ -2,9 +2,8 @@ namespace LaravelFCM\Response; -use Monolog\Logger; -use Monolog\Handler\StreamHandler; use Psr\Http\Message\ResponseInterface; +use Monolog\Logger; /** * Class DownstreamResponse. @@ -99,11 +98,11 @@ class DownstreamResponse extends BaseResponse implements DownstreamResponseContr * @param \Psr\Http\Message\ResponseInterface $response * @param $tokens */ - public function __construct(ResponseInterface $response, $tokens) + public function __construct(ResponseInterface $response, $tokens, Logger $logger) { $this->tokens = is_string($tokens) ? [$tokens] : $tokens; - parent::__construct($response); + parent::__construct($response, $logger); } /** @@ -290,15 +289,12 @@ private function needToAddError($index, $result) */ protected function logResponse() { - $logger = new Logger('Laravel-FCM'); - $logger->pushHandler(new StreamHandler(storage_path('logs/laravel-fcm.log'))); - $logMessage = 'notification send to '.count($this->tokens).' devices'.PHP_EOL; $logMessage .= 'success: '.$this->numberTokensSuccess.PHP_EOL; $logMessage .= 'failures: '.$this->numberTokensFailure.PHP_EOL; $logMessage .= 'number of modified token : '.$this->numberTokenModify.PHP_EOL; - $logger->info($logMessage); + $this->logger->info($logMessage); } /** diff --git a/src/Response/GroupResponse.php b/src/Response/GroupResponse.php index 237cc9b8d..46aa87e04 100644 --- a/src/Response/GroupResponse.php +++ b/src/Response/GroupResponse.php @@ -2,9 +2,8 @@ namespace LaravelFCM\Response; -use Monolog\Logger; -use Monolog\Handler\StreamHandler; use Psr\Http\Message\ResponseInterface; +use Monolog\Logger; /** * Class GroupResponse. @@ -47,10 +46,10 @@ class GroupResponse extends BaseResponse implements GroupResponseContract * @param \Psr\Http\Message\ResponseInterface $response * @param $to */ - public function __construct(ResponseInterface $response, $to) + public function __construct(ResponseInterface $response, $to, Logger $logger) { $this->to = $to; - parent::__construct($response); + parent::__construct($response, $logger); } /** @@ -74,13 +73,10 @@ protected function parseResponse($responseInJson) */ protected function logResponse() { - $logger = new Logger('Laravel-FCM'); - $logger->pushHandler(new StreamHandler(storage_path('logs/laravel-fcm.log'))); - $logMessage = "notification send to group: $this->to"; $logMessage .= "with $this->numberTokensSuccess success and $this->numberTokensFailure"; - $logger->info($logMessage); + $this->logger->info($logMessage); } /** diff --git a/src/Response/TopicResponse.php b/src/Response/TopicResponse.php index 5242e80dd..87c20185c 100644 --- a/src/Response/TopicResponse.php +++ b/src/Response/TopicResponse.php @@ -2,10 +2,9 @@ namespace LaravelFCM\Response; -use Monolog\Logger; use LaravelFCM\Message\Topics; -use Monolog\Handler\StreamHandler; use Psr\Http\Message\ResponseInterface; +use Monolog\Logger; /** * Class TopicResponse. @@ -48,10 +47,10 @@ class TopicResponse extends BaseResponse implements TopicResponseContract * @param \Psr\Http\Message\ResponseInterface $response * @param Topics $topic */ - public function __construct(ResponseInterface $response, Topics $topic) + public function __construct(ResponseInterface $response, Topics $topic, Logger $logger) { $this->topic = $topic; - parent::__construct($response); + parent::__construct($response, $logger); } /** @@ -103,9 +102,6 @@ private function parseError($responseInJson) */ protected function logResponse() { - $logger = new Logger('Laravel-FCM'); - $logger->pushHandler(new StreamHandler(storage_path('logs/laravel-fcm.log'))); - $topic = $this->topic->build(); $logMessage = "notification send to topic: ".json_encode($topic); @@ -115,7 +111,7 @@ protected function logResponse() $logMessage .= "with error (error : $this->error)"; } - $logger->info($logMessage); + $this->logger->info($logMessage); } /** diff --git a/src/Sender/FCMSender.php b/src/Sender/FCMSender.php index 7c2aeda4e..b7b72bcd7 100644 --- a/src/Sender/FCMSender.php +++ b/src/Sender/FCMSender.php @@ -43,7 +43,7 @@ public function sendTo($to, Options $options = null, PayloadNotification $notifi $responseGuzzle = $this->post($request); - $responsePartial = new DownstreamResponse($responseGuzzle, $tokens); + $responsePartial = new DownstreamResponse($responseGuzzle, $tokens, $this->logger); if (!$response) { $response = $responsePartial; } else { @@ -54,7 +54,7 @@ public function sendTo($to, Options $options = null, PayloadNotification $notifi $request = new Request($to, $options, $notification, $data); $responseGuzzle = $this->post($request); - $response = new DownstreamResponse($responseGuzzle, $to); + $response = new DownstreamResponse($responseGuzzle, $to, $this->logger); } return $response; @@ -76,7 +76,7 @@ public function sendToGroup($notificationKey, Options $options = null, PayloadNo $responseGuzzle = $this->post($request); - return new GroupResponse($responseGuzzle, $notificationKey); + return new GroupResponse($responseGuzzle, $notificationKey, $this->logger); } /** @@ -95,7 +95,7 @@ public function sendToTopic(Topics $topics, Options $options = null, PayloadNoti $responseGuzzle = $this->post($request); - return new TopicResponse($responseGuzzle, $topics); + return new TopicResponse($responseGuzzle, $topics, $this->logger); } /** diff --git a/src/Sender/HTTPSender.php b/src/Sender/HTTPSender.php index c6e435324..e75f92073 100644 --- a/src/Sender/HTTPSender.php +++ b/src/Sender/HTTPSender.php @@ -3,6 +3,7 @@ namespace LaravelFCM\Sender; use GuzzleHttp\ClientInterface; +use Monolog\Logger; /** * Class BaseSender. @@ -23,15 +24,23 @@ abstract class HTTPSender */ protected $url; + /** + * The logger. + * + * @var \Monolog\Logger + */ + protected $logger; + /** * Initializes a new sender object. * * @param \GuzzleHttp\ClientInterface $client * @param string $url */ - public function __construct(ClientInterface $client, $url) + public function __construct(ClientInterface $client, $url, Logger $logger) { $this->client = $client; $this->url = $url; + $this->logger = $logger; } } diff --git a/tests/DownstreamResponseTest.php b/tests/DownstreamResponseTest.php index 1ab96c23a..d2f2aff5c 100644 --- a/tests/DownstreamResponseTest.php +++ b/tests/DownstreamResponseTest.php @@ -22,7 +22,10 @@ public function it_construct_a_response_with_a_success() ] }'); - $downstreamResponse = new DownstreamResponse($response, $token); + $logger = new \Monolog\Logger('test'); + $logger->pushHandler(new \Monolog\Handler\NullHandler()); + + $downstreamResponse = new DownstreamResponse($response, $token, $logger); $this->assertEquals(1, $downstreamResponse->numberSuccess()); $this->assertEquals(0, $downstreamResponse->numberFailure()); @@ -55,7 +58,10 @@ public function it_construct_a_response_with_multiple_successes() ] }'); - $downstreamResponse = new DownstreamResponse($response, $tokens); + $logger = new \Monolog\Logger('test'); + $logger->pushHandler(new \Monolog\Handler\NullHandler()); + + $downstreamResponse = new DownstreamResponse($response, $tokens, $logger); $this->assertEquals(3, $downstreamResponse->numberSuccess()); $this->assertEquals(0, $downstreamResponse->numberFailure()); @@ -82,7 +88,10 @@ public function it_construct_a_response_with_a_failure() ] }'); - $downstreamResponse = new DownstreamResponse($response, $token); + $logger = new \Monolog\Logger('test'); + $logger->pushHandler(new \Monolog\Handler\NullHandler()); + + $downstreamResponse = new DownstreamResponse($response, $token, $logger); $this->assertEquals(0, $downstreamResponse->numberSuccess()); $this->assertEquals(1, $downstreamResponse->numberFailure()); @@ -119,7 +128,10 @@ public function it_construct_a_response_with_multiple_failures() ] }'); - $downstreamResponse = new DownstreamResponse($response, $tokens); + $logger = new \Monolog\Logger('test'); + $logger->pushHandler(new \Monolog\Handler\NullHandler()); + + $downstreamResponse = new DownstreamResponse($response, $tokens, $logger); $this->assertEquals(0, $downstreamResponse->numberSuccess()); $this->assertEquals(3, $downstreamResponse->numberFailure()); @@ -150,7 +162,10 @@ public function it_construct_a_response_with_a_token_to_change() ] }'); - $downstreamResponse = new DownstreamResponse($response, $token); + $logger = new \Monolog\Logger('test'); + $logger->pushHandler(new \Monolog\Handler\NullHandler()); + + $downstreamResponse = new DownstreamResponse($response, $token, $logger); $this->assertEquals(0, $downstreamResponse->numberSuccess()); $this->assertEquals(0, $downstreamResponse->numberFailure()); @@ -186,7 +201,10 @@ public function it_construct_a_response_with_multiple_tokens_to_change() ] }'); - $downstreamResponse = new DownstreamResponse($response, $tokens); + $logger = new \Monolog\Logger('test'); + $logger->pushHandler(new \Monolog\Handler\NullHandler()); + + $downstreamResponse = new DownstreamResponse($response, $tokens, $logger); $this->assertEquals(0, $downstreamResponse->numberSuccess()); $this->assertEquals(0, $downstreamResponse->numberFailure()); @@ -212,7 +230,7 @@ public function it_construct_a_response_with_a_token_unavailable() { $token = 'first_token'; - $response = new Response(200, [], '{ + $response = new Response(200, [], '{ "multicast_id": 216, "success": 0, "failure": 1, @@ -222,7 +240,10 @@ public function it_construct_a_response_with_a_token_unavailable() ] }'); - $downstreamResponse = new DownstreamResponse($response, $token); + $logger = new \Monolog\Logger('test'); + $logger->pushHandler(new \Monolog\Handler\NullHandler()); + + $downstreamResponse = new DownstreamResponse($response, $token, $logger); $this->assertEquals(0, $downstreamResponse->numberSuccess()); $this->assertEquals(1, $downstreamResponse->numberFailure()); @@ -243,7 +264,7 @@ public function it_construct_a_response_with_a_token_server_error() { $token = 'first_token'; - $response = new Response(200, [], '{ + $response = new Response(200, [], '{ "multicast_id": 216, "success": 0, "failure": 1, @@ -253,7 +274,10 @@ public function it_construct_a_response_with_a_token_server_error() ] }'); - $downstreamResponse = new DownstreamResponse($response, $token); + $logger = new \Monolog\Logger('test'); + $logger->pushHandler(new \Monolog\Handler\NullHandler()); + + $downstreamResponse = new DownstreamResponse($response, $token, $logger); $this->assertEquals(0, $downstreamResponse->numberSuccess()); $this->assertEquals(1, $downstreamResponse->numberFailure()); @@ -274,7 +298,7 @@ public function it_construct_a_response_with_a_token_exceeded() { $token = 'first_token'; - $response = new Response(200, [], '{ + $response = new Response(200, [], '{ "multicast_id": 216, "success": 0, "failure": 1, @@ -284,7 +308,10 @@ public function it_construct_a_response_with_a_token_exceeded() ] }'); - $downstreamResponse = new DownstreamResponse($response, $token); + $logger = new \Monolog\Logger('test'); + $logger->pushHandler(new \Monolog\Handler\NullHandler()); + + $downstreamResponse = new DownstreamResponse($response, $token, $logger); $this->assertEquals(0, $downstreamResponse->numberSuccess()); $this->assertEquals(1, $downstreamResponse->numberFailure()); @@ -327,7 +354,10 @@ public function it_construct_a_response_with_a_mixed_token_to_retry() ] }'); - $downstreamResponse = new DownstreamResponse($response, $tokens); + $logger = new \Monolog\Logger('test'); + $logger->pushHandler(new \Monolog\Handler\NullHandler()); + + $downstreamResponse = new DownstreamResponse($response, $tokens, $logger); $this->assertEquals(0, $downstreamResponse->numberSuccess()); $this->assertEquals(6, $downstreamResponse->numberFailure()); @@ -360,7 +390,7 @@ public function it_construct_a_response_with_mixed_response() 'sixth_token', ]; - $response = new Response(200, [], '{ + $response = new Response(200, [], '{ "multicast_id": 216, "success": 3, "failure": 3, @@ -375,7 +405,10 @@ public function it_construct_a_response_with_mixed_response() ] }'); - $downstreamResponse = new DownstreamResponse($response, $tokens); + $logger = new \Monolog\Logger('test'); + $logger->pushHandler(new \Monolog\Handler\NullHandler()); + + $downstreamResponse = new DownstreamResponse($response, $tokens, $logger); $this->assertEquals(3, $downstreamResponse->numberSuccess()); $this->assertEquals(3, $downstreamResponse->numberFailure()); @@ -417,7 +450,7 @@ public function it_construct_a_response_with_multiples_response() 'seventh_1_token', ]; - $response = new Response(200, [], '{ + $response = new Response(200, [], '{ "multicast_id": 216, "success": 3, "failure": 3, @@ -433,8 +466,11 @@ public function it_construct_a_response_with_multiples_response() ] }'); - $downstreamResponse = new DownstreamResponse($response, $tokens); - $downstreamResponse1 = new DownstreamResponse($response, $tokens1); + $logger = new \Monolog\Logger('test'); + $logger->pushHandler(new \Monolog\Handler\NullHandler()); + + $downstreamResponse = new DownstreamResponse($response, $tokens, $logger); + $downstreamResponse1 = new DownstreamResponse($response, $tokens1, $logger); $downstreamResponse->merge($downstreamResponse1); diff --git a/tests/DownstreamTest.php b/tests/DownstreamTest.php index fe7b39a44..2d154ae1c 100644 --- a/tests/DownstreamTest.php +++ b/tests/DownstreamTest.php @@ -11,7 +11,7 @@ class ResponseTest extends FCMTestCase */ public function it_send_a_notification_to_a_device() { - $response = new Response(200, [], '{ + $response = new Response(200, [], '{ "multicast_id": 216, "success": 3, "failure": 3, @@ -26,7 +26,10 @@ public function it_send_a_notification_to_a_device() $tokens = 'uniqueToken'; - $fcm = new FCMSender($client, 'http://test.test'); + $logger = new \Monolog\Logger('test'); + $logger->pushHandler(new \Monolog\Handler\NullHandler()); + + $fcm = new FCMSender($client, 'http://test.test', $logger); $fcm->sendTo($tokens); } @@ -35,7 +38,7 @@ public function it_send_a_notification_to_a_device() */ public function it_send_a_notification_to_more_than_1000_devices() { - $response = new Response(200, [], '{ + $response = new Response(200, [], '{ "multicast_id": 216, "success": 3, "failure": 3, @@ -58,7 +61,10 @@ public function it_send_a_notification_to_more_than_1000_devices() $tokens[$i] = 'token_'.$i; } - $fcm = new FCMSender($client, 'http://test.test'); + $logger = new \Monolog\Logger('test'); + $logger->pushHandler(new \Monolog\Handler\NullHandler()); + + $fcm = new FCMSender($client, 'http://test.test', $logger); $fcm->sendTo($tokens); } @@ -67,7 +73,7 @@ public function it_send_a_notification_to_more_than_1000_devices() */ public function an_empty_array_of_tokens_thrown_an_exception() { - $response = new Response(400, [], '{ + $response = new Response(400, [], '{ "multicast_id": 216, "success": 3, "failure": 3, @@ -85,7 +91,10 @@ public function an_empty_array_of_tokens_thrown_an_exception() $client = Mockery::mock(Client::class); $client->shouldReceive('request')->once()->andReturn($response); - $fcm = new FCMSender($client, 'http://test.test'); + $logger = new \Monolog\Logger('test'); + $logger->pushHandler(new \Monolog\Handler\NullHandler()); + + $fcm = new FCMSender($client, 'http://test.test', $logger); $this->setExpectedException(\LaravelFCM\Response\Exceptions\InvalidRequestException::class); $fcm->sendTo([]); } diff --git a/tests/GroupResponseTest.php b/tests/GroupResponseTest.php index 8e97c705d..2501c132e 100644 --- a/tests/GroupResponseTest.php +++ b/tests/GroupResponseTest.php @@ -16,7 +16,10 @@ public function it_construct_a_response_with_successes() "failure": 0 }'); - $responseGroup = new GroupResponse($response, $notificationKey); + $logger = new \Monolog\Logger('test'); + $logger->pushHandler(new \Monolog\Handler\NullHandler()); + + $responseGroup = new GroupResponse($response, $notificationKey, $logger); $this->assertEquals(2, $responseGroup->numberSuccess()); $this->assertEquals(0, $responseGroup->numberFailure()); @@ -38,7 +41,10 @@ public function it_construct_a_response_with_failures() "regId2" ]}'); - $responseGroup = new GroupResponse($response, $notificationKey); + $logger = new \Monolog\Logger('test'); + $logger->pushHandler(new \Monolog\Handler\NullHandler()); + + $responseGroup = new GroupResponse($response, $notificationKey, $logger); $this->assertEquals(0, $responseGroup->numberSuccess()); $this->assertEquals(2, $responseGroup->numberFailure()); @@ -63,7 +69,10 @@ public function it_construct_a_response_with_partials_failures() "regId2" ]}'); - $responseGroup = new GroupResponse($response, $notificationKey); + $logger = new \Monolog\Logger('test'); + $logger->pushHandler(new \Monolog\Handler\NullHandler()); + + $responseGroup = new GroupResponse($response, $notificationKey, $logger); $this->assertEquals(1, $responseGroup->numberSuccess()); $this->assertEquals(2, $responseGroup->numberFailure()); diff --git a/tests/TopicResponseTest.php b/tests/TopicResponseTest.php index 59d84d40c..3e6cd8d7b 100644 --- a/tests/TopicResponseTest.php +++ b/tests/TopicResponseTest.php @@ -13,11 +13,14 @@ public function it_construct_a_topic_response_with_success() $topic = new \LaravelFCM\Message\Topics(); $topic->topic('topicName'); - $response = new Response(200, [], '{ + $logger = new \Monolog\Logger('test'); + $logger->pushHandler(new \Monolog\Handler\NullHandler()); + + $response = new Response(200, [], '{ "message_id": "1234" }'); - $topicResponse = new TopicResponse($response, $topic); + $topicResponse = new TopicResponse($response, $topic, $logger); $this->assertTrue($topicResponse->isSuccess()); $this->assertFalse($topicResponse->shouldRetry()); @@ -32,11 +35,14 @@ public function it_construct_a_topic_response_with_error() $topic = new \LaravelFCM\Message\Topics(); $topic->topic('topicName'); - $response = new Response(200, [], '{ + $logger = new \Monolog\Logger('test'); + $logger->pushHandler(new \Monolog\Handler\NullHandler()); + + $response = new Response(200, [], '{ "error": "MessageTooBig" }'); - $topicResponse = new TopicResponse($response, $topic); + $topicResponse = new TopicResponse($response, $topic, $logger); $this->assertFalse($topicResponse->isSuccess()); $this->assertFalse($topicResponse->shouldRetry()); @@ -51,11 +57,14 @@ public function it_construct_a_topic_response_with_error_and_it_should_retry() $topic = new \LaravelFCM\Message\Topics(); $topic->topic('topicName'); - $response = new Response(200, [], '{ + $logger = new \Monolog\Logger('test'); + $logger->pushHandler(new \Monolog\Handler\NullHandler()); + + $response = new Response(200, [], '{ "error": "TopicsMessageRateExceeded" }'); - $topicResponse = new TopicResponse($response, $topic); + $topicResponse = new TopicResponse($response, $topic, $logger); $this->assertFalse($topicResponse->isSuccess()); $this->assertTrue($topicResponse->shouldRetry()); diff --git a/tests/TopicsTest.php b/tests/TopicsTest.php index 54f5bd29a..94c80d4f0 100644 --- a/tests/TopicsTest.php +++ b/tests/TopicsTest.php @@ -113,7 +113,10 @@ public function it_send_a_notification_to_a_topic() $client = Mockery::mock(Client::class); $client->shouldReceive('request')->once()->andReturn($response); - $fcm = new FCMSender($client, 'http://test.test'); + $logger = new \Monolog\Logger('test'); + $logger->pushHandler(new \Monolog\Handler\NullHandler()); + + $fcm = new FCMSender($client, 'http://test.test', $logger); $topics = new Topics(); $topics->topic('test'); @@ -135,7 +138,10 @@ public function it_send_a_notification_to_a_topic_and_return_error() $client = Mockery::mock(Client::class); $client->shouldReceive('request')->once()->andReturn($response); - $fcm = new FCMSender($client, 'http://test.test'); + $logger = new \Monolog\Logger('test'); + $logger->pushHandler(new \Monolog\Handler\NullHandler()); + + $fcm = new FCMSender($client, 'http://test.test', $logger); $topics = new Topics(); $topics->topic('test');