├── .gitignore ├── composer.json ├── composer.lock ├── config └── laravel-smpp.php ├── license.txt ├── readme.md └── src ├── LaravelSmppServiceProvider.php ├── SmppService.php └── SmppServiceInterface.php /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | vendor -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "franzose/laravel-smpp", 3 | "description": "SMS sending via SMPP protocol for Laravel framework.", 4 | "keywords": ["sms", "smpp", "laravel", "onlinecity"], 5 | "authors": [ 6 | { 7 | "name": "Jan Iwanow", 8 | "email": "iwanow.jan@gmail.com" 9 | } 10 | ], 11 | "require": { 12 | "ext-mbstring": "*", 13 | "php-smpp/php-smpp": "1.2", 14 | "illuminate/support": "^5|^6|^7|^8|^9.0|^10.0|^11.0" 15 | }, 16 | "autoload": { 17 | "psr-4": { 18 | "LaravelSmpp\\": "src/" 19 | } 20 | }, 21 | "autoload-dev": { 22 | "psr-4": { 23 | "LaravelSmpp\\Tests\\": "tests/" 24 | } 25 | }, 26 | "extra": { 27 | "laravel": { 28 | "providers": [ 29 | "LaravelSmpp\\LaravelSmppServiceProvider" 30 | ] 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", 5 | "This file is @generated automatically" 6 | ], 7 | "hash": "971d220ccfc10737135fc0c312d5b2c0", 8 | "content-hash": "118e6d719df466a5d9d4257b4c432458", 9 | "packages": [ 10 | { 11 | "name": "doctrine/inflector", 12 | "version": "v1.1.0", 13 | "source": { 14 | "type": "git", 15 | "url": "https://github.com/doctrine/inflector.git", 16 | "reference": "90b2128806bfde671b6952ab8bea493942c1fdae" 17 | }, 18 | "dist": { 19 | "type": "zip", 20 | "url": "https://api.github.com/repos/doctrine/inflector/zipball/90b2128806bfde671b6952ab8bea493942c1fdae", 21 | "reference": "90b2128806bfde671b6952ab8bea493942c1fdae", 22 | "shasum": "" 23 | }, 24 | "require": { 25 | "php": ">=5.3.2" 26 | }, 27 | "require-dev": { 28 | "phpunit/phpunit": "4.*" 29 | }, 30 | "type": "library", 31 | "extra": { 32 | "branch-alias": { 33 | "dev-master": "1.1.x-dev" 34 | } 35 | }, 36 | "autoload": { 37 | "psr-0": { 38 | "Doctrine\\Common\\Inflector\\": "lib/" 39 | } 40 | }, 41 | "notification-url": "https://packagist.org/downloads/", 42 | "license": [ 43 | "MIT" 44 | ], 45 | "authors": [ 46 | { 47 | "name": "Roman Borschel", 48 | "email": "roman@code-factory.org" 49 | }, 50 | { 51 | "name": "Benjamin Eberlei", 52 | "email": "kontakt@beberlei.de" 53 | }, 54 | { 55 | "name": "Guilherme Blanco", 56 | "email": "guilhermeblanco@gmail.com" 57 | }, 58 | { 59 | "name": "Jonathan Wage", 60 | "email": "jonwage@gmail.com" 61 | }, 62 | { 63 | "name": "Johannes Schmitt", 64 | "email": "schmittjoh@gmail.com" 65 | } 66 | ], 67 | "description": "Common String Manipulations with regard to casing and singular/plural rules.", 68 | "homepage": "http://www.doctrine-project.org", 69 | "keywords": [ 70 | "inflection", 71 | "pluralize", 72 | "singularize", 73 | "string" 74 | ], 75 | "time": "2015-11-06 14:35:42" 76 | }, 77 | { 78 | "name": "illuminate/contracts", 79 | "version": "v5.2.32", 80 | "source": { 81 | "type": "git", 82 | "url": "https://github.com/illuminate/contracts.git", 83 | "reference": "411b851962c211078ade7664a6976e77a78cd2a5" 84 | }, 85 | "dist": { 86 | "type": "zip", 87 | "url": "https://api.github.com/repos/illuminate/contracts/zipball/411b851962c211078ade7664a6976e77a78cd2a5", 88 | "reference": "411b851962c211078ade7664a6976e77a78cd2a5", 89 | "shasum": "" 90 | }, 91 | "require": { 92 | "php": ">=5.5.9" 93 | }, 94 | "type": "library", 95 | "extra": { 96 | "branch-alias": { 97 | "dev-master": "5.2-dev" 98 | } 99 | }, 100 | "autoload": { 101 | "psr-4": { 102 | "Illuminate\\Contracts\\": "" 103 | } 104 | }, 105 | "notification-url": "https://packagist.org/downloads/", 106 | "license": [ 107 | "MIT" 108 | ], 109 | "authors": [ 110 | { 111 | "name": "Taylor Otwell", 112 | "email": "taylorotwell@gmail.com" 113 | } 114 | ], 115 | "description": "The Illuminate Contracts package.", 116 | "homepage": "http://laravel.com", 117 | "time": "2016-03-07 20:37:17" 118 | }, 119 | { 120 | "name": "illuminate/support", 121 | "version": "v5.2.32", 122 | "source": { 123 | "type": "git", 124 | "url": "https://github.com/illuminate/support.git", 125 | "reference": "61329ea409362fdae167fdca1125f46c997ce689" 126 | }, 127 | "dist": { 128 | "type": "zip", 129 | "url": "https://api.github.com/repos/illuminate/support/zipball/61329ea409362fdae167fdca1125f46c997ce689", 130 | "reference": "61329ea409362fdae167fdca1125f46c997ce689", 131 | "shasum": "" 132 | }, 133 | "require": { 134 | "doctrine/inflector": "~1.0", 135 | "ext-mbstring": "*", 136 | "illuminate/contracts": "5.2.*", 137 | "paragonie/random_compat": "~1.4", 138 | "php": ">=5.5.9" 139 | }, 140 | "suggest": { 141 | "illuminate/filesystem": "Required to use the composer class (5.2.*).", 142 | "jeremeamia/superclosure": "Required to be able to serialize closures (~2.2).", 143 | "symfony/polyfill-php56": "Required to use the hash_equals function on PHP 5.5 (~1.0).", 144 | "symfony/process": "Required to use the composer class (2.8.*|3.0.*).", 145 | "symfony/var-dumper": "Improves the dd function (2.8.*|3.0.*)." 146 | }, 147 | "type": "library", 148 | "extra": { 149 | "branch-alias": { 150 | "dev-master": "5.2-dev" 151 | } 152 | }, 153 | "autoload": { 154 | "psr-4": { 155 | "Illuminate\\Support\\": "" 156 | }, 157 | "files": [ 158 | "helpers.php" 159 | ] 160 | }, 161 | "notification-url": "https://packagist.org/downloads/", 162 | "license": [ 163 | "MIT" 164 | ], 165 | "authors": [ 166 | { 167 | "name": "Taylor Otwell", 168 | "email": "taylorotwell@gmail.com" 169 | } 170 | ], 171 | "description": "The Illuminate Support package.", 172 | "homepage": "http://laravel.com", 173 | "time": "2016-05-14 16:24:10" 174 | }, 175 | { 176 | "name": "paragonie/random_compat", 177 | "version": "v1.4.1", 178 | "source": { 179 | "type": "git", 180 | "url": "https://github.com/paragonie/random_compat.git", 181 | "reference": "c7e26a21ba357863de030f0b9e701c7d04593774" 182 | }, 183 | "dist": { 184 | "type": "zip", 185 | "url": "https://api.github.com/repos/paragonie/random_compat/zipball/c7e26a21ba357863de030f0b9e701c7d04593774", 186 | "reference": "c7e26a21ba357863de030f0b9e701c7d04593774", 187 | "shasum": "" 188 | }, 189 | "require": { 190 | "php": ">=5.2.0" 191 | }, 192 | "require-dev": { 193 | "phpunit/phpunit": "4.*|5.*" 194 | }, 195 | "suggest": { 196 | "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." 197 | }, 198 | "type": "library", 199 | "autoload": { 200 | "files": [ 201 | "lib/random.php" 202 | ] 203 | }, 204 | "notification-url": "https://packagist.org/downloads/", 205 | "license": [ 206 | "MIT" 207 | ], 208 | "authors": [ 209 | { 210 | "name": "Paragon Initiative Enterprises", 211 | "email": "security@paragonie.com", 212 | "homepage": "https://paragonie.com" 213 | } 214 | ], 215 | "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", 216 | "keywords": [ 217 | "csprng", 218 | "pseudorandom", 219 | "random" 220 | ], 221 | "time": "2016-03-18 20:34:03" 222 | }, 223 | { 224 | "name": "php-smpp/php-smpp", 225 | "version": "1.2", 226 | "source": { 227 | "type": "git", 228 | "url": "https://github.com/onlinecity/php-smpp.git", 229 | "reference": "b8632357b4bf48668aa461d9004c70be9c99de9e" 230 | }, 231 | "dist": { 232 | "type": "zip", 233 | "url": "https://api.github.com/repos/onlinecity/php-smpp/zipball/b8632357b4bf48668aa461d9004c70be9c99de9e", 234 | "reference": "b8632357b4bf48668aa461d9004c70be9c99de9e", 235 | "shasum": "" 236 | }, 237 | "require": { 238 | "ext-mbstring": "*", 239 | "ext-sockets": "*", 240 | "php": ">=5.3.3" 241 | }, 242 | "type": "library", 243 | "autoload": { 244 | "files": [ 245 | "gsmencoder.class.php", 246 | "sockettransport.class.php", 247 | "smppclient.class.php" 248 | ] 249 | }, 250 | "notification-url": "https://packagist.org/downloads/", 251 | "license": [ 252 | "LGPL" 253 | ], 254 | "authors": [ 255 | { 256 | "name": "Hans Duedal", 257 | "email": "hd@oc.dk", 258 | "homepage": "http://oc.dk" 259 | } 260 | ], 261 | "description": "PHP-based SMPP client lib", 262 | "homepage": "http://github.com/onlinecity/php-smpp", 263 | "keywords": [ 264 | "gsm", 265 | "smpp", 266 | "sms", 267 | "texting" 268 | ], 269 | "time": "2015-01-26 10:59:22" 270 | } 271 | ], 272 | "packages-dev": [ 273 | { 274 | "name": "doctrine/instantiator", 275 | "version": "1.0.5", 276 | "source": { 277 | "type": "git", 278 | "url": "https://github.com/doctrine/instantiator.git", 279 | "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d" 280 | }, 281 | "dist": { 282 | "type": "zip", 283 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d", 284 | "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d", 285 | "shasum": "" 286 | }, 287 | "require": { 288 | "php": ">=5.3,<8.0-DEV" 289 | }, 290 | "require-dev": { 291 | "athletic/athletic": "~0.1.8", 292 | "ext-pdo": "*", 293 | "ext-phar": "*", 294 | "phpunit/phpunit": "~4.0", 295 | "squizlabs/php_codesniffer": "~2.0" 296 | }, 297 | "type": "library", 298 | "extra": { 299 | "branch-alias": { 300 | "dev-master": "1.0.x-dev" 301 | } 302 | }, 303 | "autoload": { 304 | "psr-4": { 305 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" 306 | } 307 | }, 308 | "notification-url": "https://packagist.org/downloads/", 309 | "license": [ 310 | "MIT" 311 | ], 312 | "authors": [ 313 | { 314 | "name": "Marco Pivetta", 315 | "email": "ocramius@gmail.com", 316 | "homepage": "http://ocramius.github.com/" 317 | } 318 | ], 319 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", 320 | "homepage": "https://github.com/doctrine/instantiator", 321 | "keywords": [ 322 | "constructor", 323 | "instantiate" 324 | ], 325 | "time": "2015-06-14 21:17:01" 326 | }, 327 | { 328 | "name": "myclabs/deep-copy", 329 | "version": "1.5.1", 330 | "source": { 331 | "type": "git", 332 | "url": "https://github.com/myclabs/DeepCopy.git", 333 | "reference": "a8773992b362b58498eed24bf85005f363c34771" 334 | }, 335 | "dist": { 336 | "type": "zip", 337 | "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/a8773992b362b58498eed24bf85005f363c34771", 338 | "reference": "a8773992b362b58498eed24bf85005f363c34771", 339 | "shasum": "" 340 | }, 341 | "require": { 342 | "php": ">=5.4.0" 343 | }, 344 | "require-dev": { 345 | "doctrine/collections": "1.*", 346 | "phpunit/phpunit": "~4.1" 347 | }, 348 | "type": "library", 349 | "autoload": { 350 | "psr-4": { 351 | "DeepCopy\\": "src/DeepCopy/" 352 | } 353 | }, 354 | "notification-url": "https://packagist.org/downloads/", 355 | "license": [ 356 | "MIT" 357 | ], 358 | "description": "Create deep copies (clones) of your objects", 359 | "homepage": "https://github.com/myclabs/DeepCopy", 360 | "keywords": [ 361 | "clone", 362 | "copy", 363 | "duplicate", 364 | "object", 365 | "object graph" 366 | ], 367 | "time": "2015-11-20 12:04:31" 368 | }, 369 | { 370 | "name": "phpdocumentor/reflection-common", 371 | "version": "1.0", 372 | "source": { 373 | "type": "git", 374 | "url": "https://github.com/phpDocumentor/ReflectionCommon.git", 375 | "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c" 376 | }, 377 | "dist": { 378 | "type": "zip", 379 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/144c307535e82c8fdcaacbcfc1d6d8eeb896687c", 380 | "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c", 381 | "shasum": "" 382 | }, 383 | "require": { 384 | "php": ">=5.5" 385 | }, 386 | "require-dev": { 387 | "phpunit/phpunit": "^4.6" 388 | }, 389 | "type": "library", 390 | "extra": { 391 | "branch-alias": { 392 | "dev-master": "1.0.x-dev" 393 | } 394 | }, 395 | "autoload": { 396 | "psr-4": { 397 | "phpDocumentor\\Reflection\\": [ 398 | "src" 399 | ] 400 | } 401 | }, 402 | "notification-url": "https://packagist.org/downloads/", 403 | "license": [ 404 | "MIT" 405 | ], 406 | "authors": [ 407 | { 408 | "name": "Jaap van Otterdijk", 409 | "email": "opensource@ijaap.nl" 410 | } 411 | ], 412 | "description": "Common reflection classes used by phpdocumentor to reflect the code structure", 413 | "homepage": "http://www.phpdoc.org", 414 | "keywords": [ 415 | "FQSEN", 416 | "phpDocumentor", 417 | "phpdoc", 418 | "reflection", 419 | "static analysis" 420 | ], 421 | "time": "2015-12-27 11:43:31" 422 | }, 423 | { 424 | "name": "phpdocumentor/reflection-docblock", 425 | "version": "3.0.2", 426 | "source": { 427 | "type": "git", 428 | "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", 429 | "reference": "45ada3e3fd09789fbfbd6d65b3f0901f0030dc61" 430 | }, 431 | "dist": { 432 | "type": "zip", 433 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/45ada3e3fd09789fbfbd6d65b3f0901f0030dc61", 434 | "reference": "45ada3e3fd09789fbfbd6d65b3f0901f0030dc61", 435 | "shasum": "" 436 | }, 437 | "require": { 438 | "php": ">=5.5", 439 | "phpdocumentor/reflection-common": "^1.0@dev", 440 | "phpdocumentor/type-resolver": "^0.1.5", 441 | "webmozart/assert": "^1.0" 442 | }, 443 | "require-dev": { 444 | "mockery/mockery": "^0.9.4", 445 | "phpunit/phpunit": "^4.4" 446 | }, 447 | "type": "library", 448 | "autoload": { 449 | "psr-4": { 450 | "phpDocumentor\\Reflection\\": [ 451 | "src/" 452 | ] 453 | } 454 | }, 455 | "notification-url": "https://packagist.org/downloads/", 456 | "license": [ 457 | "MIT" 458 | ], 459 | "authors": [ 460 | { 461 | "name": "Mike van Riel", 462 | "email": "me@mikevanriel.com" 463 | } 464 | ], 465 | "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", 466 | "time": "2016-06-06 06:44:13" 467 | }, 468 | { 469 | "name": "phpdocumentor/type-resolver", 470 | "version": "0.1.8", 471 | "source": { 472 | "type": "git", 473 | "url": "https://github.com/phpDocumentor/TypeResolver.git", 474 | "reference": "9891754231e55d42f0d16988ffb799af39f31a12" 475 | }, 476 | "dist": { 477 | "type": "zip", 478 | "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9891754231e55d42f0d16988ffb799af39f31a12", 479 | "reference": "9891754231e55d42f0d16988ffb799af39f31a12", 480 | "shasum": "" 481 | }, 482 | "require": { 483 | "php": ">=5.5", 484 | "phpdocumentor/reflection-common": "^1.0" 485 | }, 486 | "require-dev": { 487 | "mockery/mockery": "^0.9.4", 488 | "phpunit/phpunit": "^5.2" 489 | }, 490 | "type": "library", 491 | "extra": { 492 | "branch-alias": { 493 | "dev-master": "1.0.x-dev" 494 | } 495 | }, 496 | "autoload": { 497 | "psr-4": { 498 | "phpDocumentor\\Reflection\\": [ 499 | "src/" 500 | ] 501 | } 502 | }, 503 | "notification-url": "https://packagist.org/downloads/", 504 | "license": [ 505 | "MIT" 506 | ], 507 | "authors": [ 508 | { 509 | "name": "Mike van Riel", 510 | "email": "me@mikevanriel.com" 511 | } 512 | ], 513 | "time": "2016-03-28 10:02:29" 514 | }, 515 | { 516 | "name": "phpspec/prophecy", 517 | "version": "v1.6.1", 518 | "source": { 519 | "type": "git", 520 | "url": "https://github.com/phpspec/prophecy.git", 521 | "reference": "58a8137754bc24b25740d4281399a4a3596058e0" 522 | }, 523 | "dist": { 524 | "type": "zip", 525 | "url": "https://api.github.com/repos/phpspec/prophecy/zipball/58a8137754bc24b25740d4281399a4a3596058e0", 526 | "reference": "58a8137754bc24b25740d4281399a4a3596058e0", 527 | "shasum": "" 528 | }, 529 | "require": { 530 | "doctrine/instantiator": "^1.0.2", 531 | "php": "^5.3|^7.0", 532 | "phpdocumentor/reflection-docblock": "^2.0|^3.0.2", 533 | "sebastian/comparator": "^1.1", 534 | "sebastian/recursion-context": "^1.0" 535 | }, 536 | "require-dev": { 537 | "phpspec/phpspec": "^2.0" 538 | }, 539 | "type": "library", 540 | "extra": { 541 | "branch-alias": { 542 | "dev-master": "1.6.x-dev" 543 | } 544 | }, 545 | "autoload": { 546 | "psr-0": { 547 | "Prophecy\\": "src/" 548 | } 549 | }, 550 | "notification-url": "https://packagist.org/downloads/", 551 | "license": [ 552 | "MIT" 553 | ], 554 | "authors": [ 555 | { 556 | "name": "Konstantin Kudryashov", 557 | "email": "ever.zet@gmail.com", 558 | "homepage": "http://everzet.com" 559 | }, 560 | { 561 | "name": "Marcello Duarte", 562 | "email": "marcello.duarte@gmail.com" 563 | } 564 | ], 565 | "description": "Highly opinionated mocking framework for PHP 5.3+", 566 | "homepage": "https://github.com/phpspec/prophecy", 567 | "keywords": [ 568 | "Double", 569 | "Dummy", 570 | "fake", 571 | "mock", 572 | "spy", 573 | "stub" 574 | ], 575 | "time": "2016-06-07 08:13:47" 576 | }, 577 | { 578 | "name": "phpunit/php-code-coverage", 579 | "version": "4.0.0", 580 | "source": { 581 | "type": "git", 582 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 583 | "reference": "900370c81280cc0d942ffbc5912d80464eaee7e9" 584 | }, 585 | "dist": { 586 | "type": "zip", 587 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/900370c81280cc0d942ffbc5912d80464eaee7e9", 588 | "reference": "900370c81280cc0d942ffbc5912d80464eaee7e9", 589 | "shasum": "" 590 | }, 591 | "require": { 592 | "php": "^5.6 || ^7.0", 593 | "phpunit/php-file-iterator": "~1.3", 594 | "phpunit/php-text-template": "~1.2", 595 | "phpunit/php-token-stream": "^1.4.2", 596 | "sebastian/code-unit-reverse-lookup": "~1.0", 597 | "sebastian/environment": "^1.3.2", 598 | "sebastian/version": "~1.0|~2.0" 599 | }, 600 | "require-dev": { 601 | "ext-xdebug": ">=2.1.4", 602 | "phpunit/phpunit": "^5.4" 603 | }, 604 | "suggest": { 605 | "ext-dom": "*", 606 | "ext-xdebug": ">=2.4.0", 607 | "ext-xmlwriter": "*" 608 | }, 609 | "type": "library", 610 | "extra": { 611 | "branch-alias": { 612 | "dev-master": "4.0.x-dev" 613 | } 614 | }, 615 | "autoload": { 616 | "classmap": [ 617 | "src/" 618 | ] 619 | }, 620 | "notification-url": "https://packagist.org/downloads/", 621 | "license": [ 622 | "BSD-3-Clause" 623 | ], 624 | "authors": [ 625 | { 626 | "name": "Sebastian Bergmann", 627 | "email": "sb@sebastian-bergmann.de", 628 | "role": "lead" 629 | } 630 | ], 631 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", 632 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage", 633 | "keywords": [ 634 | "coverage", 635 | "testing", 636 | "xunit" 637 | ], 638 | "time": "2016-06-03 05:03:56" 639 | }, 640 | { 641 | "name": "phpunit/php-file-iterator", 642 | "version": "1.4.1", 643 | "source": { 644 | "type": "git", 645 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git", 646 | "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0" 647 | }, 648 | "dist": { 649 | "type": "zip", 650 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/6150bf2c35d3fc379e50c7602b75caceaa39dbf0", 651 | "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0", 652 | "shasum": "" 653 | }, 654 | "require": { 655 | "php": ">=5.3.3" 656 | }, 657 | "type": "library", 658 | "extra": { 659 | "branch-alias": { 660 | "dev-master": "1.4.x-dev" 661 | } 662 | }, 663 | "autoload": { 664 | "classmap": [ 665 | "src/" 666 | ] 667 | }, 668 | "notification-url": "https://packagist.org/downloads/", 669 | "license": [ 670 | "BSD-3-Clause" 671 | ], 672 | "authors": [ 673 | { 674 | "name": "Sebastian Bergmann", 675 | "email": "sb@sebastian-bergmann.de", 676 | "role": "lead" 677 | } 678 | ], 679 | "description": "FilterIterator implementation that filters files based on a list of suffixes.", 680 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", 681 | "keywords": [ 682 | "filesystem", 683 | "iterator" 684 | ], 685 | "time": "2015-06-21 13:08:43" 686 | }, 687 | { 688 | "name": "phpunit/php-text-template", 689 | "version": "1.2.1", 690 | "source": { 691 | "type": "git", 692 | "url": "https://github.com/sebastianbergmann/php-text-template.git", 693 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" 694 | }, 695 | "dist": { 696 | "type": "zip", 697 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 698 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 699 | "shasum": "" 700 | }, 701 | "require": { 702 | "php": ">=5.3.3" 703 | }, 704 | "type": "library", 705 | "autoload": { 706 | "classmap": [ 707 | "src/" 708 | ] 709 | }, 710 | "notification-url": "https://packagist.org/downloads/", 711 | "license": [ 712 | "BSD-3-Clause" 713 | ], 714 | "authors": [ 715 | { 716 | "name": "Sebastian Bergmann", 717 | "email": "sebastian@phpunit.de", 718 | "role": "lead" 719 | } 720 | ], 721 | "description": "Simple template engine.", 722 | "homepage": "https://github.com/sebastianbergmann/php-text-template/", 723 | "keywords": [ 724 | "template" 725 | ], 726 | "time": "2015-06-21 13:50:34" 727 | }, 728 | { 729 | "name": "phpunit/php-timer", 730 | "version": "1.0.8", 731 | "source": { 732 | "type": "git", 733 | "url": "https://github.com/sebastianbergmann/php-timer.git", 734 | "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260" 735 | }, 736 | "dist": { 737 | "type": "zip", 738 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/38e9124049cf1a164f1e4537caf19c99bf1eb260", 739 | "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260", 740 | "shasum": "" 741 | }, 742 | "require": { 743 | "php": ">=5.3.3" 744 | }, 745 | "require-dev": { 746 | "phpunit/phpunit": "~4|~5" 747 | }, 748 | "type": "library", 749 | "autoload": { 750 | "classmap": [ 751 | "src/" 752 | ] 753 | }, 754 | "notification-url": "https://packagist.org/downloads/", 755 | "license": [ 756 | "BSD-3-Clause" 757 | ], 758 | "authors": [ 759 | { 760 | "name": "Sebastian Bergmann", 761 | "email": "sb@sebastian-bergmann.de", 762 | "role": "lead" 763 | } 764 | ], 765 | "description": "Utility class for timing", 766 | "homepage": "https://github.com/sebastianbergmann/php-timer/", 767 | "keywords": [ 768 | "timer" 769 | ], 770 | "time": "2016-05-12 18:03:57" 771 | }, 772 | { 773 | "name": "phpunit/php-token-stream", 774 | "version": "1.4.8", 775 | "source": { 776 | "type": "git", 777 | "url": "https://github.com/sebastianbergmann/php-token-stream.git", 778 | "reference": "3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da" 779 | }, 780 | "dist": { 781 | "type": "zip", 782 | "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da", 783 | "reference": "3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da", 784 | "shasum": "" 785 | }, 786 | "require": { 787 | "ext-tokenizer": "*", 788 | "php": ">=5.3.3" 789 | }, 790 | "require-dev": { 791 | "phpunit/phpunit": "~4.2" 792 | }, 793 | "type": "library", 794 | "extra": { 795 | "branch-alias": { 796 | "dev-master": "1.4-dev" 797 | } 798 | }, 799 | "autoload": { 800 | "classmap": [ 801 | "src/" 802 | ] 803 | }, 804 | "notification-url": "https://packagist.org/downloads/", 805 | "license": [ 806 | "BSD-3-Clause" 807 | ], 808 | "authors": [ 809 | { 810 | "name": "Sebastian Bergmann", 811 | "email": "sebastian@phpunit.de" 812 | } 813 | ], 814 | "description": "Wrapper around PHP's tokenizer extension.", 815 | "homepage": "https://github.com/sebastianbergmann/php-token-stream/", 816 | "keywords": [ 817 | "tokenizer" 818 | ], 819 | "time": "2015-09-15 10:49:45" 820 | }, 821 | { 822 | "name": "phpunit/phpunit", 823 | "version": "5.4.2", 824 | "source": { 825 | "type": "git", 826 | "url": "https://github.com/sebastianbergmann/phpunit.git", 827 | "reference": "f5726a0262e5f74f8e9cf03128798b64160c441d" 828 | }, 829 | "dist": { 830 | "type": "zip", 831 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/f5726a0262e5f74f8e9cf03128798b64160c441d", 832 | "reference": "f5726a0262e5f74f8e9cf03128798b64160c441d", 833 | "shasum": "" 834 | }, 835 | "require": { 836 | "ext-dom": "*", 837 | "ext-json": "*", 838 | "ext-pcre": "*", 839 | "ext-reflection": "*", 840 | "ext-spl": "*", 841 | "myclabs/deep-copy": "~1.3", 842 | "php": "^5.6 || ^7.0", 843 | "phpspec/prophecy": "^1.3.1", 844 | "phpunit/php-code-coverage": "^4.0", 845 | "phpunit/php-file-iterator": "~1.4", 846 | "phpunit/php-text-template": "~1.2", 847 | "phpunit/php-timer": "^1.0.6", 848 | "phpunit/phpunit-mock-objects": "^3.2", 849 | "sebastian/comparator": "~1.1", 850 | "sebastian/diff": "~1.2", 851 | "sebastian/environment": "~1.3", 852 | "sebastian/exporter": "~1.2", 853 | "sebastian/global-state": "~1.0", 854 | "sebastian/object-enumerator": "~1.0", 855 | "sebastian/resource-operations": "~1.0", 856 | "sebastian/version": "~1.0|~2.0", 857 | "symfony/yaml": "~2.1|~3.0" 858 | }, 859 | "suggest": { 860 | "phpunit/php-invoker": "~1.1" 861 | }, 862 | "bin": [ 863 | "phpunit" 864 | ], 865 | "type": "library", 866 | "extra": { 867 | "branch-alias": { 868 | "dev-master": "5.4.x-dev" 869 | } 870 | }, 871 | "autoload": { 872 | "classmap": [ 873 | "src/" 874 | ] 875 | }, 876 | "notification-url": "https://packagist.org/downloads/", 877 | "license": [ 878 | "BSD-3-Clause" 879 | ], 880 | "authors": [ 881 | { 882 | "name": "Sebastian Bergmann", 883 | "email": "sebastian@phpunit.de", 884 | "role": "lead" 885 | } 886 | ], 887 | "description": "The PHP Unit Testing framework.", 888 | "homepage": "https://phpunit.de/", 889 | "keywords": [ 890 | "phpunit", 891 | "testing", 892 | "xunit" 893 | ], 894 | "time": "2016-06-03 09:59:50" 895 | }, 896 | { 897 | "name": "phpunit/phpunit-mock-objects", 898 | "version": "3.2.1", 899 | "source": { 900 | "type": "git", 901 | "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", 902 | "reference": "0dc8fd8e87e0366c22b6c25d1f43c4e2e66847b3" 903 | }, 904 | "dist": { 905 | "type": "zip", 906 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/0dc8fd8e87e0366c22b6c25d1f43c4e2e66847b3", 907 | "reference": "0dc8fd8e87e0366c22b6c25d1f43c4e2e66847b3", 908 | "shasum": "" 909 | }, 910 | "require": { 911 | "doctrine/instantiator": "^1.0.2", 912 | "php": "^5.6 || ^7.0", 913 | "phpunit/php-text-template": "^1.2", 914 | "sebastian/exporter": "^1.2" 915 | }, 916 | "conflict": { 917 | "phpunit/phpunit": "<5.4.0" 918 | }, 919 | "require-dev": { 920 | "phpunit/phpunit": "^5.4" 921 | }, 922 | "suggest": { 923 | "ext-soap": "*" 924 | }, 925 | "type": "library", 926 | "extra": { 927 | "branch-alias": { 928 | "dev-master": "3.2.x-dev" 929 | } 930 | }, 931 | "autoload": { 932 | "classmap": [ 933 | "src/" 934 | ] 935 | }, 936 | "notification-url": "https://packagist.org/downloads/", 937 | "license": [ 938 | "BSD-3-Clause" 939 | ], 940 | "authors": [ 941 | { 942 | "name": "Sebastian Bergmann", 943 | "email": "sb@sebastian-bergmann.de", 944 | "role": "lead" 945 | } 946 | ], 947 | "description": "Mock Object library for PHPUnit", 948 | "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", 949 | "keywords": [ 950 | "mock", 951 | "xunit" 952 | ], 953 | "time": "2016-06-04 05:52:19" 954 | }, 955 | { 956 | "name": "sebastian/code-unit-reverse-lookup", 957 | "version": "1.0.0", 958 | "source": { 959 | "type": "git", 960 | "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", 961 | "reference": "c36f5e7cfce482fde5bf8d10d41a53591e0198fe" 962 | }, 963 | "dist": { 964 | "type": "zip", 965 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/c36f5e7cfce482fde5bf8d10d41a53591e0198fe", 966 | "reference": "c36f5e7cfce482fde5bf8d10d41a53591e0198fe", 967 | "shasum": "" 968 | }, 969 | "require": { 970 | "php": ">=5.6" 971 | }, 972 | "require-dev": { 973 | "phpunit/phpunit": "~5" 974 | }, 975 | "type": "library", 976 | "extra": { 977 | "branch-alias": { 978 | "dev-master": "1.0.x-dev" 979 | } 980 | }, 981 | "autoload": { 982 | "classmap": [ 983 | "src/" 984 | ] 985 | }, 986 | "notification-url": "https://packagist.org/downloads/", 987 | "license": [ 988 | "BSD-3-Clause" 989 | ], 990 | "authors": [ 991 | { 992 | "name": "Sebastian Bergmann", 993 | "email": "sebastian@phpunit.de" 994 | } 995 | ], 996 | "description": "Looks up which function or method a line of code belongs to", 997 | "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", 998 | "time": "2016-02-13 06:45:14" 999 | }, 1000 | { 1001 | "name": "sebastian/comparator", 1002 | "version": "1.2.0", 1003 | "source": { 1004 | "type": "git", 1005 | "url": "https://github.com/sebastianbergmann/comparator.git", 1006 | "reference": "937efb279bd37a375bcadf584dec0726f84dbf22" 1007 | }, 1008 | "dist": { 1009 | "type": "zip", 1010 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/937efb279bd37a375bcadf584dec0726f84dbf22", 1011 | "reference": "937efb279bd37a375bcadf584dec0726f84dbf22", 1012 | "shasum": "" 1013 | }, 1014 | "require": { 1015 | "php": ">=5.3.3", 1016 | "sebastian/diff": "~1.2", 1017 | "sebastian/exporter": "~1.2" 1018 | }, 1019 | "require-dev": { 1020 | "phpunit/phpunit": "~4.4" 1021 | }, 1022 | "type": "library", 1023 | "extra": { 1024 | "branch-alias": { 1025 | "dev-master": "1.2.x-dev" 1026 | } 1027 | }, 1028 | "autoload": { 1029 | "classmap": [ 1030 | "src/" 1031 | ] 1032 | }, 1033 | "notification-url": "https://packagist.org/downloads/", 1034 | "license": [ 1035 | "BSD-3-Clause" 1036 | ], 1037 | "authors": [ 1038 | { 1039 | "name": "Jeff Welch", 1040 | "email": "whatthejeff@gmail.com" 1041 | }, 1042 | { 1043 | "name": "Volker Dusch", 1044 | "email": "github@wallbash.com" 1045 | }, 1046 | { 1047 | "name": "Bernhard Schussek", 1048 | "email": "bschussek@2bepublished.at" 1049 | }, 1050 | { 1051 | "name": "Sebastian Bergmann", 1052 | "email": "sebastian@phpunit.de" 1053 | } 1054 | ], 1055 | "description": "Provides the functionality to compare PHP values for equality", 1056 | "homepage": "http://www.github.com/sebastianbergmann/comparator", 1057 | "keywords": [ 1058 | "comparator", 1059 | "compare", 1060 | "equality" 1061 | ], 1062 | "time": "2015-07-26 15:48:44" 1063 | }, 1064 | { 1065 | "name": "sebastian/diff", 1066 | "version": "1.4.1", 1067 | "source": { 1068 | "type": "git", 1069 | "url": "https://github.com/sebastianbergmann/diff.git", 1070 | "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e" 1071 | }, 1072 | "dist": { 1073 | "type": "zip", 1074 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/13edfd8706462032c2f52b4b862974dd46b71c9e", 1075 | "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e", 1076 | "shasum": "" 1077 | }, 1078 | "require": { 1079 | "php": ">=5.3.3" 1080 | }, 1081 | "require-dev": { 1082 | "phpunit/phpunit": "~4.8" 1083 | }, 1084 | "type": "library", 1085 | "extra": { 1086 | "branch-alias": { 1087 | "dev-master": "1.4-dev" 1088 | } 1089 | }, 1090 | "autoload": { 1091 | "classmap": [ 1092 | "src/" 1093 | ] 1094 | }, 1095 | "notification-url": "https://packagist.org/downloads/", 1096 | "license": [ 1097 | "BSD-3-Clause" 1098 | ], 1099 | "authors": [ 1100 | { 1101 | "name": "Kore Nordmann", 1102 | "email": "mail@kore-nordmann.de" 1103 | }, 1104 | { 1105 | "name": "Sebastian Bergmann", 1106 | "email": "sebastian@phpunit.de" 1107 | } 1108 | ], 1109 | "description": "Diff implementation", 1110 | "homepage": "https://github.com/sebastianbergmann/diff", 1111 | "keywords": [ 1112 | "diff" 1113 | ], 1114 | "time": "2015-12-08 07:14:41" 1115 | }, 1116 | { 1117 | "name": "sebastian/environment", 1118 | "version": "1.3.7", 1119 | "source": { 1120 | "type": "git", 1121 | "url": "https://github.com/sebastianbergmann/environment.git", 1122 | "reference": "4e8f0da10ac5802913afc151413bc8c53b6c2716" 1123 | }, 1124 | "dist": { 1125 | "type": "zip", 1126 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/4e8f0da10ac5802913afc151413bc8c53b6c2716", 1127 | "reference": "4e8f0da10ac5802913afc151413bc8c53b6c2716", 1128 | "shasum": "" 1129 | }, 1130 | "require": { 1131 | "php": ">=5.3.3" 1132 | }, 1133 | "require-dev": { 1134 | "phpunit/phpunit": "~4.4" 1135 | }, 1136 | "type": "library", 1137 | "extra": { 1138 | "branch-alias": { 1139 | "dev-master": "1.3.x-dev" 1140 | } 1141 | }, 1142 | "autoload": { 1143 | "classmap": [ 1144 | "src/" 1145 | ] 1146 | }, 1147 | "notification-url": "https://packagist.org/downloads/", 1148 | "license": [ 1149 | "BSD-3-Clause" 1150 | ], 1151 | "authors": [ 1152 | { 1153 | "name": "Sebastian Bergmann", 1154 | "email": "sebastian@phpunit.de" 1155 | } 1156 | ], 1157 | "description": "Provides functionality to handle HHVM/PHP environments", 1158 | "homepage": "http://www.github.com/sebastianbergmann/environment", 1159 | "keywords": [ 1160 | "Xdebug", 1161 | "environment", 1162 | "hhvm" 1163 | ], 1164 | "time": "2016-05-17 03:18:57" 1165 | }, 1166 | { 1167 | "name": "sebastian/exporter", 1168 | "version": "1.2.1", 1169 | "source": { 1170 | "type": "git", 1171 | "url": "https://github.com/sebastianbergmann/exporter.git", 1172 | "reference": "7ae5513327cb536431847bcc0c10edba2701064e" 1173 | }, 1174 | "dist": { 1175 | "type": "zip", 1176 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/7ae5513327cb536431847bcc0c10edba2701064e", 1177 | "reference": "7ae5513327cb536431847bcc0c10edba2701064e", 1178 | "shasum": "" 1179 | }, 1180 | "require": { 1181 | "php": ">=5.3.3", 1182 | "sebastian/recursion-context": "~1.0" 1183 | }, 1184 | "require-dev": { 1185 | "phpunit/phpunit": "~4.4" 1186 | }, 1187 | "type": "library", 1188 | "extra": { 1189 | "branch-alias": { 1190 | "dev-master": "1.2.x-dev" 1191 | } 1192 | }, 1193 | "autoload": { 1194 | "classmap": [ 1195 | "src/" 1196 | ] 1197 | }, 1198 | "notification-url": "https://packagist.org/downloads/", 1199 | "license": [ 1200 | "BSD-3-Clause" 1201 | ], 1202 | "authors": [ 1203 | { 1204 | "name": "Jeff Welch", 1205 | "email": "whatthejeff@gmail.com" 1206 | }, 1207 | { 1208 | "name": "Volker Dusch", 1209 | "email": "github@wallbash.com" 1210 | }, 1211 | { 1212 | "name": "Bernhard Schussek", 1213 | "email": "bschussek@2bepublished.at" 1214 | }, 1215 | { 1216 | "name": "Sebastian Bergmann", 1217 | "email": "sebastian@phpunit.de" 1218 | }, 1219 | { 1220 | "name": "Adam Harvey", 1221 | "email": "aharvey@php.net" 1222 | } 1223 | ], 1224 | "description": "Provides the functionality to export PHP variables for visualization", 1225 | "homepage": "http://www.github.com/sebastianbergmann/exporter", 1226 | "keywords": [ 1227 | "export", 1228 | "exporter" 1229 | ], 1230 | "time": "2015-06-21 07:55:53" 1231 | }, 1232 | { 1233 | "name": "sebastian/global-state", 1234 | "version": "1.1.1", 1235 | "source": { 1236 | "type": "git", 1237 | "url": "https://github.com/sebastianbergmann/global-state.git", 1238 | "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4" 1239 | }, 1240 | "dist": { 1241 | "type": "zip", 1242 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4", 1243 | "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4", 1244 | "shasum": "" 1245 | }, 1246 | "require": { 1247 | "php": ">=5.3.3" 1248 | }, 1249 | "require-dev": { 1250 | "phpunit/phpunit": "~4.2" 1251 | }, 1252 | "suggest": { 1253 | "ext-uopz": "*" 1254 | }, 1255 | "type": "library", 1256 | "extra": { 1257 | "branch-alias": { 1258 | "dev-master": "1.0-dev" 1259 | } 1260 | }, 1261 | "autoload": { 1262 | "classmap": [ 1263 | "src/" 1264 | ] 1265 | }, 1266 | "notification-url": "https://packagist.org/downloads/", 1267 | "license": [ 1268 | "BSD-3-Clause" 1269 | ], 1270 | "authors": [ 1271 | { 1272 | "name": "Sebastian Bergmann", 1273 | "email": "sebastian@phpunit.de" 1274 | } 1275 | ], 1276 | "description": "Snapshotting of global state", 1277 | "homepage": "http://www.github.com/sebastianbergmann/global-state", 1278 | "keywords": [ 1279 | "global state" 1280 | ], 1281 | "time": "2015-10-12 03:26:01" 1282 | }, 1283 | { 1284 | "name": "sebastian/object-enumerator", 1285 | "version": "1.0.0", 1286 | "source": { 1287 | "type": "git", 1288 | "url": "https://github.com/sebastianbergmann/object-enumerator.git", 1289 | "reference": "d4ca2fb70344987502567bc50081c03e6192fb26" 1290 | }, 1291 | "dist": { 1292 | "type": "zip", 1293 | "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/d4ca2fb70344987502567bc50081c03e6192fb26", 1294 | "reference": "d4ca2fb70344987502567bc50081c03e6192fb26", 1295 | "shasum": "" 1296 | }, 1297 | "require": { 1298 | "php": ">=5.6", 1299 | "sebastian/recursion-context": "~1.0" 1300 | }, 1301 | "require-dev": { 1302 | "phpunit/phpunit": "~5" 1303 | }, 1304 | "type": "library", 1305 | "extra": { 1306 | "branch-alias": { 1307 | "dev-master": "1.0.x-dev" 1308 | } 1309 | }, 1310 | "autoload": { 1311 | "classmap": [ 1312 | "src/" 1313 | ] 1314 | }, 1315 | "notification-url": "https://packagist.org/downloads/", 1316 | "license": [ 1317 | "BSD-3-Clause" 1318 | ], 1319 | "authors": [ 1320 | { 1321 | "name": "Sebastian Bergmann", 1322 | "email": "sebastian@phpunit.de" 1323 | } 1324 | ], 1325 | "description": "Traverses array structures and object graphs to enumerate all referenced objects", 1326 | "homepage": "https://github.com/sebastianbergmann/object-enumerator/", 1327 | "time": "2016-01-28 13:25:10" 1328 | }, 1329 | { 1330 | "name": "sebastian/recursion-context", 1331 | "version": "1.0.2", 1332 | "source": { 1333 | "type": "git", 1334 | "url": "https://github.com/sebastianbergmann/recursion-context.git", 1335 | "reference": "913401df809e99e4f47b27cdd781f4a258d58791" 1336 | }, 1337 | "dist": { 1338 | "type": "zip", 1339 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/913401df809e99e4f47b27cdd781f4a258d58791", 1340 | "reference": "913401df809e99e4f47b27cdd781f4a258d58791", 1341 | "shasum": "" 1342 | }, 1343 | "require": { 1344 | "php": ">=5.3.3" 1345 | }, 1346 | "require-dev": { 1347 | "phpunit/phpunit": "~4.4" 1348 | }, 1349 | "type": "library", 1350 | "extra": { 1351 | "branch-alias": { 1352 | "dev-master": "1.0.x-dev" 1353 | } 1354 | }, 1355 | "autoload": { 1356 | "classmap": [ 1357 | "src/" 1358 | ] 1359 | }, 1360 | "notification-url": "https://packagist.org/downloads/", 1361 | "license": [ 1362 | "BSD-3-Clause" 1363 | ], 1364 | "authors": [ 1365 | { 1366 | "name": "Jeff Welch", 1367 | "email": "whatthejeff@gmail.com" 1368 | }, 1369 | { 1370 | "name": "Sebastian Bergmann", 1371 | "email": "sebastian@phpunit.de" 1372 | }, 1373 | { 1374 | "name": "Adam Harvey", 1375 | "email": "aharvey@php.net" 1376 | } 1377 | ], 1378 | "description": "Provides functionality to recursively process PHP variables", 1379 | "homepage": "http://www.github.com/sebastianbergmann/recursion-context", 1380 | "time": "2015-11-11 19:50:13" 1381 | }, 1382 | { 1383 | "name": "sebastian/resource-operations", 1384 | "version": "1.0.0", 1385 | "source": { 1386 | "type": "git", 1387 | "url": "https://github.com/sebastianbergmann/resource-operations.git", 1388 | "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52" 1389 | }, 1390 | "dist": { 1391 | "type": "zip", 1392 | "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", 1393 | "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", 1394 | "shasum": "" 1395 | }, 1396 | "require": { 1397 | "php": ">=5.6.0" 1398 | }, 1399 | "type": "library", 1400 | "extra": { 1401 | "branch-alias": { 1402 | "dev-master": "1.0.x-dev" 1403 | } 1404 | }, 1405 | "autoload": { 1406 | "classmap": [ 1407 | "src/" 1408 | ] 1409 | }, 1410 | "notification-url": "https://packagist.org/downloads/", 1411 | "license": [ 1412 | "BSD-3-Clause" 1413 | ], 1414 | "authors": [ 1415 | { 1416 | "name": "Sebastian Bergmann", 1417 | "email": "sebastian@phpunit.de" 1418 | } 1419 | ], 1420 | "description": "Provides a list of PHP built-in functions that operate on resources", 1421 | "homepage": "https://www.github.com/sebastianbergmann/resource-operations", 1422 | "time": "2015-07-28 20:34:47" 1423 | }, 1424 | { 1425 | "name": "sebastian/version", 1426 | "version": "2.0.0", 1427 | "source": { 1428 | "type": "git", 1429 | "url": "https://github.com/sebastianbergmann/version.git", 1430 | "reference": "c829badbd8fdf16a0bad8aa7fa7971c029f1b9c5" 1431 | }, 1432 | "dist": { 1433 | "type": "zip", 1434 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c829badbd8fdf16a0bad8aa7fa7971c029f1b9c5", 1435 | "reference": "c829badbd8fdf16a0bad8aa7fa7971c029f1b9c5", 1436 | "shasum": "" 1437 | }, 1438 | "require": { 1439 | "php": ">=5.6" 1440 | }, 1441 | "type": "library", 1442 | "extra": { 1443 | "branch-alias": { 1444 | "dev-master": "2.0.x-dev" 1445 | } 1446 | }, 1447 | "autoload": { 1448 | "classmap": [ 1449 | "src/" 1450 | ] 1451 | }, 1452 | "notification-url": "https://packagist.org/downloads/", 1453 | "license": [ 1454 | "BSD-3-Clause" 1455 | ], 1456 | "authors": [ 1457 | { 1458 | "name": "Sebastian Bergmann", 1459 | "email": "sebastian@phpunit.de", 1460 | "role": "lead" 1461 | } 1462 | ], 1463 | "description": "Library that helps with managing the version number of Git-hosted PHP projects", 1464 | "homepage": "https://github.com/sebastianbergmann/version", 1465 | "time": "2016-02-04 12:56:52" 1466 | }, 1467 | { 1468 | "name": "symfony/yaml", 1469 | "version": "v3.1.0", 1470 | "source": { 1471 | "type": "git", 1472 | "url": "https://github.com/symfony/yaml.git", 1473 | "reference": "eca51b7b65eb9be6af88ad7cc91685f1556f5c9a" 1474 | }, 1475 | "dist": { 1476 | "type": "zip", 1477 | "url": "https://api.github.com/repos/symfony/yaml/zipball/eca51b7b65eb9be6af88ad7cc91685f1556f5c9a", 1478 | "reference": "eca51b7b65eb9be6af88ad7cc91685f1556f5c9a", 1479 | "shasum": "" 1480 | }, 1481 | "require": { 1482 | "php": ">=5.5.9" 1483 | }, 1484 | "type": "library", 1485 | "extra": { 1486 | "branch-alias": { 1487 | "dev-master": "3.1-dev" 1488 | } 1489 | }, 1490 | "autoload": { 1491 | "psr-4": { 1492 | "Symfony\\Component\\Yaml\\": "" 1493 | }, 1494 | "exclude-from-classmap": [ 1495 | "/Tests/" 1496 | ] 1497 | }, 1498 | "notification-url": "https://packagist.org/downloads/", 1499 | "license": [ 1500 | "MIT" 1501 | ], 1502 | "authors": [ 1503 | { 1504 | "name": "Fabien Potencier", 1505 | "email": "fabien@symfony.com" 1506 | }, 1507 | { 1508 | "name": "Symfony Community", 1509 | "homepage": "https://symfony.com/contributors" 1510 | } 1511 | ], 1512 | "description": "Symfony Yaml Component", 1513 | "homepage": "https://symfony.com", 1514 | "time": "2016-05-26 21:46:24" 1515 | }, 1516 | { 1517 | "name": "webmozart/assert", 1518 | "version": "1.0.2", 1519 | "source": { 1520 | "type": "git", 1521 | "url": "https://github.com/webmozart/assert.git", 1522 | "reference": "30eed06dd6bc88410a4ff7f77b6d22f3ce13dbde" 1523 | }, 1524 | "dist": { 1525 | "type": "zip", 1526 | "url": "https://api.github.com/repos/webmozart/assert/zipball/30eed06dd6bc88410a4ff7f77b6d22f3ce13dbde", 1527 | "reference": "30eed06dd6bc88410a4ff7f77b6d22f3ce13dbde", 1528 | "shasum": "" 1529 | }, 1530 | "require": { 1531 | "php": ">=5.3.3" 1532 | }, 1533 | "require-dev": { 1534 | "phpunit/phpunit": "^4.6" 1535 | }, 1536 | "type": "library", 1537 | "extra": { 1538 | "branch-alias": { 1539 | "dev-master": "1.0-dev" 1540 | } 1541 | }, 1542 | "autoload": { 1543 | "psr-4": { 1544 | "Webmozart\\Assert\\": "src/" 1545 | } 1546 | }, 1547 | "notification-url": "https://packagist.org/downloads/", 1548 | "license": [ 1549 | "MIT" 1550 | ], 1551 | "authors": [ 1552 | { 1553 | "name": "Bernhard Schussek", 1554 | "email": "bschussek@gmail.com" 1555 | } 1556 | ], 1557 | "description": "Assertions to validate method input/output with nice error messages.", 1558 | "keywords": [ 1559 | "assert", 1560 | "check", 1561 | "validate" 1562 | ], 1563 | "time": "2015-08-24 13:29:44" 1564 | } 1565 | ], 1566 | "aliases": [], 1567 | "minimum-stability": "stable", 1568 | "stability-flags": { 1569 | "php-smpp/php-smpp": 20 1570 | }, 1571 | "prefer-stable": false, 1572 | "prefer-lowest": false, 1573 | "platform": [], 1574 | "platform-dev": [] 1575 | } 1576 | -------------------------------------------------------------------------------- /config/laravel-smpp.php: -------------------------------------------------------------------------------- 1 | [ 21 | 'sender' => env('SMPP_SENDER'), 22 | 'source_ton' => env('SMPP_SOURCE_TON'), 23 | 'source_npi' => env('SMPP_SOURCE_NPI'), 24 | 'destination_ton' => env('SMPP_DESTINATION_TON'), 25 | 'destination_npi' => env('SMPP_DESTINATION_NPI') 26 | ], 27 | 28 | /* 29 | |-------------------------------------------------------------------------- 30 | | Custom SMPP provider settings 31 | |-------------------------------------------------------------------------- 32 | | 33 | | Most of the time, settings shown under the "example" key are be provided by your SMPP provider. 34 | | So if you don't have any of these settings, please contact your SMPP provider. 35 | | 36 | */ 37 | 38 | 'default' => env('SMPP_DEFAULT_PROVIDER'), 39 | 40 | 'providers' => [ 41 | 'example' => [ 42 | 'host' => 'localhost', 43 | 'port' => 9999, 44 | 'timeout' => 90, 45 | 'login' => 'login', 46 | 'password' => 'password' 47 | ] 48 | ], 49 | 50 | /* 51 | |-------------------------------------------------------------------------- 52 | | SMPP transport settings 53 | |-------------------------------------------------------------------------- 54 | | 55 | | For all SMPP errors listed in "transport.catchables", exceptions 56 | | thrown by SMPP will be suppressed and just logged. 57 | | 58 | */ 59 | 60 | 'transport' => [ 61 | 'catchables' => [ 62 | SMPP::ESME_RBINDFAIL, 63 | SMPP::ESME_RINVCMDID 64 | ], 65 | 'force_ipv4' => true, 66 | 'debug' => false 67 | ], 68 | 69 | /* 70 | |-------------------------------------------------------------------------- 71 | | SMPP client settings 72 | |-------------------------------------------------------------------------- 73 | */ 74 | 75 | 'client' => [ 76 | 'system_type' => 'default', 77 | 'null_terminate_octetstrings' => false, 78 | 'debug' => false 79 | ] 80 | ]; 81 | -------------------------------------------------------------------------------- /license.txt: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | [![](https://img.shields.io/packagist/dt/franzose/laravel-smpp.svg)](https://packagist.org/packages/franzose/laravel-smpp) 2 | 3 | # Laravel SMPP 4 | This package is a tiny wrapper for the [onlinecity/php-smpp](https://github.com/onlinecity/php-smpp) library. 5 | It provides a basic SMPP interface and implementation for the Laravel framework. 6 | 7 | ## Installation 8 | You can install Laravel SMPP using Composer command: 9 | ```bash 10 | $ composer require franzose/laravel-smpp 11 | ``` 12 | 13 | Then you need to add `LaravelSmpp\LaravelSmppServiceProvider::class` to your providers array in the `config/app.php` 14 | and copy default configuration by invoking `$ php artisan vendor:publish` command. 15 | 16 | ## Usage 17 | 18 | You can use the service pretty straightforward and inject dependency in your controller: 19 | 20 | ```php 21 | smpp->sendOne(1234567890, 'Hi, this SMS was send via SMPP protocol'); 31 | 32 | // Multiple numbers 33 | $this->smpp->sendBulk([1234567890, 0987654321], 'Hi!'); 34 | } 35 | } 36 | ``` 37 | 38 | However it is better to abstract your SMS sending service from the SMPP implementation by defining a SMPP-compatible service interface. 39 | -------------------------------------------------------------------------------- /src/LaravelSmppServiceProvider.php: -------------------------------------------------------------------------------- 1 | loadTranslationsFrom(__DIR__ . '/../lang', 'laravel-smpp'); 23 | $this->publishes([ 24 | __DIR__ . '/../config/laravel-smpp.php' => config_path('laravel-smpp.php'), 25 | ]); 26 | } 27 | 28 | /** 29 | * Register the service provider. 30 | * 31 | * @return void 32 | */ 33 | public function register() 34 | { 35 | $this->app->bind(SmppServiceInterface::class, SmppService::class); 36 | } 37 | } -------------------------------------------------------------------------------- /src/SmppService.php: -------------------------------------------------------------------------------- 1 | config = $config; 65 | $this->providers = $config->get('laravel-smpp.providers', []); 66 | $this->catchables = $config->get('laravel-smpp.transport.catchables', []); 67 | 68 | SmppClient::$csms_method = SmppClient::CSMS_8BIT_UDH; 69 | SmppClient::$system_type = $config->get('laravel-smpp.client.system_type', 'default'); 70 | SmppClient::$sms_null_terminate_octetstrings = $config->get('laravel-smpp.client.null_terminate_octetstrings', false); 71 | SocketTransport::$forceIpv4 = $config->get('laravel-smpp.transport.force_ipv4', true); 72 | SocketTransport::$defaultDebug = $config->get('laravel-smpp.transport.debug', false); 73 | } 74 | 75 | /** 76 | * Send a single SMS. 77 | * 78 | * @param $phone 79 | * @param $message 80 | * 81 | * @return string 82 | * @throws SmppException 83 | */ 84 | public function sendOne($phone, $message) 85 | { 86 | $this->setupSmpp(); 87 | 88 | $id = $this->sendSms($this->getSender(), $phone, $message); 89 | 90 | $this->smpp->close(); 91 | 92 | return $id; 93 | } 94 | 95 | /** 96 | * Send multiple SMSes. 97 | * 98 | * @param array $phones 99 | * @param string|array $message 100 | * 101 | * @return void 102 | * @throws SmppException 103 | */ 104 | public function sendBulk(array $phones, $message) 105 | { 106 | $this->setupSmpp(); 107 | $sender = $this->getSender(); 108 | 109 | foreach ($phones as $idx => $phone) { 110 | try { 111 | $message = (is_array($message) ? $message[$idx] : $message); 112 | 113 | $this->sendSms($sender, $phone, $message); 114 | } catch (Exception $ex) { 115 | $this->alertSendingError($ex, $phone); 116 | } 117 | } 118 | 119 | $this->smpp->close(); 120 | } 121 | 122 | /** 123 | * Alert error occured while sending SMSes. 124 | * 125 | * @param Exception $ex 126 | * @param int $phone 127 | */ 128 | protected function alertSendingError(Exception $ex, $phone) 129 | { 130 | Log::alert(sprintf('SMPP bulk sending error: %s. Exception: %s', $phone, $ex->getMessage())); 131 | } 132 | 133 | /** 134 | * Setup SMPP transport and client. 135 | * 136 | * @return SmppClient 137 | * @throws SmppException 138 | */ 139 | protected function setupSmpp() 140 | { 141 | // Trying all available providers 142 | foreach ($this->providers as $provider => $config) { 143 | $transport = new SocketTransport([$config['host']], $config['port']); 144 | 145 | try { 146 | $transport->setRecvTimeout($config['timeout']); 147 | $smpp = new SmppClient($transport); 148 | $smpp->debug = $this->config->get('laravel-smpp.client.debug', false); 149 | 150 | $transport->open(); 151 | $smpp->bindTransmitter($config['login'], $config['password']); 152 | 153 | $this->smpp = $smpp; 154 | $this->provider = $provider; 155 | 156 | break; 157 | } 158 | // Skipping unavailable 159 | catch (SmppException $ex) { 160 | $transport->close(); 161 | $this->smpp = null; 162 | 163 | if (in_array($ex->getCode(), $this->catchables)) { 164 | continue; 165 | } 166 | 167 | throw $ex; 168 | } 169 | } 170 | } 171 | 172 | /** 173 | * Return sender as SmppAddress. 174 | * 175 | * @return SmppAddress 176 | */ 177 | protected function getSender() 178 | { 179 | return $this->getSmppAddress(); 180 | } 181 | 182 | /** 183 | * Return recipient as SmppAddress. 184 | * 185 | * @param $phone 186 | * 187 | * @return SmppAddress 188 | */ 189 | protected function getRecipient($phone) 190 | { 191 | return $this->getSmppAddress($phone); 192 | } 193 | 194 | /** 195 | * Return an SmppAddress instance based on the given phone. 196 | * 197 | * @param int|null $phone 198 | * 199 | * @return SmppAddress 200 | */ 201 | protected function getSmppAddress($phone = null) 202 | { 203 | if ($phone === null) { 204 | $phone = $this->getConfig('sender'); 205 | $prefix = 'source'; 206 | } else { 207 | $prefix = 'destination'; 208 | } 209 | 210 | return new SmppAddress( 211 | $phone, 212 | hexdec($this->getConfig(sprintf('%s_ton', $prefix))), 213 | hexdec($this->getConfig(sprintf('%s_npi', $prefix))) 214 | ); 215 | } 216 | 217 | /** 218 | * Send SMS via SMPP. 219 | * 220 | * @param SmppAddress $sender 221 | * @param int $recipient 222 | * @param string $message 223 | * 224 | * @return string 225 | */ 226 | protected function sendSms(SmppAddress $sender, $recipient, $message) 227 | { 228 | $message = mb_convert_encoding($message, 'UCS-2', 'utf8'); 229 | 230 | return $this->smpp->sendSMS($sender, $this->getRecipient($recipient), $message, null, SMPP::DATA_CODING_UCS2); 231 | } 232 | 233 | /** 234 | * Return SMPP config item for the current provider. 235 | * 236 | * @param string $option 237 | * 238 | * @return mixed 239 | */ 240 | protected function getConfig($option) 241 | { 242 | $key = $this->provider . '.' . $option; 243 | $default = $this->config->get(sprintf('laravel-smpp.defaults.%s', $option)); 244 | 245 | return Arr::get($this->providers, $key, $default); 246 | } 247 | } 248 | -------------------------------------------------------------------------------- /src/SmppServiceInterface.php: -------------------------------------------------------------------------------- 1 |