├── .gitignore ├── LICENSE ├── README.md ├── composer.json ├── composer.lock ├── config ├── .gitkeep └── MSApplicationInsightsLaravel.php └── src ├── .gitkeep ├── Exceptions ├── InvalidMSInstrumentationKeyException.php └── MSApplicationInsightsException.php ├── Facades ├── MSApplicationInsightsClientFacade.php └── MSApplicationInsightsServerFacade.php ├── Handlers └── MSApplicationInsightsExceptionHandler.php ├── InstrumentationKey.php ├── MSApplicationInsightsClient.php ├── MSApplicationInsightsHelpers.php ├── MSApplicationInsightsServer.php ├── Middleware └── MSApplicationInsightsMiddleware.php └── Providers └── MSApplicationInsightsServiceProvider.php /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | /.idea/ 3 | /vendor/ 4 | composer.phar 5 | 6 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Chris March 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. 22 | 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Microsoft Application Insights for Laravel 5 2 | 3 | A simple Laravel implementation for [Microsoft Application Insights](http://azure.microsoft.com/en-gb/services/application-insights/) 4 | 5 | ## Installation 6 | 7 | Update the `require` section of your application's **composer.json** file: 8 | 9 | ```js 10 | "require": { 11 | ... 12 | "marchie/ms-application-insights-laravel": "^0.2", 13 | ... 14 | } 15 | ``` 16 | 17 | ### Instrumentation Key 18 | 19 | The package will check your application's **.env** file for your *Instrumentation Key*. 20 | 21 | Add the following to your **.env** file: 22 | 23 | ``` 24 | ... 25 | MS_INSTRUMENTATION_KEY= 26 | ... 27 | ``` 28 | 29 | You can find your instrumentation key on the [Microsoft Azure Portal](https://portal.azure.com). 30 | 31 | Navigate to: 32 | 33 | **Microsoft Azure** > **Browse** > **Application Insights** > *(Application Name)* > **Settings** > **Properties** 34 | 35 | ### On Laravel versions without Auto-Discovery (< 5.5): 36 | 37 | #### Service Provider 38 | 39 | Add the service provider to the *providers* array in your application's **config/app.php** file: 40 | 41 | ```php 42 | 'providers' => [ 43 | ... 44 | Marchie\MSApplicationInsightsLaravel\Providers\MSApplicationInsightsServiceProvider::class, 45 | ... 46 | ] 47 | ``` 48 | 49 | #### Facade 50 | 51 | Add the facades to the *aliases* array in your application's **config/app.php** file: 52 | 53 | ```php 54 | 'aliases' => [ 55 | ... 56 | 'AIClient' => Marchie\MSApplicationInsightsLaravel\Facades\MSApplicationInsightsClientFacade::class, 57 | 'AIServer' => Marchie\MSApplicationInsightsLaravel\Facades\MSApplicationInsightsServerFacade::class, 58 | ... 59 | ] 60 | ``` 61 | 62 | ## Usage 63 | 64 | ### Request Tracking Middleware 65 | 66 | To monitor your application's performance with request tracking, add the middleware to your in your application, found in **app/Http/Kernel.php**. It has to be added after the StartSession middleware has been added. 67 | 68 | ```php 69 | 70 | protected $middleware = [ 71 | ... 72 | 'MSApplicationInsightsMiddleware', 73 | ... 74 | ] 75 | 76 | ``` 77 | 78 | The request will send the following additional properties to Application Insights: 79 | 80 | - **ajax** *(boolean)*: *true* if the request is an AJAX request 81 | - **ip** *(string)*: The client's IP address 82 | - **pjax** *(boolean)*: *true* if the request is a PJAX request 83 | - **secure** *(boolean)*: *true* if the request was sent over HTTPS 84 | - **route** *(string)*: The name of the route, if applicable 85 | - **user** *(integer)*: The ID of the logged in user, if applicable 86 | - **referer** *(string)*: The HTTP_REFERER value from the request, if available 87 | 88 | The middleware is also used to estimate the time that a user has spent on a particular page. This is sent as a *trace* event named **browse_duration**. 89 | 90 | ### Exception Handler 91 | 92 | To report exceptions that occur in your application, use the provided exception handler. *Replace* the following line in your application's **app/Handlers/Exception.php** file: 93 | 94 | ```php 95 | ... 96 | 97 | # Delete this line 98 | use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler; 99 | 100 | # Insert this line 101 | use Marchie\MSApplicationInsightsLaravel\Handlers\MSApplicationInsightsExceptionHandler as ExceptionHandler; 102 | 103 | ... 104 | ``` 105 | 106 | The exception handler will send additional properties to Application Insights, as above. 107 | 108 | ### Client Side 109 | 110 | In order to register page view information from the client with Application Insights, simply insert the following code into your Blade views: 111 | 112 | ```php 113 | {!! AIClient::javascript() !!} 114 | ``` 115 | 116 | NOTE: Microsoft recommend that you put the script in the `` section of your pages, in order to calculate the fullest extent of page load time on the client. 117 | 118 | ### Custom 119 | 120 | If you want to use any of the underlying [ApplicationInsights-PHP](https://github.com/Microsoft/ApplicationInsights-PHP) functionality, you can call the methods directly from the server facade: 121 | 122 | ```php 123 | ... 124 | AIServer::trackEvent('Test event'); 125 | AIServer::flush(); 126 | ... 127 | ``` 128 | 129 | See the [ApplicationInsights-PHP](https://github.com/Microsoft/ApplicationInsights-PHP) page for more information on the available methods. 130 | 131 | ## Version History 132 | 133 | ### 0.2.4 134 | - Added try/catch blocks when flushing data to prevent RequestExceptions from killing the application if there is a problem connecting to Application Insights. 135 | 136 | ### 0.2.3 137 | - Corrected dingus mistake! 138 | 139 | ### 0.2.2 140 | - Added additional properties to exceptions 141 | - Removed auto-flushing shutdown function 142 | 143 | ### 0.2.1 144 | - Flush queue on exception (otherwise, if Laravel is daemonized, queue exceptions will not be reported) 145 | 146 | ### 0.2.0 147 | - Server side implementation 148 | 149 | ### 0.1.2 150 | - Correcting silly mistake! 151 | 152 | ### 0.1.1 153 | - Empty key no longer results in an exception being thrown (no JavaScript is inserted into the view) 154 | 155 | ### 0.1.0 156 | - Client-side JavaScript only 157 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "marchie/ms-application-insights-laravel", 3 | "description": "Microsoft Azure Application Insights for Laravel 5", 4 | "license": "MIT", 5 | "keywords": [ 6 | "Laravel", 7 | "Microsoft", 8 | "Azure", 9 | "Application Insights", 10 | "monitoring", 11 | "logging" 12 | ], 13 | "authors": [ 14 | { 15 | "name": "Chris March", 16 | "email": "marchie@marchie.net", 17 | "homepage": "http://www.marchie.net", 18 | "role": "Developer" 19 | } 20 | ], 21 | "require": { 22 | "php": ">=5.4.0", 23 | "laravel/framework": "~6.0", 24 | "microsoft/application-insights": "~0.4" 25 | }, 26 | "autoload": { 27 | "psr-4": { 28 | "Marchie\\MSApplicationInsightsLaravel\\": "src/" 29 | } 30 | }, 31 | "extra": { 32 | "laravel": { 33 | "providers": [ 34 | "Marchie\\MSApplicationInsightsLaravel\\Providers\\MSApplicationInsightsServiceProvider" 35 | ], 36 | "aliases": { 37 | "AIClient": "Marchie\\MSApplicationInsightsLaravel\\Facades\\MSApplicationInsightsClientFacade", 38 | "AIServer": "Marchie\\MSApplicationInsightsLaravel\\Facades\\MSApplicationInsightsServerFacade" 39 | } 40 | } 41 | } 42 | } -------------------------------------------------------------------------------- /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#installing-dependencies", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "bb76fc778a18df4e924b1fcd3a74dd0b", 8 | "packages": [ 9 | { 10 | "name": "doctrine/inflector", 11 | "version": "1.3.1", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/doctrine/inflector.git", 15 | "reference": "ec3a55242203ffa6a4b27c58176da97ff0a7aec1" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/doctrine/inflector/zipball/ec3a55242203ffa6a4b27c58176da97ff0a7aec1", 20 | "reference": "ec3a55242203ffa6a4b27c58176da97ff0a7aec1", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "php": "^7.1" 25 | }, 26 | "require-dev": { 27 | "phpunit/phpunit": "^6.2" 28 | }, 29 | "type": "library", 30 | "extra": { 31 | "branch-alias": { 32 | "dev-master": "1.3.x-dev" 33 | } 34 | }, 35 | "autoload": { 36 | "psr-4": { 37 | "Doctrine\\Common\\Inflector\\": "lib/Doctrine/Common/Inflector" 38 | } 39 | }, 40 | "notification-url": "https://packagist.org/downloads/", 41 | "license": [ 42 | "MIT" 43 | ], 44 | "authors": [ 45 | { 46 | "name": "Guilherme Blanco", 47 | "email": "guilhermeblanco@gmail.com" 48 | }, 49 | { 50 | "name": "Roman Borschel", 51 | "email": "roman@code-factory.org" 52 | }, 53 | { 54 | "name": "Benjamin Eberlei", 55 | "email": "kontakt@beberlei.de" 56 | }, 57 | { 58 | "name": "Jonathan Wage", 59 | "email": "jonwage@gmail.com" 60 | }, 61 | { 62 | "name": "Johannes Schmitt", 63 | "email": "schmittjoh@gmail.com" 64 | } 65 | ], 66 | "description": "Common String Manipulations with regard to casing and singular/plural rules.", 67 | "homepage": "http://www.doctrine-project.org", 68 | "keywords": [ 69 | "inflection", 70 | "pluralize", 71 | "singularize", 72 | "string" 73 | ], 74 | "time": "2019-10-30T19:59:35+00:00" 75 | }, 76 | { 77 | "name": "doctrine/lexer", 78 | "version": "1.2.0", 79 | "source": { 80 | "type": "git", 81 | "url": "https://github.com/doctrine/lexer.git", 82 | "reference": "5242d66dbeb21a30dd8a3e66bf7a73b66e05e1f6" 83 | }, 84 | "dist": { 85 | "type": "zip", 86 | "url": "https://api.github.com/repos/doctrine/lexer/zipball/5242d66dbeb21a30dd8a3e66bf7a73b66e05e1f6", 87 | "reference": "5242d66dbeb21a30dd8a3e66bf7a73b66e05e1f6", 88 | "shasum": "" 89 | }, 90 | "require": { 91 | "php": "^7.2" 92 | }, 93 | "require-dev": { 94 | "doctrine/coding-standard": "^6.0", 95 | "phpstan/phpstan": "^0.11.8", 96 | "phpunit/phpunit": "^8.2" 97 | }, 98 | "type": "library", 99 | "extra": { 100 | "branch-alias": { 101 | "dev-master": "1.2.x-dev" 102 | } 103 | }, 104 | "autoload": { 105 | "psr-4": { 106 | "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" 107 | } 108 | }, 109 | "notification-url": "https://packagist.org/downloads/", 110 | "license": [ 111 | "MIT" 112 | ], 113 | "authors": [ 114 | { 115 | "name": "Guilherme Blanco", 116 | "email": "guilhermeblanco@gmail.com" 117 | }, 118 | { 119 | "name": "Roman Borschel", 120 | "email": "roman@code-factory.org" 121 | }, 122 | { 123 | "name": "Johannes Schmitt", 124 | "email": "schmittjoh@gmail.com" 125 | } 126 | ], 127 | "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", 128 | "homepage": "https://www.doctrine-project.org/projects/lexer.html", 129 | "keywords": [ 130 | "annotations", 131 | "docblock", 132 | "lexer", 133 | "parser", 134 | "php" 135 | ], 136 | "time": "2019-10-30T14:39:59+00:00" 137 | }, 138 | { 139 | "name": "dragonmantank/cron-expression", 140 | "version": "v2.3.0", 141 | "source": { 142 | "type": "git", 143 | "url": "https://github.com/dragonmantank/cron-expression.git", 144 | "reference": "72b6fbf76adb3cf5bc0db68559b33d41219aba27" 145 | }, 146 | "dist": { 147 | "type": "zip", 148 | "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/72b6fbf76adb3cf5bc0db68559b33d41219aba27", 149 | "reference": "72b6fbf76adb3cf5bc0db68559b33d41219aba27", 150 | "shasum": "" 151 | }, 152 | "require": { 153 | "php": "^7.0" 154 | }, 155 | "require-dev": { 156 | "phpunit/phpunit": "^6.4|^7.0" 157 | }, 158 | "type": "library", 159 | "extra": { 160 | "branch-alias": { 161 | "dev-master": "2.3-dev" 162 | } 163 | }, 164 | "autoload": { 165 | "psr-4": { 166 | "Cron\\": "src/Cron/" 167 | } 168 | }, 169 | "notification-url": "https://packagist.org/downloads/", 170 | "license": [ 171 | "MIT" 172 | ], 173 | "authors": [ 174 | { 175 | "name": "Michael Dowling", 176 | "email": "mtdowling@gmail.com", 177 | "homepage": "https://github.com/mtdowling" 178 | }, 179 | { 180 | "name": "Chris Tankersley", 181 | "email": "chris@ctankersley.com", 182 | "homepage": "https://github.com/dragonmantank" 183 | } 184 | ], 185 | "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", 186 | "keywords": [ 187 | "cron", 188 | "schedule" 189 | ], 190 | "time": "2019-03-31T00:38:28+00:00" 191 | }, 192 | { 193 | "name": "egulias/email-validator", 194 | "version": "2.1.17", 195 | "source": { 196 | "type": "git", 197 | "url": "https://github.com/egulias/EmailValidator.git", 198 | "reference": "ade6887fd9bd74177769645ab5c474824f8a418a" 199 | }, 200 | "dist": { 201 | "type": "zip", 202 | "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/ade6887fd9bd74177769645ab5c474824f8a418a", 203 | "reference": "ade6887fd9bd74177769645ab5c474824f8a418a", 204 | "shasum": "" 205 | }, 206 | "require": { 207 | "doctrine/lexer": "^1.0.1", 208 | "php": ">=5.5", 209 | "symfony/polyfill-intl-idn": "^1.10" 210 | }, 211 | "require-dev": { 212 | "dominicsayers/isemail": "^3.0.7", 213 | "phpunit/phpunit": "^4.8.36|^7.5.15", 214 | "satooshi/php-coveralls": "^1.0.1" 215 | }, 216 | "suggest": { 217 | "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" 218 | }, 219 | "type": "library", 220 | "extra": { 221 | "branch-alias": { 222 | "dev-master": "2.1.x-dev" 223 | } 224 | }, 225 | "autoload": { 226 | "psr-4": { 227 | "Egulias\\EmailValidator\\": "EmailValidator" 228 | } 229 | }, 230 | "notification-url": "https://packagist.org/downloads/", 231 | "license": [ 232 | "MIT" 233 | ], 234 | "authors": [ 235 | { 236 | "name": "Eduardo Gulias Davis" 237 | } 238 | ], 239 | "description": "A library for validating emails against several RFCs", 240 | "homepage": "https://github.com/egulias/EmailValidator", 241 | "keywords": [ 242 | "email", 243 | "emailvalidation", 244 | "emailvalidator", 245 | "validation", 246 | "validator" 247 | ], 248 | "time": "2020-02-13T22:36:52+00:00" 249 | }, 250 | { 251 | "name": "guzzlehttp/guzzle", 252 | "version": "6.3.3", 253 | "source": { 254 | "type": "git", 255 | "url": "https://github.com/guzzle/guzzle.git", 256 | "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba" 257 | }, 258 | "dist": { 259 | "type": "zip", 260 | "url": "https://api.github.com/repos/guzzle/guzzle/zipball/407b0cb880ace85c9b63c5f9551db498cb2d50ba", 261 | "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba", 262 | "shasum": "" 263 | }, 264 | "require": { 265 | "guzzlehttp/promises": "^1.0", 266 | "guzzlehttp/psr7": "^1.4", 267 | "php": ">=5.5" 268 | }, 269 | "require-dev": { 270 | "ext-curl": "*", 271 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", 272 | "psr/log": "^1.0" 273 | }, 274 | "suggest": { 275 | "psr/log": "Required for using the Log middleware" 276 | }, 277 | "type": "library", 278 | "extra": { 279 | "branch-alias": { 280 | "dev-master": "6.3-dev" 281 | } 282 | }, 283 | "autoload": { 284 | "files": [ 285 | "src/functions_include.php" 286 | ], 287 | "psr-4": { 288 | "GuzzleHttp\\": "src/" 289 | } 290 | }, 291 | "notification-url": "https://packagist.org/downloads/", 292 | "license": [ 293 | "MIT" 294 | ], 295 | "authors": [ 296 | { 297 | "name": "Michael Dowling", 298 | "email": "mtdowling@gmail.com", 299 | "homepage": "https://github.com/mtdowling" 300 | } 301 | ], 302 | "description": "Guzzle is a PHP HTTP client library", 303 | "homepage": "http://guzzlephp.org/", 304 | "keywords": [ 305 | "client", 306 | "curl", 307 | "framework", 308 | "http", 309 | "http client", 310 | "rest", 311 | "web service" 312 | ], 313 | "time": "2018-04-22T15:46:56+00:00" 314 | }, 315 | { 316 | "name": "guzzlehttp/promises", 317 | "version": "v1.3.1", 318 | "source": { 319 | "type": "git", 320 | "url": "https://github.com/guzzle/promises.git", 321 | "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646" 322 | }, 323 | "dist": { 324 | "type": "zip", 325 | "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646", 326 | "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646", 327 | "shasum": "" 328 | }, 329 | "require": { 330 | "php": ">=5.5.0" 331 | }, 332 | "require-dev": { 333 | "phpunit/phpunit": "^4.0" 334 | }, 335 | "type": "library", 336 | "extra": { 337 | "branch-alias": { 338 | "dev-master": "1.4-dev" 339 | } 340 | }, 341 | "autoload": { 342 | "psr-4": { 343 | "GuzzleHttp\\Promise\\": "src/" 344 | }, 345 | "files": [ 346 | "src/functions_include.php" 347 | ] 348 | }, 349 | "notification-url": "https://packagist.org/downloads/", 350 | "license": [ 351 | "MIT" 352 | ], 353 | "authors": [ 354 | { 355 | "name": "Michael Dowling", 356 | "email": "mtdowling@gmail.com", 357 | "homepage": "https://github.com/mtdowling" 358 | } 359 | ], 360 | "description": "Guzzle promises library", 361 | "keywords": [ 362 | "promise" 363 | ], 364 | "time": "2016-12-20T10:07:11+00:00" 365 | }, 366 | { 367 | "name": "guzzlehttp/psr7", 368 | "version": "1.6.1", 369 | "source": { 370 | "type": "git", 371 | "url": "https://github.com/guzzle/psr7.git", 372 | "reference": "239400de7a173fe9901b9ac7c06497751f00727a" 373 | }, 374 | "dist": { 375 | "type": "zip", 376 | "url": "https://api.github.com/repos/guzzle/psr7/zipball/239400de7a173fe9901b9ac7c06497751f00727a", 377 | "reference": "239400de7a173fe9901b9ac7c06497751f00727a", 378 | "shasum": "" 379 | }, 380 | "require": { 381 | "php": ">=5.4.0", 382 | "psr/http-message": "~1.0", 383 | "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" 384 | }, 385 | "provide": { 386 | "psr/http-message-implementation": "1.0" 387 | }, 388 | "require-dev": { 389 | "ext-zlib": "*", 390 | "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8" 391 | }, 392 | "suggest": { 393 | "zendframework/zend-httphandlerrunner": "Emit PSR-7 responses" 394 | }, 395 | "type": "library", 396 | "extra": { 397 | "branch-alias": { 398 | "dev-master": "1.6-dev" 399 | } 400 | }, 401 | "autoload": { 402 | "psr-4": { 403 | "GuzzleHttp\\Psr7\\": "src/" 404 | }, 405 | "files": [ 406 | "src/functions_include.php" 407 | ] 408 | }, 409 | "notification-url": "https://packagist.org/downloads/", 410 | "license": [ 411 | "MIT" 412 | ], 413 | "authors": [ 414 | { 415 | "name": "Michael Dowling", 416 | "email": "mtdowling@gmail.com", 417 | "homepage": "https://github.com/mtdowling" 418 | }, 419 | { 420 | "name": "Tobias Schultze", 421 | "homepage": "https://github.com/Tobion" 422 | } 423 | ], 424 | "description": "PSR-7 message implementation that also provides common utility methods", 425 | "keywords": [ 426 | "http", 427 | "message", 428 | "psr-7", 429 | "request", 430 | "response", 431 | "stream", 432 | "uri", 433 | "url" 434 | ], 435 | "time": "2019-07-01T23:21:34+00:00" 436 | }, 437 | { 438 | "name": "laravel/framework", 439 | "version": "v6.15.1", 440 | "source": { 441 | "type": "git", 442 | "url": "https://github.com/laravel/framework.git", 443 | "reference": "b7c152e3327c03428fb68d5abb63ca8b3eca8422" 444 | }, 445 | "dist": { 446 | "type": "zip", 447 | "url": "https://api.github.com/repos/laravel/framework/zipball/b7c152e3327c03428fb68d5abb63ca8b3eca8422", 448 | "reference": "b7c152e3327c03428fb68d5abb63ca8b3eca8422", 449 | "shasum": "" 450 | }, 451 | "require": { 452 | "doctrine/inflector": "^1.1", 453 | "dragonmantank/cron-expression": "^2.0", 454 | "egulias/email-validator": "^2.1.10", 455 | "ext-json": "*", 456 | "ext-mbstring": "*", 457 | "ext-openssl": "*", 458 | "league/commonmark": "^1.3", 459 | "league/flysystem": "^1.0.8", 460 | "monolog/monolog": "^1.12|^2.0", 461 | "nesbot/carbon": "^2.0", 462 | "opis/closure": "^3.1", 463 | "php": "^7.2", 464 | "psr/container": "^1.0", 465 | "psr/simple-cache": "^1.0", 466 | "ramsey/uuid": "^3.7", 467 | "swiftmailer/swiftmailer": "^6.0", 468 | "symfony/console": "^4.3.4", 469 | "symfony/debug": "^4.3.4", 470 | "symfony/finder": "^4.3.4", 471 | "symfony/http-foundation": "^4.3.4", 472 | "symfony/http-kernel": "^4.3.4", 473 | "symfony/process": "^4.3.4", 474 | "symfony/routing": "^4.3.4", 475 | "symfony/var-dumper": "^4.3.4", 476 | "tijsverkoyen/css-to-inline-styles": "^2.2.1", 477 | "vlucas/phpdotenv": "^3.3" 478 | }, 479 | "conflict": { 480 | "tightenco/collect": "<5.5.33" 481 | }, 482 | "replace": { 483 | "illuminate/auth": "self.version", 484 | "illuminate/broadcasting": "self.version", 485 | "illuminate/bus": "self.version", 486 | "illuminate/cache": "self.version", 487 | "illuminate/config": "self.version", 488 | "illuminate/console": "self.version", 489 | "illuminate/container": "self.version", 490 | "illuminate/contracts": "self.version", 491 | "illuminate/cookie": "self.version", 492 | "illuminate/database": "self.version", 493 | "illuminate/encryption": "self.version", 494 | "illuminate/events": "self.version", 495 | "illuminate/filesystem": "self.version", 496 | "illuminate/hashing": "self.version", 497 | "illuminate/http": "self.version", 498 | "illuminate/log": "self.version", 499 | "illuminate/mail": "self.version", 500 | "illuminate/notifications": "self.version", 501 | "illuminate/pagination": "self.version", 502 | "illuminate/pipeline": "self.version", 503 | "illuminate/queue": "self.version", 504 | "illuminate/redis": "self.version", 505 | "illuminate/routing": "self.version", 506 | "illuminate/session": "self.version", 507 | "illuminate/support": "self.version", 508 | "illuminate/translation": "self.version", 509 | "illuminate/validation": "self.version", 510 | "illuminate/view": "self.version" 511 | }, 512 | "require-dev": { 513 | "aws/aws-sdk-php": "^3.0", 514 | "doctrine/dbal": "^2.6", 515 | "filp/whoops": "^2.4", 516 | "guzzlehttp/guzzle": "^6.3", 517 | "league/flysystem-cached-adapter": "^1.0", 518 | "mockery/mockery": "^1.3.1", 519 | "moontoast/math": "^1.1", 520 | "orchestra/testbench-core": "^4.0", 521 | "pda/pheanstalk": "^4.0", 522 | "phpunit/phpunit": "^7.5.15|^8.4|^9.0", 523 | "predis/predis": "^1.1.1", 524 | "symfony/cache": "^4.3.4" 525 | }, 526 | "suggest": { 527 | "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage and SES mail driver (^3.0).", 528 | "doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.6).", 529 | "ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image().", 530 | "ext-memcached": "Required to use the memcache cache driver.", 531 | "ext-pcntl": "Required to use all features of the queue worker.", 532 | "ext-posix": "Required to use all features of the queue worker.", 533 | "ext-redis": "Required to use the Redis cache and queue drivers.", 534 | "filp/whoops": "Required for friendly error pages in development (^2.4).", 535 | "fzaninotto/faker": "Required to use the eloquent factory builder (^1.9.1).", 536 | "guzzlehttp/guzzle": "Required to use the Mailgun mail driver and the ping methods on schedules (^6.0).", 537 | "laravel/tinker": "Required to use the tinker console command (^2.0).", 538 | "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^1.0).", 539 | "league/flysystem-cached-adapter": "Required to use the Flysystem cache (^1.0).", 540 | "league/flysystem-sftp": "Required to use the Flysystem SFTP driver (^1.0).", 541 | "moontoast/math": "Required to use ordered UUIDs (^1.1).", 542 | "nyholm/psr7": "Required to use PSR-7 bridging features (^1.2).", 543 | "pda/pheanstalk": "Required to use the beanstalk queue driver (^4.0).", 544 | "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", 545 | "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^4.0).", 546 | "symfony/cache": "Required to PSR-6 cache bridge (^4.3.4).", 547 | "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^1.2).", 548 | "wildbit/swiftmailer-postmark": "Required to use Postmark mail driver (^3.0)." 549 | }, 550 | "type": "library", 551 | "extra": { 552 | "branch-alias": { 553 | "dev-master": "6.x-dev" 554 | } 555 | }, 556 | "autoload": { 557 | "files": [ 558 | "src/Illuminate/Foundation/helpers.php", 559 | "src/Illuminate/Support/helpers.php" 560 | ], 561 | "psr-4": { 562 | "Illuminate\\": "src/Illuminate/" 563 | } 564 | }, 565 | "notification-url": "https://packagist.org/downloads/", 566 | "license": [ 567 | "MIT" 568 | ], 569 | "authors": [ 570 | { 571 | "name": "Taylor Otwell", 572 | "email": "taylor@laravel.com" 573 | } 574 | ], 575 | "description": "The Laravel Framework.", 576 | "homepage": "https://laravel.com", 577 | "keywords": [ 578 | "framework", 579 | "laravel" 580 | ], 581 | "time": "2020-02-12T21:56:14+00:00" 582 | }, 583 | { 584 | "name": "league/commonmark", 585 | "version": "1.3.0", 586 | "source": { 587 | "type": "git", 588 | "url": "https://github.com/thephpleague/commonmark.git", 589 | "reference": "4f30be7a2cbf3bfa5788abab71384713e48f451f" 590 | }, 591 | "dist": { 592 | "type": "zip", 593 | "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/4f30be7a2cbf3bfa5788abab71384713e48f451f", 594 | "reference": "4f30be7a2cbf3bfa5788abab71384713e48f451f", 595 | "shasum": "" 596 | }, 597 | "require": { 598 | "ext-mbstring": "*", 599 | "php": "^7.1" 600 | }, 601 | "conflict": { 602 | "scrutinizer/ocular": "1.7.*" 603 | }, 604 | "require-dev": { 605 | "cebe/markdown": "~1.0", 606 | "commonmark/commonmark.js": "0.29.1", 607 | "erusev/parsedown": "~1.0", 608 | "ext-json": "*", 609 | "github/gfm": "0.29.0", 610 | "michelf/php-markdown": "~1.4", 611 | "mikehaertl/php-shellcommand": "^1.4", 612 | "phpstan/phpstan-shim": "^0.11.5", 613 | "phpunit/phpunit": "^7.5", 614 | "scrutinizer/ocular": "^1.5", 615 | "symfony/finder": "^4.2" 616 | }, 617 | "bin": [ 618 | "bin/commonmark" 619 | ], 620 | "type": "library", 621 | "extra": { 622 | "branch-alias": { 623 | "dev-master": "1.4-dev" 624 | } 625 | }, 626 | "autoload": { 627 | "psr-4": { 628 | "League\\CommonMark\\": "src" 629 | } 630 | }, 631 | "notification-url": "https://packagist.org/downloads/", 632 | "license": [ 633 | "BSD-3-Clause" 634 | ], 635 | "authors": [ 636 | { 637 | "name": "Colin O'Dell", 638 | "email": "colinodell@gmail.com", 639 | "homepage": "https://www.colinodell.com", 640 | "role": "Lead Developer" 641 | } 642 | ], 643 | "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and Github-Flavored Markdown (GFM)", 644 | "homepage": "https://commonmark.thephpleague.com", 645 | "keywords": [ 646 | "commonmark", 647 | "flavored", 648 | "gfm", 649 | "github", 650 | "github-flavored", 651 | "markdown", 652 | "md", 653 | "parser" 654 | ], 655 | "time": "2020-02-08T23:42:03+00:00" 656 | }, 657 | { 658 | "name": "league/flysystem", 659 | "version": "1.0.64", 660 | "source": { 661 | "type": "git", 662 | "url": "https://github.com/thephpleague/flysystem.git", 663 | "reference": "d13c43dbd4b791f815215959105a008515d1a2e0" 664 | }, 665 | "dist": { 666 | "type": "zip", 667 | "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/d13c43dbd4b791f815215959105a008515d1a2e0", 668 | "reference": "d13c43dbd4b791f815215959105a008515d1a2e0", 669 | "shasum": "" 670 | }, 671 | "require": { 672 | "ext-fileinfo": "*", 673 | "php": ">=5.5.9" 674 | }, 675 | "conflict": { 676 | "league/flysystem-sftp": "<1.0.6" 677 | }, 678 | "require-dev": { 679 | "phpspec/phpspec": "^3.4", 680 | "phpunit/phpunit": "^5.7.26" 681 | }, 682 | "suggest": { 683 | "ext-fileinfo": "Required for MimeType", 684 | "ext-ftp": "Allows you to use FTP server storage", 685 | "ext-openssl": "Allows you to use FTPS server storage", 686 | "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2", 687 | "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3", 688 | "league/flysystem-azure": "Allows you to use Windows Azure Blob storage", 689 | "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching", 690 | "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem", 691 | "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files", 692 | "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib", 693 | "league/flysystem-webdav": "Allows you to use WebDAV storage", 694 | "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter", 695 | "spatie/flysystem-dropbox": "Allows you to use Dropbox storage", 696 | "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications" 697 | }, 698 | "type": "library", 699 | "extra": { 700 | "branch-alias": { 701 | "dev-master": "1.1-dev" 702 | } 703 | }, 704 | "autoload": { 705 | "psr-4": { 706 | "League\\Flysystem\\": "src/" 707 | } 708 | }, 709 | "notification-url": "https://packagist.org/downloads/", 710 | "license": [ 711 | "MIT" 712 | ], 713 | "authors": [ 714 | { 715 | "name": "Frank de Jonge", 716 | "email": "info@frenky.net" 717 | } 718 | ], 719 | "description": "Filesystem abstraction: Many filesystems, one API.", 720 | "keywords": [ 721 | "Cloud Files", 722 | "WebDAV", 723 | "abstraction", 724 | "aws", 725 | "cloud", 726 | "copy.com", 727 | "dropbox", 728 | "file systems", 729 | "files", 730 | "filesystem", 731 | "filesystems", 732 | "ftp", 733 | "rackspace", 734 | "remote", 735 | "s3", 736 | "sftp", 737 | "storage" 738 | ], 739 | "time": "2020-02-05T18:14:17+00:00" 740 | }, 741 | { 742 | "name": "microsoft/application-insights", 743 | "version": "0.4.5", 744 | "source": { 745 | "type": "git", 746 | "url": "https://github.com/Microsoft/ApplicationInsights-PHP.git", 747 | "reference": "9c6cf3a67b9f79dc2a7204309579fbb2f4d800aa" 748 | }, 749 | "dist": { 750 | "type": "zip", 751 | "url": "https://api.github.com/repos/Microsoft/ApplicationInsights-PHP/zipball/9c6cf3a67b9f79dc2a7204309579fbb2f4d800aa", 752 | "reference": "9c6cf3a67b9f79dc2a7204309579fbb2f4d800aa", 753 | "shasum": "" 754 | }, 755 | "require": { 756 | "guzzlehttp/guzzle": ">=5.0 <=6.3.3", 757 | "php": ">=5.4.0" 758 | }, 759 | "require-dev": { 760 | "evert/phpdoc-md": "~0.0.7", 761 | "phpunit/phpunit": "~4.8.36" 762 | }, 763 | "type": "library", 764 | "autoload": { 765 | "psr-4": { 766 | "ApplicationInsights\\": "ApplicationInsights/" 767 | } 768 | }, 769 | "notification-url": "https://packagist.org/downloads/", 770 | "license": [ 771 | "MIT" 772 | ], 773 | "description": "This project extends the Application Insights API surface to support PHP.", 774 | "homepage": "https://github.com/Microsoft/ApplicationInsights-PHP", 775 | "keywords": [ 776 | "Insights", 777 | "log", 778 | "logging", 779 | "monitoring", 780 | "telemetry" 781 | ], 782 | "abandoned": true, 783 | "time": "2019-04-26T05:48:58+00:00" 784 | }, 785 | { 786 | "name": "monolog/monolog", 787 | "version": "2.0.2", 788 | "source": { 789 | "type": "git", 790 | "url": "https://github.com/Seldaek/monolog.git", 791 | "reference": "c861fcba2ca29404dc9e617eedd9eff4616986b8" 792 | }, 793 | "dist": { 794 | "type": "zip", 795 | "url": "https://api.github.com/repos/Seldaek/monolog/zipball/c861fcba2ca29404dc9e617eedd9eff4616986b8", 796 | "reference": "c861fcba2ca29404dc9e617eedd9eff4616986b8", 797 | "shasum": "" 798 | }, 799 | "require": { 800 | "php": "^7.2", 801 | "psr/log": "^1.0.1" 802 | }, 803 | "provide": { 804 | "psr/log-implementation": "1.0.0" 805 | }, 806 | "require-dev": { 807 | "aws/aws-sdk-php": "^2.4.9 || ^3.0", 808 | "doctrine/couchdb": "~1.0@dev", 809 | "elasticsearch/elasticsearch": "^6.0", 810 | "graylog2/gelf-php": "^1.4.2", 811 | "jakub-onderka/php-parallel-lint": "^0.9", 812 | "php-amqplib/php-amqplib": "~2.4", 813 | "php-console/php-console": "^3.1.3", 814 | "phpspec/prophecy": "^1.6.1", 815 | "phpunit/phpunit": "^8.3", 816 | "predis/predis": "^1.1", 817 | "rollbar/rollbar": "^1.3", 818 | "ruflin/elastica": ">=0.90 <3.0", 819 | "swiftmailer/swiftmailer": "^5.3|^6.0" 820 | }, 821 | "suggest": { 822 | "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", 823 | "doctrine/couchdb": "Allow sending log messages to a CouchDB server", 824 | "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", 825 | "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", 826 | "ext-mbstring": "Allow to work properly with unicode symbols", 827 | "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", 828 | "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", 829 | "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", 830 | "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", 831 | "php-console/php-console": "Allow sending log messages to Google Chrome", 832 | "rollbar/rollbar": "Allow sending log messages to Rollbar", 833 | "ruflin/elastica": "Allow sending log messages to an Elastic Search server" 834 | }, 835 | "type": "library", 836 | "extra": { 837 | "branch-alias": { 838 | "dev-master": "2.x-dev" 839 | } 840 | }, 841 | "autoload": { 842 | "psr-4": { 843 | "Monolog\\": "src/Monolog" 844 | } 845 | }, 846 | "notification-url": "https://packagist.org/downloads/", 847 | "license": [ 848 | "MIT" 849 | ], 850 | "authors": [ 851 | { 852 | "name": "Jordi Boggiano", 853 | "email": "j.boggiano@seld.be", 854 | "homepage": "http://seld.be" 855 | } 856 | ], 857 | "description": "Sends your logs to files, sockets, inboxes, databases and various web services", 858 | "homepage": "http://github.com/Seldaek/monolog", 859 | "keywords": [ 860 | "log", 861 | "logging", 862 | "psr-3" 863 | ], 864 | "time": "2019-12-20T14:22:59+00:00" 865 | }, 866 | { 867 | "name": "nesbot/carbon", 868 | "version": "2.30.0", 869 | "source": { 870 | "type": "git", 871 | "url": "https://github.com/briannesbitt/Carbon.git", 872 | "reference": "912dff66d2690ca66abddb9b291a1df5f371d3b4" 873 | }, 874 | "dist": { 875 | "type": "zip", 876 | "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/912dff66d2690ca66abddb9b291a1df5f371d3b4", 877 | "reference": "912dff66d2690ca66abddb9b291a1df5f371d3b4", 878 | "shasum": "" 879 | }, 880 | "require": { 881 | "ext-json": "*", 882 | "php": "^7.1.8 || ^8.0", 883 | "symfony/translation": "^3.4 || ^4.0 || ^5.0" 884 | }, 885 | "require-dev": { 886 | "friendsofphp/php-cs-fixer": "^2.14 || ^3.0", 887 | "kylekatarnls/multi-tester": "^1.1", 888 | "phpmd/phpmd": "^2.8", 889 | "phpstan/phpstan": "^0.11", 890 | "phpunit/phpunit": "^7.5 || ^8.0", 891 | "squizlabs/php_codesniffer": "^3.4" 892 | }, 893 | "bin": [ 894 | "bin/carbon" 895 | ], 896 | "type": "library", 897 | "extra": { 898 | "branch-alias": { 899 | "dev-master": "2.x-dev" 900 | }, 901 | "laravel": { 902 | "providers": [ 903 | "Carbon\\Laravel\\ServiceProvider" 904 | ] 905 | } 906 | }, 907 | "autoload": { 908 | "psr-4": { 909 | "Carbon\\": "src/Carbon/" 910 | } 911 | }, 912 | "notification-url": "https://packagist.org/downloads/", 913 | "license": [ 914 | "MIT" 915 | ], 916 | "authors": [ 917 | { 918 | "name": "Brian Nesbitt", 919 | "email": "brian@nesbot.com", 920 | "homepage": "http://nesbot.com" 921 | }, 922 | { 923 | "name": "kylekatarnls", 924 | "homepage": "http://github.com/kylekatarnls" 925 | } 926 | ], 927 | "description": "An API extension for DateTime that supports 281 different languages.", 928 | "homepage": "http://carbon.nesbot.com", 929 | "keywords": [ 930 | "date", 931 | "datetime", 932 | "time" 933 | ], 934 | "time": "2020-02-07T15:25:46+00:00" 935 | }, 936 | { 937 | "name": "opis/closure", 938 | "version": "3.5.1", 939 | "source": { 940 | "type": "git", 941 | "url": "https://github.com/opis/closure.git", 942 | "reference": "93ebc5712cdad8d5f489b500c59d122df2e53969" 943 | }, 944 | "dist": { 945 | "type": "zip", 946 | "url": "https://api.github.com/repos/opis/closure/zipball/93ebc5712cdad8d5f489b500c59d122df2e53969", 947 | "reference": "93ebc5712cdad8d5f489b500c59d122df2e53969", 948 | "shasum": "" 949 | }, 950 | "require": { 951 | "php": "^5.4 || ^7.0" 952 | }, 953 | "require-dev": { 954 | "jeremeamia/superclosure": "^2.0", 955 | "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" 956 | }, 957 | "type": "library", 958 | "extra": { 959 | "branch-alias": { 960 | "dev-master": "3.5.x-dev" 961 | } 962 | }, 963 | "autoload": { 964 | "psr-4": { 965 | "Opis\\Closure\\": "src/" 966 | }, 967 | "files": [ 968 | "functions.php" 969 | ] 970 | }, 971 | "notification-url": "https://packagist.org/downloads/", 972 | "license": [ 973 | "MIT" 974 | ], 975 | "authors": [ 976 | { 977 | "name": "Marius Sarca", 978 | "email": "marius.sarca@gmail.com" 979 | }, 980 | { 981 | "name": "Sorin Sarca", 982 | "email": "sarca_sorin@hotmail.com" 983 | } 984 | ], 985 | "description": "A library that can be used to serialize closures (anonymous functions) and arbitrary objects.", 986 | "homepage": "https://opis.io/closure", 987 | "keywords": [ 988 | "anonymous functions", 989 | "closure", 990 | "function", 991 | "serializable", 992 | "serialization", 993 | "serialize" 994 | ], 995 | "time": "2019-11-29T22:36:02+00:00" 996 | }, 997 | { 998 | "name": "paragonie/random_compat", 999 | "version": "v9.99.99", 1000 | "source": { 1001 | "type": "git", 1002 | "url": "https://github.com/paragonie/random_compat.git", 1003 | "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95" 1004 | }, 1005 | "dist": { 1006 | "type": "zip", 1007 | "url": "https://api.github.com/repos/paragonie/random_compat/zipball/84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", 1008 | "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", 1009 | "shasum": "" 1010 | }, 1011 | "require": { 1012 | "php": "^7" 1013 | }, 1014 | "require-dev": { 1015 | "phpunit/phpunit": "4.*|5.*", 1016 | "vimeo/psalm": "^1" 1017 | }, 1018 | "suggest": { 1019 | "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." 1020 | }, 1021 | "type": "library", 1022 | "notification-url": "https://packagist.org/downloads/", 1023 | "license": [ 1024 | "MIT" 1025 | ], 1026 | "authors": [ 1027 | { 1028 | "name": "Paragon Initiative Enterprises", 1029 | "email": "security@paragonie.com", 1030 | "homepage": "https://paragonie.com" 1031 | } 1032 | ], 1033 | "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", 1034 | "keywords": [ 1035 | "csprng", 1036 | "polyfill", 1037 | "pseudorandom", 1038 | "random" 1039 | ], 1040 | "time": "2018-07-02T15:55:56+00:00" 1041 | }, 1042 | { 1043 | "name": "phpoption/phpoption", 1044 | "version": "1.7.2", 1045 | "source": { 1046 | "type": "git", 1047 | "url": "https://github.com/schmittjoh/php-option.git", 1048 | "reference": "77f7c4d2e65413aff5b5a8cc8b3caf7a28d81959" 1049 | }, 1050 | "dist": { 1051 | "type": "zip", 1052 | "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/77f7c4d2e65413aff5b5a8cc8b3caf7a28d81959", 1053 | "reference": "77f7c4d2e65413aff5b5a8cc8b3caf7a28d81959", 1054 | "shasum": "" 1055 | }, 1056 | "require": { 1057 | "php": "^5.5.9 || ^7.0" 1058 | }, 1059 | "require-dev": { 1060 | "bamarni/composer-bin-plugin": "^1.3", 1061 | "phpunit/phpunit": "^4.8.35 || ^5.0 || ^6.0 || ^7.0" 1062 | }, 1063 | "type": "library", 1064 | "extra": { 1065 | "branch-alias": { 1066 | "dev-master": "1.7-dev" 1067 | } 1068 | }, 1069 | "autoload": { 1070 | "psr-4": { 1071 | "PhpOption\\": "src/PhpOption/" 1072 | } 1073 | }, 1074 | "notification-url": "https://packagist.org/downloads/", 1075 | "license": [ 1076 | "Apache-2.0" 1077 | ], 1078 | "authors": [ 1079 | { 1080 | "name": "Johannes M. Schmitt", 1081 | "email": "schmittjoh@gmail.com" 1082 | }, 1083 | { 1084 | "name": "Graham Campbell", 1085 | "email": "graham@alt-three.com" 1086 | } 1087 | ], 1088 | "description": "Option Type for PHP", 1089 | "keywords": [ 1090 | "language", 1091 | "option", 1092 | "php", 1093 | "type" 1094 | ], 1095 | "time": "2019-12-15T19:35:24+00:00" 1096 | }, 1097 | { 1098 | "name": "psr/container", 1099 | "version": "1.0.0", 1100 | "source": { 1101 | "type": "git", 1102 | "url": "https://github.com/php-fig/container.git", 1103 | "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" 1104 | }, 1105 | "dist": { 1106 | "type": "zip", 1107 | "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", 1108 | "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", 1109 | "shasum": "" 1110 | }, 1111 | "require": { 1112 | "php": ">=5.3.0" 1113 | }, 1114 | "type": "library", 1115 | "extra": { 1116 | "branch-alias": { 1117 | "dev-master": "1.0.x-dev" 1118 | } 1119 | }, 1120 | "autoload": { 1121 | "psr-4": { 1122 | "Psr\\Container\\": "src/" 1123 | } 1124 | }, 1125 | "notification-url": "https://packagist.org/downloads/", 1126 | "license": [ 1127 | "MIT" 1128 | ], 1129 | "authors": [ 1130 | { 1131 | "name": "PHP-FIG", 1132 | "homepage": "http://www.php-fig.org/" 1133 | } 1134 | ], 1135 | "description": "Common Container Interface (PHP FIG PSR-11)", 1136 | "homepage": "https://github.com/php-fig/container", 1137 | "keywords": [ 1138 | "PSR-11", 1139 | "container", 1140 | "container-interface", 1141 | "container-interop", 1142 | "psr" 1143 | ], 1144 | "time": "2017-02-14T16:28:37+00:00" 1145 | }, 1146 | { 1147 | "name": "psr/http-message", 1148 | "version": "1.0.1", 1149 | "source": { 1150 | "type": "git", 1151 | "url": "https://github.com/php-fig/http-message.git", 1152 | "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" 1153 | }, 1154 | "dist": { 1155 | "type": "zip", 1156 | "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", 1157 | "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", 1158 | "shasum": "" 1159 | }, 1160 | "require": { 1161 | "php": ">=5.3.0" 1162 | }, 1163 | "type": "library", 1164 | "extra": { 1165 | "branch-alias": { 1166 | "dev-master": "1.0.x-dev" 1167 | } 1168 | }, 1169 | "autoload": { 1170 | "psr-4": { 1171 | "Psr\\Http\\Message\\": "src/" 1172 | } 1173 | }, 1174 | "notification-url": "https://packagist.org/downloads/", 1175 | "license": [ 1176 | "MIT" 1177 | ], 1178 | "authors": [ 1179 | { 1180 | "name": "PHP-FIG", 1181 | "homepage": "http://www.php-fig.org/" 1182 | } 1183 | ], 1184 | "description": "Common interface for HTTP messages", 1185 | "homepage": "https://github.com/php-fig/http-message", 1186 | "keywords": [ 1187 | "http", 1188 | "http-message", 1189 | "psr", 1190 | "psr-7", 1191 | "request", 1192 | "response" 1193 | ], 1194 | "time": "2016-08-06T14:39:51+00:00" 1195 | }, 1196 | { 1197 | "name": "psr/log", 1198 | "version": "1.1.3", 1199 | "source": { 1200 | "type": "git", 1201 | "url": "https://github.com/php-fig/log.git", 1202 | "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" 1203 | }, 1204 | "dist": { 1205 | "type": "zip", 1206 | "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", 1207 | "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", 1208 | "shasum": "" 1209 | }, 1210 | "require": { 1211 | "php": ">=5.3.0" 1212 | }, 1213 | "type": "library", 1214 | "extra": { 1215 | "branch-alias": { 1216 | "dev-master": "1.1.x-dev" 1217 | } 1218 | }, 1219 | "autoload": { 1220 | "psr-4": { 1221 | "Psr\\Log\\": "Psr/Log/" 1222 | } 1223 | }, 1224 | "notification-url": "https://packagist.org/downloads/", 1225 | "license": [ 1226 | "MIT" 1227 | ], 1228 | "authors": [ 1229 | { 1230 | "name": "PHP-FIG", 1231 | "homepage": "http://www.php-fig.org/" 1232 | } 1233 | ], 1234 | "description": "Common interface for logging libraries", 1235 | "homepage": "https://github.com/php-fig/log", 1236 | "keywords": [ 1237 | "log", 1238 | "psr", 1239 | "psr-3" 1240 | ], 1241 | "time": "2020-03-23T09:12:05+00:00" 1242 | }, 1243 | { 1244 | "name": "psr/simple-cache", 1245 | "version": "1.0.1", 1246 | "source": { 1247 | "type": "git", 1248 | "url": "https://github.com/php-fig/simple-cache.git", 1249 | "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" 1250 | }, 1251 | "dist": { 1252 | "type": "zip", 1253 | "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", 1254 | "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", 1255 | "shasum": "" 1256 | }, 1257 | "require": { 1258 | "php": ">=5.3.0" 1259 | }, 1260 | "type": "library", 1261 | "extra": { 1262 | "branch-alias": { 1263 | "dev-master": "1.0.x-dev" 1264 | } 1265 | }, 1266 | "autoload": { 1267 | "psr-4": { 1268 | "Psr\\SimpleCache\\": "src/" 1269 | } 1270 | }, 1271 | "notification-url": "https://packagist.org/downloads/", 1272 | "license": [ 1273 | "MIT" 1274 | ], 1275 | "authors": [ 1276 | { 1277 | "name": "PHP-FIG", 1278 | "homepage": "http://www.php-fig.org/" 1279 | } 1280 | ], 1281 | "description": "Common interfaces for simple caching", 1282 | "keywords": [ 1283 | "cache", 1284 | "caching", 1285 | "psr", 1286 | "psr-16", 1287 | "simple-cache" 1288 | ], 1289 | "time": "2017-10-23T01:57:42+00:00" 1290 | }, 1291 | { 1292 | "name": "ralouphie/getallheaders", 1293 | "version": "3.0.3", 1294 | "source": { 1295 | "type": "git", 1296 | "url": "https://github.com/ralouphie/getallheaders.git", 1297 | "reference": "120b605dfeb996808c31b6477290a714d356e822" 1298 | }, 1299 | "dist": { 1300 | "type": "zip", 1301 | "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", 1302 | "reference": "120b605dfeb996808c31b6477290a714d356e822", 1303 | "shasum": "" 1304 | }, 1305 | "require": { 1306 | "php": ">=5.6" 1307 | }, 1308 | "require-dev": { 1309 | "php-coveralls/php-coveralls": "^2.1", 1310 | "phpunit/phpunit": "^5 || ^6.5" 1311 | }, 1312 | "type": "library", 1313 | "autoload": { 1314 | "files": [ 1315 | "src/getallheaders.php" 1316 | ] 1317 | }, 1318 | "notification-url": "https://packagist.org/downloads/", 1319 | "license": [ 1320 | "MIT" 1321 | ], 1322 | "authors": [ 1323 | { 1324 | "name": "Ralph Khattar", 1325 | "email": "ralph.khattar@gmail.com" 1326 | } 1327 | ], 1328 | "description": "A polyfill for getallheaders.", 1329 | "time": "2019-03-08T08:55:37+00:00" 1330 | }, 1331 | { 1332 | "name": "ramsey/uuid", 1333 | "version": "3.9.2", 1334 | "source": { 1335 | "type": "git", 1336 | "url": "https://github.com/ramsey/uuid.git", 1337 | "reference": "7779489a47d443f845271badbdcedfe4df8e06fb" 1338 | }, 1339 | "dist": { 1340 | "type": "zip", 1341 | "url": "https://api.github.com/repos/ramsey/uuid/zipball/7779489a47d443f845271badbdcedfe4df8e06fb", 1342 | "reference": "7779489a47d443f845271badbdcedfe4df8e06fb", 1343 | "shasum": "" 1344 | }, 1345 | "require": { 1346 | "ext-json": "*", 1347 | "paragonie/random_compat": "^1 | ^2 | 9.99.99", 1348 | "php": "^5.4 | ^7 | ^8", 1349 | "symfony/polyfill-ctype": "^1.8" 1350 | }, 1351 | "replace": { 1352 | "rhumsaa/uuid": "self.version" 1353 | }, 1354 | "require-dev": { 1355 | "codeception/aspect-mock": "^1 | ^2", 1356 | "doctrine/annotations": "^1.2", 1357 | "goaop/framework": "1.0.0-alpha.2 | ^1 | ^2.1", 1358 | "jakub-onderka/php-parallel-lint": "^1", 1359 | "mockery/mockery": "^0.9.11 | ^1", 1360 | "moontoast/math": "^1.1", 1361 | "paragonie/random-lib": "^2", 1362 | "php-mock/php-mock-phpunit": "^0.3 | ^1.1", 1363 | "phpunit/phpunit": "^4.8 | ^5.4 | ^6.5", 1364 | "squizlabs/php_codesniffer": "^3.5" 1365 | }, 1366 | "suggest": { 1367 | "ext-ctype": "Provides support for PHP Ctype functions", 1368 | "ext-libsodium": "Provides the PECL libsodium extension for use with the SodiumRandomGenerator", 1369 | "ext-openssl": "Provides the OpenSSL extension for use with the OpenSslGenerator", 1370 | "ext-uuid": "Provides the PECL UUID extension for use with the PeclUuidTimeGenerator and PeclUuidRandomGenerator", 1371 | "moontoast/math": "Provides support for converting UUID to 128-bit integer (in string form).", 1372 | "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", 1373 | "ramsey/uuid-console": "A console application for generating UUIDs with ramsey/uuid", 1374 | "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." 1375 | }, 1376 | "type": "library", 1377 | "extra": { 1378 | "branch-alias": { 1379 | "dev-master": "3.x-dev" 1380 | } 1381 | }, 1382 | "autoload": { 1383 | "psr-4": { 1384 | "Ramsey\\Uuid\\": "src/" 1385 | }, 1386 | "files": [ 1387 | "src/functions.php" 1388 | ] 1389 | }, 1390 | "notification-url": "https://packagist.org/downloads/", 1391 | "license": [ 1392 | "MIT" 1393 | ], 1394 | "authors": [ 1395 | { 1396 | "name": "Ben Ramsey", 1397 | "email": "ben@benramsey.com", 1398 | "homepage": "https://benramsey.com" 1399 | }, 1400 | { 1401 | "name": "Marijn Huizendveld", 1402 | "email": "marijn.huizendveld@gmail.com" 1403 | }, 1404 | { 1405 | "name": "Thibaud Fabre", 1406 | "email": "thibaud@aztech.io" 1407 | } 1408 | ], 1409 | "description": "Formerly rhumsaa/uuid. A PHP 5.4+ library for generating RFC 4122 version 1, 3, 4, and 5 universally unique identifiers (UUID).", 1410 | "homepage": "https://github.com/ramsey/uuid", 1411 | "keywords": [ 1412 | "guid", 1413 | "identifier", 1414 | "uuid" 1415 | ], 1416 | "time": "2019-12-17T08:18:51+00:00" 1417 | }, 1418 | { 1419 | "name": "swiftmailer/swiftmailer", 1420 | "version": "v6.2.3", 1421 | "source": { 1422 | "type": "git", 1423 | "url": "https://github.com/swiftmailer/swiftmailer.git", 1424 | "reference": "149cfdf118b169f7840bbe3ef0d4bc795d1780c9" 1425 | }, 1426 | "dist": { 1427 | "type": "zip", 1428 | "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/149cfdf118b169f7840bbe3ef0d4bc795d1780c9", 1429 | "reference": "149cfdf118b169f7840bbe3ef0d4bc795d1780c9", 1430 | "shasum": "" 1431 | }, 1432 | "require": { 1433 | "egulias/email-validator": "~2.0", 1434 | "php": ">=7.0.0", 1435 | "symfony/polyfill-iconv": "^1.0", 1436 | "symfony/polyfill-intl-idn": "^1.10", 1437 | "symfony/polyfill-mbstring": "^1.0" 1438 | }, 1439 | "require-dev": { 1440 | "mockery/mockery": "~0.9.1", 1441 | "symfony/phpunit-bridge": "^3.4.19|^4.1.8" 1442 | }, 1443 | "suggest": { 1444 | "ext-intl": "Needed to support internationalized email addresses", 1445 | "true/punycode": "Needed to support internationalized email addresses, if ext-intl is not installed" 1446 | }, 1447 | "type": "library", 1448 | "extra": { 1449 | "branch-alias": { 1450 | "dev-master": "6.2-dev" 1451 | } 1452 | }, 1453 | "autoload": { 1454 | "files": [ 1455 | "lib/swift_required.php" 1456 | ] 1457 | }, 1458 | "notification-url": "https://packagist.org/downloads/", 1459 | "license": [ 1460 | "MIT" 1461 | ], 1462 | "authors": [ 1463 | { 1464 | "name": "Chris Corbyn" 1465 | }, 1466 | { 1467 | "name": "Fabien Potencier", 1468 | "email": "fabien@symfony.com" 1469 | } 1470 | ], 1471 | "description": "Swiftmailer, free feature-rich PHP mailer", 1472 | "homepage": "https://swiftmailer.symfony.com", 1473 | "keywords": [ 1474 | "email", 1475 | "mail", 1476 | "mailer" 1477 | ], 1478 | "time": "2019-11-12T09:31:26+00:00" 1479 | }, 1480 | { 1481 | "name": "symfony/console", 1482 | "version": "v4.4.4", 1483 | "source": { 1484 | "type": "git", 1485 | "url": "https://github.com/symfony/console.git", 1486 | "reference": "f512001679f37e6a042b51897ed24a2f05eba656" 1487 | }, 1488 | "dist": { 1489 | "type": "zip", 1490 | "url": "https://api.github.com/repos/symfony/console/zipball/f512001679f37e6a042b51897ed24a2f05eba656", 1491 | "reference": "f512001679f37e6a042b51897ed24a2f05eba656", 1492 | "shasum": "" 1493 | }, 1494 | "require": { 1495 | "php": "^7.1.3", 1496 | "symfony/polyfill-mbstring": "~1.0", 1497 | "symfony/polyfill-php73": "^1.8", 1498 | "symfony/service-contracts": "^1.1|^2" 1499 | }, 1500 | "conflict": { 1501 | "symfony/dependency-injection": "<3.4", 1502 | "symfony/event-dispatcher": "<4.3|>=5", 1503 | "symfony/lock": "<4.4", 1504 | "symfony/process": "<3.3" 1505 | }, 1506 | "provide": { 1507 | "psr/log-implementation": "1.0" 1508 | }, 1509 | "require-dev": { 1510 | "psr/log": "~1.0", 1511 | "symfony/config": "^3.4|^4.0|^5.0", 1512 | "symfony/dependency-injection": "^3.4|^4.0|^5.0", 1513 | "symfony/event-dispatcher": "^4.3", 1514 | "symfony/lock": "^4.4|^5.0", 1515 | "symfony/process": "^3.4|^4.0|^5.0", 1516 | "symfony/var-dumper": "^4.3|^5.0" 1517 | }, 1518 | "suggest": { 1519 | "psr/log": "For using the console logger", 1520 | "symfony/event-dispatcher": "", 1521 | "symfony/lock": "", 1522 | "symfony/process": "" 1523 | }, 1524 | "type": "library", 1525 | "extra": { 1526 | "branch-alias": { 1527 | "dev-master": "4.4-dev" 1528 | } 1529 | }, 1530 | "autoload": { 1531 | "psr-4": { 1532 | "Symfony\\Component\\Console\\": "" 1533 | }, 1534 | "exclude-from-classmap": [ 1535 | "/Tests/" 1536 | ] 1537 | }, 1538 | "notification-url": "https://packagist.org/downloads/", 1539 | "license": [ 1540 | "MIT" 1541 | ], 1542 | "authors": [ 1543 | { 1544 | "name": "Fabien Potencier", 1545 | "email": "fabien@symfony.com" 1546 | }, 1547 | { 1548 | "name": "Symfony Community", 1549 | "homepage": "https://symfony.com/contributors" 1550 | } 1551 | ], 1552 | "description": "Symfony Console Component", 1553 | "homepage": "https://symfony.com", 1554 | "time": "2020-01-25T12:44:29+00:00" 1555 | }, 1556 | { 1557 | "name": "symfony/css-selector", 1558 | "version": "v5.0.4", 1559 | "source": { 1560 | "type": "git", 1561 | "url": "https://github.com/symfony/css-selector.git", 1562 | "reference": "ff60c90cb7950b592ebc84ad1289d0345bf24f9f" 1563 | }, 1564 | "dist": { 1565 | "type": "zip", 1566 | "url": "https://api.github.com/repos/symfony/css-selector/zipball/ff60c90cb7950b592ebc84ad1289d0345bf24f9f", 1567 | "reference": "ff60c90cb7950b592ebc84ad1289d0345bf24f9f", 1568 | "shasum": "" 1569 | }, 1570 | "require": { 1571 | "php": "^7.2.5" 1572 | }, 1573 | "type": "library", 1574 | "extra": { 1575 | "branch-alias": { 1576 | "dev-master": "5.0-dev" 1577 | } 1578 | }, 1579 | "autoload": { 1580 | "psr-4": { 1581 | "Symfony\\Component\\CssSelector\\": "" 1582 | }, 1583 | "exclude-from-classmap": [ 1584 | "/Tests/" 1585 | ] 1586 | }, 1587 | "notification-url": "https://packagist.org/downloads/", 1588 | "license": [ 1589 | "MIT" 1590 | ], 1591 | "authors": [ 1592 | { 1593 | "name": "Fabien Potencier", 1594 | "email": "fabien@symfony.com" 1595 | }, 1596 | { 1597 | "name": "Jean-François Simon", 1598 | "email": "jeanfrancois.simon@sensiolabs.com" 1599 | }, 1600 | { 1601 | "name": "Symfony Community", 1602 | "homepage": "https://symfony.com/contributors" 1603 | } 1604 | ], 1605 | "description": "Symfony CssSelector Component", 1606 | "homepage": "https://symfony.com", 1607 | "time": "2020-01-04T14:08:26+00:00" 1608 | }, 1609 | { 1610 | "name": "symfony/debug", 1611 | "version": "v4.4.17", 1612 | "source": { 1613 | "type": "git", 1614 | "url": "https://github.com/symfony/debug.git", 1615 | "reference": "65fe7b49868378319b82da3035fb30801b931c47" 1616 | }, 1617 | "dist": { 1618 | "type": "zip", 1619 | "url": "https://api.github.com/repos/symfony/debug/zipball/65fe7b49868378319b82da3035fb30801b931c47", 1620 | "reference": "65fe7b49868378319b82da3035fb30801b931c47", 1621 | "shasum": "" 1622 | }, 1623 | "require": { 1624 | "php": ">=7.1.3", 1625 | "psr/log": "~1.0", 1626 | "symfony/polyfill-php80": "^1.15" 1627 | }, 1628 | "conflict": { 1629 | "symfony/http-kernel": "<3.4" 1630 | }, 1631 | "require-dev": { 1632 | "symfony/http-kernel": "^3.4|^4.0|^5.0" 1633 | }, 1634 | "type": "library", 1635 | "autoload": { 1636 | "psr-4": { 1637 | "Symfony\\Component\\Debug\\": "" 1638 | }, 1639 | "exclude-from-classmap": [ 1640 | "/Tests/" 1641 | ] 1642 | }, 1643 | "notification-url": "https://packagist.org/downloads/", 1644 | "license": [ 1645 | "MIT" 1646 | ], 1647 | "authors": [ 1648 | { 1649 | "name": "Fabien Potencier", 1650 | "email": "fabien@symfony.com" 1651 | }, 1652 | { 1653 | "name": "Symfony Community", 1654 | "homepage": "https://symfony.com/contributors" 1655 | } 1656 | ], 1657 | "description": "Symfony Debug Component", 1658 | "homepage": "https://symfony.com", 1659 | "funding": [ 1660 | { 1661 | "url": "https://symfony.com/sponsor", 1662 | "type": "custom" 1663 | }, 1664 | { 1665 | "url": "https://github.com/fabpot", 1666 | "type": "github" 1667 | }, 1668 | { 1669 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1670 | "type": "tidelift" 1671 | } 1672 | ], 1673 | "time": "2020-10-28T20:42:29+00:00" 1674 | }, 1675 | { 1676 | "name": "symfony/deprecation-contracts", 1677 | "version": "v2.2.0", 1678 | "source": { 1679 | "type": "git", 1680 | "url": "https://github.com/symfony/deprecation-contracts.git", 1681 | "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665" 1682 | }, 1683 | "dist": { 1684 | "type": "zip", 1685 | "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5fa56b4074d1ae755beb55617ddafe6f5d78f665", 1686 | "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665", 1687 | "shasum": "" 1688 | }, 1689 | "require": { 1690 | "php": ">=7.1" 1691 | }, 1692 | "type": "library", 1693 | "extra": { 1694 | "branch-alias": { 1695 | "dev-master": "2.2-dev" 1696 | }, 1697 | "thanks": { 1698 | "name": "symfony/contracts", 1699 | "url": "https://github.com/symfony/contracts" 1700 | } 1701 | }, 1702 | "autoload": { 1703 | "files": [ 1704 | "function.php" 1705 | ] 1706 | }, 1707 | "notification-url": "https://packagist.org/downloads/", 1708 | "license": [ 1709 | "MIT" 1710 | ], 1711 | "authors": [ 1712 | { 1713 | "name": "Nicolas Grekas", 1714 | "email": "p@tchwork.com" 1715 | }, 1716 | { 1717 | "name": "Symfony Community", 1718 | "homepage": "https://symfony.com/contributors" 1719 | } 1720 | ], 1721 | "description": "A generic function and convention to trigger deprecation notices", 1722 | "homepage": "https://symfony.com", 1723 | "funding": [ 1724 | { 1725 | "url": "https://symfony.com/sponsor", 1726 | "type": "custom" 1727 | }, 1728 | { 1729 | "url": "https://github.com/fabpot", 1730 | "type": "github" 1731 | }, 1732 | { 1733 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1734 | "type": "tidelift" 1735 | } 1736 | ], 1737 | "time": "2020-09-07T11:33:47+00:00" 1738 | }, 1739 | { 1740 | "name": "symfony/deprecation-contracts", 1741 | "version": "v2.2.0", 1742 | "source": { 1743 | "type": "git", 1744 | "url": "https://github.com/symfony/deprecation-contracts.git", 1745 | "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665" 1746 | }, 1747 | "dist": { 1748 | "type": "zip", 1749 | "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5fa56b4074d1ae755beb55617ddafe6f5d78f665", 1750 | "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665", 1751 | "shasum": "" 1752 | }, 1753 | "require": { 1754 | "php": ">=7.1" 1755 | }, 1756 | "type": "library", 1757 | "extra": { 1758 | "branch-alias": { 1759 | "dev-master": "2.2-dev" 1760 | }, 1761 | "thanks": { 1762 | "name": "symfony/contracts", 1763 | "url": "https://github.com/symfony/contracts" 1764 | } 1765 | }, 1766 | "autoload": { 1767 | "files": [ 1768 | "function.php" 1769 | ] 1770 | }, 1771 | "notification-url": "https://packagist.org/downloads/", 1772 | "license": [ 1773 | "MIT" 1774 | ], 1775 | "authors": [ 1776 | { 1777 | "name": "Nicolas Grekas", 1778 | "email": "p@tchwork.com" 1779 | }, 1780 | { 1781 | "name": "Symfony Community", 1782 | "homepage": "https://symfony.com/contributors" 1783 | } 1784 | ], 1785 | "description": "A generic function and convention to trigger deprecation notices", 1786 | "homepage": "https://symfony.com", 1787 | "funding": [ 1788 | { 1789 | "url": "https://symfony.com/sponsor", 1790 | "type": "custom" 1791 | }, 1792 | { 1793 | "url": "https://github.com/fabpot", 1794 | "type": "github" 1795 | }, 1796 | { 1797 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1798 | "type": "tidelift" 1799 | } 1800 | ], 1801 | "time": "2020-09-07T11:33:47+00:00" 1802 | }, 1803 | { 1804 | "name": "symfony/error-handler", 1805 | "version": "v4.4.17", 1806 | "source": { 1807 | "type": "git", 1808 | "url": "https://github.com/symfony/error-handler.git", 1809 | "reference": "b0887cf8fc692eef2a4cf11cee3c5f5eb93fcfdf" 1810 | }, 1811 | "dist": { 1812 | "type": "zip", 1813 | "url": "https://api.github.com/repos/symfony/error-handler/zipball/b0887cf8fc692eef2a4cf11cee3c5f5eb93fcfdf", 1814 | "reference": "b0887cf8fc692eef2a4cf11cee3c5f5eb93fcfdf", 1815 | "shasum": "" 1816 | }, 1817 | "require": { 1818 | "php": ">=7.1.3", 1819 | "psr/log": "~1.0", 1820 | "symfony/debug": "^4.4.5", 1821 | "symfony/polyfill-php80": "^1.15", 1822 | "symfony/var-dumper": "^4.4|^5.0" 1823 | }, 1824 | "require-dev": { 1825 | "symfony/http-kernel": "^4.4|^5.0", 1826 | "symfony/serializer": "^4.4|^5.0" 1827 | }, 1828 | "type": "library", 1829 | "autoload": { 1830 | "psr-4": { 1831 | "Symfony\\Component\\ErrorHandler\\": "" 1832 | }, 1833 | "exclude-from-classmap": [ 1834 | "/Tests/" 1835 | ] 1836 | }, 1837 | "notification-url": "https://packagist.org/downloads/", 1838 | "license": [ 1839 | "MIT" 1840 | ], 1841 | "authors": [ 1842 | { 1843 | "name": "Fabien Potencier", 1844 | "email": "fabien@symfony.com" 1845 | }, 1846 | { 1847 | "name": "Symfony Community", 1848 | "homepage": "https://symfony.com/contributors" 1849 | } 1850 | ], 1851 | "description": "Symfony ErrorHandler Component", 1852 | "homepage": "https://symfony.com", 1853 | "funding": [ 1854 | { 1855 | "url": "https://symfony.com/sponsor", 1856 | "type": "custom" 1857 | }, 1858 | { 1859 | "url": "https://github.com/fabpot", 1860 | "type": "github" 1861 | }, 1862 | { 1863 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1864 | "type": "tidelift" 1865 | } 1866 | ], 1867 | "time": "2020-10-28T20:42:29+00:00" 1868 | }, 1869 | { 1870 | "name": "symfony/event-dispatcher", 1871 | "version": "v4.4.17", 1872 | "source": { 1873 | "type": "git", 1874 | "url": "https://github.com/symfony/event-dispatcher.git", 1875 | "reference": "f029d6f21eac61ab23198e7aca40e7638e8c8924" 1876 | }, 1877 | "dist": { 1878 | "type": "zip", 1879 | "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/f029d6f21eac61ab23198e7aca40e7638e8c8924", 1880 | "reference": "f029d6f21eac61ab23198e7aca40e7638e8c8924", 1881 | "shasum": "" 1882 | }, 1883 | "require": { 1884 | "php": ">=7.1.3", 1885 | "symfony/event-dispatcher-contracts": "^1.1" 1886 | }, 1887 | "conflict": { 1888 | "symfony/dependency-injection": "<3.4" 1889 | }, 1890 | "provide": { 1891 | "psr/event-dispatcher-implementation": "1.0", 1892 | "symfony/event-dispatcher-implementation": "1.1" 1893 | }, 1894 | "require-dev": { 1895 | "psr/log": "~1.0", 1896 | "symfony/config": "^3.4|^4.0|^5.0", 1897 | "symfony/dependency-injection": "^3.4|^4.0|^5.0", 1898 | "symfony/error-handler": "~3.4|~4.4", 1899 | "symfony/expression-language": "^3.4|^4.0|^5.0", 1900 | "symfony/http-foundation": "^3.4|^4.0|^5.0", 1901 | "symfony/service-contracts": "^1.1|^2", 1902 | "symfony/stopwatch": "^3.4|^4.0|^5.0" 1903 | }, 1904 | "suggest": { 1905 | "symfony/dependency-injection": "", 1906 | "symfony/http-kernel": "" 1907 | }, 1908 | "type": "library", 1909 | "autoload": { 1910 | "psr-4": { 1911 | "Symfony\\Component\\EventDispatcher\\": "" 1912 | }, 1913 | "exclude-from-classmap": [ 1914 | "/Tests/" 1915 | ] 1916 | }, 1917 | "notification-url": "https://packagist.org/downloads/", 1918 | "license": [ 1919 | "MIT" 1920 | ], 1921 | "authors": [ 1922 | { 1923 | "name": "Fabien Potencier", 1924 | "email": "fabien@symfony.com" 1925 | }, 1926 | { 1927 | "name": "Symfony Community", 1928 | "homepage": "https://symfony.com/contributors" 1929 | } 1930 | ], 1931 | "description": "Symfony EventDispatcher Component", 1932 | "homepage": "https://symfony.com", 1933 | "funding": [ 1934 | { 1935 | "url": "https://symfony.com/sponsor", 1936 | "type": "custom" 1937 | }, 1938 | { 1939 | "url": "https://github.com/fabpot", 1940 | "type": "github" 1941 | }, 1942 | { 1943 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1944 | "type": "tidelift" 1945 | } 1946 | ], 1947 | "time": "2020-10-31T22:44:29+00:00" 1948 | }, 1949 | { 1950 | "name": "symfony/event-dispatcher-contracts", 1951 | "version": "v1.1.9", 1952 | "source": { 1953 | "type": "git", 1954 | "url": "https://github.com/symfony/event-dispatcher-contracts.git", 1955 | "reference": "84e23fdcd2517bf37aecbd16967e83f0caee25a7" 1956 | }, 1957 | "dist": { 1958 | "type": "zip", 1959 | "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/84e23fdcd2517bf37aecbd16967e83f0caee25a7", 1960 | "reference": "84e23fdcd2517bf37aecbd16967e83f0caee25a7", 1961 | "shasum": "" 1962 | }, 1963 | "require": { 1964 | "php": ">=7.1.3" 1965 | }, 1966 | "suggest": { 1967 | "psr/event-dispatcher": "", 1968 | "symfony/event-dispatcher-implementation": "" 1969 | }, 1970 | "type": "library", 1971 | "extra": { 1972 | "branch-alias": { 1973 | "dev-master": "1.1-dev" 1974 | }, 1975 | "thanks": { 1976 | "name": "symfony/contracts", 1977 | "url": "https://github.com/symfony/contracts" 1978 | } 1979 | }, 1980 | "autoload": { 1981 | "psr-4": { 1982 | "Symfony\\Contracts\\EventDispatcher\\": "" 1983 | } 1984 | }, 1985 | "notification-url": "https://packagist.org/downloads/", 1986 | "license": [ 1987 | "MIT" 1988 | ], 1989 | "authors": [ 1990 | { 1991 | "name": "Nicolas Grekas", 1992 | "email": "p@tchwork.com" 1993 | }, 1994 | { 1995 | "name": "Symfony Community", 1996 | "homepage": "https://symfony.com/contributors" 1997 | } 1998 | ], 1999 | "description": "Generic abstractions related to dispatching event", 2000 | "homepage": "https://symfony.com", 2001 | "keywords": [ 2002 | "abstractions", 2003 | "contracts", 2004 | "decoupling", 2005 | "interfaces", 2006 | "interoperability", 2007 | "standards" 2008 | ], 2009 | "funding": [ 2010 | { 2011 | "url": "https://symfony.com/sponsor", 2012 | "type": "custom" 2013 | }, 2014 | { 2015 | "url": "https://github.com/fabpot", 2016 | "type": "github" 2017 | }, 2018 | { 2019 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2020 | "type": "tidelift" 2021 | } 2022 | ], 2023 | "time": "2020-07-06T13:19:58+00:00" 2024 | }, 2025 | { 2026 | "name": "symfony/finder", 2027 | "version": "v4.4.4", 2028 | "source": { 2029 | "type": "git", 2030 | "url": "https://github.com/symfony/finder.git", 2031 | "reference": "3a50be43515590faf812fbd7708200aabc327ec3" 2032 | }, 2033 | "dist": { 2034 | "type": "zip", 2035 | "url": "https://api.github.com/repos/symfony/finder/zipball/3a50be43515590faf812fbd7708200aabc327ec3", 2036 | "reference": "3a50be43515590faf812fbd7708200aabc327ec3", 2037 | "shasum": "" 2038 | }, 2039 | "require": { 2040 | "php": "^7.1.3" 2041 | }, 2042 | "type": "library", 2043 | "extra": { 2044 | "branch-alias": { 2045 | "dev-master": "4.4-dev" 2046 | } 2047 | }, 2048 | "autoload": { 2049 | "psr-4": { 2050 | "Symfony\\Component\\Finder\\": "" 2051 | }, 2052 | "exclude-from-classmap": [ 2053 | "/Tests/" 2054 | ] 2055 | }, 2056 | "notification-url": "https://packagist.org/downloads/", 2057 | "license": [ 2058 | "MIT" 2059 | ], 2060 | "authors": [ 2061 | { 2062 | "name": "Fabien Potencier", 2063 | "email": "fabien@symfony.com" 2064 | }, 2065 | { 2066 | "name": "Symfony Community", 2067 | "homepage": "https://symfony.com/contributors" 2068 | } 2069 | ], 2070 | "description": "Symfony Finder Component", 2071 | "homepage": "https://symfony.com", 2072 | "time": "2020-01-04T13:00:46+00:00" 2073 | }, 2074 | { 2075 | "name": "symfony/http-client-contracts", 2076 | "version": "v2.3.1", 2077 | "source": { 2078 | "type": "git", 2079 | "url": "https://github.com/symfony/http-client-contracts.git", 2080 | "reference": "41db680a15018f9c1d4b23516059633ce280ca33" 2081 | }, 2082 | "dist": { 2083 | "type": "zip", 2084 | "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/41db680a15018f9c1d4b23516059633ce280ca33", 2085 | "reference": "41db680a15018f9c1d4b23516059633ce280ca33", 2086 | "shasum": "" 2087 | }, 2088 | "require": { 2089 | "php": ">=7.2.5" 2090 | }, 2091 | "suggest": { 2092 | "symfony/http-client-implementation": "" 2093 | }, 2094 | "type": "library", 2095 | "extra": { 2096 | "branch-version": "2.3", 2097 | "branch-alias": { 2098 | "dev-main": "2.3-dev" 2099 | }, 2100 | "thanks": { 2101 | "name": "symfony/contracts", 2102 | "url": "https://github.com/symfony/contracts" 2103 | } 2104 | }, 2105 | "autoload": { 2106 | "psr-4": { 2107 | "Symfony\\Contracts\\HttpClient\\": "" 2108 | } 2109 | }, 2110 | "notification-url": "https://packagist.org/downloads/", 2111 | "license": [ 2112 | "MIT" 2113 | ], 2114 | "authors": [ 2115 | { 2116 | "name": "Nicolas Grekas", 2117 | "email": "p@tchwork.com" 2118 | }, 2119 | { 2120 | "name": "Symfony Community", 2121 | "homepage": "https://symfony.com/contributors" 2122 | } 2123 | ], 2124 | "description": "Generic abstractions related to HTTP clients", 2125 | "homepage": "https://symfony.com", 2126 | "keywords": [ 2127 | "abstractions", 2128 | "contracts", 2129 | "decoupling", 2130 | "interfaces", 2131 | "interoperability", 2132 | "standards" 2133 | ], 2134 | "funding": [ 2135 | { 2136 | "url": "https://symfony.com/sponsor", 2137 | "type": "custom" 2138 | }, 2139 | { 2140 | "url": "https://github.com/fabpot", 2141 | "type": "github" 2142 | }, 2143 | { 2144 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2145 | "type": "tidelift" 2146 | } 2147 | ], 2148 | "time": "2020-10-14T17:08:19+00:00" 2149 | }, 2150 | { 2151 | "name": "symfony/http-foundation", 2152 | "version": "v4.4.17", 2153 | "source": { 2154 | "type": "git", 2155 | "url": "https://github.com/symfony/http-foundation.git", 2156 | "reference": "9eeb37ec0ff3049c782ca67041648e28ddd75a94" 2157 | }, 2158 | "dist": { 2159 | "type": "zip", 2160 | "url": "https://api.github.com/repos/symfony/http-foundation/zipball/9eeb37ec0ff3049c782ca67041648e28ddd75a94", 2161 | "reference": "9eeb37ec0ff3049c782ca67041648e28ddd75a94", 2162 | "shasum": "" 2163 | }, 2164 | "require": { 2165 | "php": ">=7.1.3", 2166 | "symfony/mime": "^4.3|^5.0", 2167 | "symfony/polyfill-mbstring": "~1.1" 2168 | }, 2169 | "require-dev": { 2170 | "predis/predis": "~1.0", 2171 | "symfony/expression-language": "^3.4|^4.0|^5.0" 2172 | }, 2173 | "type": "library", 2174 | "autoload": { 2175 | "psr-4": { 2176 | "Symfony\\Component\\HttpFoundation\\": "" 2177 | }, 2178 | "exclude-from-classmap": [ 2179 | "/Tests/" 2180 | ] 2181 | }, 2182 | "notification-url": "https://packagist.org/downloads/", 2183 | "license": [ 2184 | "MIT" 2185 | ], 2186 | "authors": [ 2187 | { 2188 | "name": "Fabien Potencier", 2189 | "email": "fabien@symfony.com" 2190 | }, 2191 | { 2192 | "name": "Symfony Community", 2193 | "homepage": "https://symfony.com/contributors" 2194 | } 2195 | ], 2196 | "description": "Symfony HttpFoundation Component", 2197 | "homepage": "https://symfony.com", 2198 | "funding": [ 2199 | { 2200 | "url": "https://symfony.com/sponsor", 2201 | "type": "custom" 2202 | }, 2203 | { 2204 | "url": "https://github.com/fabpot", 2205 | "type": "github" 2206 | }, 2207 | { 2208 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2209 | "type": "tidelift" 2210 | } 2211 | ], 2212 | "time": "2020-11-03T11:58:18+00:00" 2213 | }, 2214 | { 2215 | "name": "symfony/http-kernel", 2216 | "version": "v4.4.17", 2217 | "source": { 2218 | "type": "git", 2219 | "url": "https://github.com/symfony/http-kernel.git", 2220 | "reference": "9f5605ee05406d8afa40dc4f2954c6a61de3a984" 2221 | }, 2222 | "dist": { 2223 | "type": "zip", 2224 | "url": "https://api.github.com/repos/symfony/http-kernel/zipball/9f5605ee05406d8afa40dc4f2954c6a61de3a984", 2225 | "reference": "9f5605ee05406d8afa40dc4f2954c6a61de3a984", 2226 | "shasum": "" 2227 | }, 2228 | "require": { 2229 | "php": ">=7.1.3", 2230 | "psr/log": "~1.0", 2231 | "symfony/error-handler": "^4.4", 2232 | "symfony/event-dispatcher": "^4.4", 2233 | "symfony/http-client-contracts": "^1.1|^2", 2234 | "symfony/http-foundation": "^4.4|^5.0", 2235 | "symfony/polyfill-ctype": "^1.8", 2236 | "symfony/polyfill-php73": "^1.9", 2237 | "symfony/polyfill-php80": "^1.15" 2238 | }, 2239 | "conflict": { 2240 | "symfony/browser-kit": "<4.3", 2241 | "symfony/config": "<3.4", 2242 | "symfony/console": ">=5", 2243 | "symfony/dependency-injection": "<4.3", 2244 | "symfony/translation": "<4.2", 2245 | "twig/twig": "<1.34|<2.4,>=2" 2246 | }, 2247 | "provide": { 2248 | "psr/log-implementation": "1.0" 2249 | }, 2250 | "require-dev": { 2251 | "psr/cache": "~1.0", 2252 | "symfony/browser-kit": "^4.3|^5.0", 2253 | "symfony/config": "^3.4|^4.0|^5.0", 2254 | "symfony/console": "^3.4|^4.0", 2255 | "symfony/css-selector": "^3.4|^4.0|^5.0", 2256 | "symfony/dependency-injection": "^4.3|^5.0", 2257 | "symfony/dom-crawler": "^3.4|^4.0|^5.0", 2258 | "symfony/expression-language": "^3.4|^4.0|^5.0", 2259 | "symfony/finder": "^3.4|^4.0|^5.0", 2260 | "symfony/process": "^3.4|^4.0|^5.0", 2261 | "symfony/routing": "^3.4|^4.0|^5.0", 2262 | "symfony/stopwatch": "^3.4|^4.0|^5.0", 2263 | "symfony/templating": "^3.4|^4.0|^5.0", 2264 | "symfony/translation": "^4.2|^5.0", 2265 | "symfony/translation-contracts": "^1.1|^2", 2266 | "twig/twig": "^1.34|^2.4|^3.0" 2267 | }, 2268 | "suggest": { 2269 | "symfony/browser-kit": "", 2270 | "symfony/config": "", 2271 | "symfony/console": "", 2272 | "symfony/dependency-injection": "" 2273 | }, 2274 | "type": "library", 2275 | "autoload": { 2276 | "psr-4": { 2277 | "Symfony\\Component\\HttpKernel\\": "" 2278 | }, 2279 | "exclude-from-classmap": [ 2280 | "/Tests/" 2281 | ] 2282 | }, 2283 | "notification-url": "https://packagist.org/downloads/", 2284 | "license": [ 2285 | "MIT" 2286 | ], 2287 | "authors": [ 2288 | { 2289 | "name": "Fabien Potencier", 2290 | "email": "fabien@symfony.com" 2291 | }, 2292 | { 2293 | "name": "Symfony Community", 2294 | "homepage": "https://symfony.com/contributors" 2295 | } 2296 | ], 2297 | "description": "Symfony HttpKernel Component", 2298 | "homepage": "https://symfony.com", 2299 | "funding": [ 2300 | { 2301 | "url": "https://symfony.com/sponsor", 2302 | "type": "custom" 2303 | }, 2304 | { 2305 | "url": "https://github.com/fabpot", 2306 | "type": "github" 2307 | }, 2308 | { 2309 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2310 | "type": "tidelift" 2311 | } 2312 | ], 2313 | "time": "2020-11-29T09:23:08+00:00" 2314 | }, 2315 | { 2316 | "name": "symfony/mime", 2317 | "version": "v5.2.0", 2318 | "source": { 2319 | "type": "git", 2320 | "url": "https://github.com/symfony/mime.git", 2321 | "reference": "05f667e8fa029568964fd3bec6bc17765b853cc5" 2322 | }, 2323 | "dist": { 2324 | "type": "zip", 2325 | "url": "https://api.github.com/repos/symfony/mime/zipball/05f667e8fa029568964fd3bec6bc17765b853cc5", 2326 | "reference": "05f667e8fa029568964fd3bec6bc17765b853cc5", 2327 | "shasum": "" 2328 | }, 2329 | "require": { 2330 | "php": ">=7.2.5", 2331 | "symfony/deprecation-contracts": "^2.1", 2332 | "symfony/polyfill-intl-idn": "^1.10", 2333 | "symfony/polyfill-mbstring": "^1.0", 2334 | "symfony/polyfill-php80": "^1.15" 2335 | }, 2336 | "conflict": { 2337 | "symfony/mailer": "<4.4" 2338 | }, 2339 | "require-dev": { 2340 | "egulias/email-validator": "^2.1.10", 2341 | "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", 2342 | "symfony/dependency-injection": "^4.4|^5.0", 2343 | "symfony/property-access": "^4.4|^5.1", 2344 | "symfony/property-info": "^4.4|^5.1", 2345 | "symfony/serializer": "^5.2" 2346 | }, 2347 | "type": "library", 2348 | "autoload": { 2349 | "psr-4": { 2350 | "Symfony\\Component\\Mime\\": "" 2351 | }, 2352 | "exclude-from-classmap": [ 2353 | "/Tests/" 2354 | ] 2355 | }, 2356 | "notification-url": "https://packagist.org/downloads/", 2357 | "license": [ 2358 | "MIT" 2359 | ], 2360 | "authors": [ 2361 | { 2362 | "name": "Fabien Potencier", 2363 | "email": "fabien@symfony.com" 2364 | }, 2365 | { 2366 | "name": "Symfony Community", 2367 | "homepage": "https://symfony.com/contributors" 2368 | } 2369 | ], 2370 | "description": "A library to manipulate MIME messages", 2371 | "homepage": "https://symfony.com", 2372 | "keywords": [ 2373 | "mime", 2374 | "mime-type" 2375 | ], 2376 | "funding": [ 2377 | { 2378 | "url": "https://symfony.com/sponsor", 2379 | "type": "custom" 2380 | }, 2381 | { 2382 | "url": "https://github.com/fabpot", 2383 | "type": "github" 2384 | }, 2385 | { 2386 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2387 | "type": "tidelift" 2388 | } 2389 | ], 2390 | "time": "2020-10-30T14:55:39+00:00" 2391 | }, 2392 | { 2393 | "name": "symfony/polyfill-ctype", 2394 | "version": "v1.20.0", 2395 | "source": { 2396 | "type": "git", 2397 | "url": "https://github.com/symfony/polyfill-ctype.git", 2398 | "reference": "f4ba089a5b6366e453971d3aad5fe8e897b37f41" 2399 | }, 2400 | "dist": { 2401 | "type": "zip", 2402 | "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/f4ba089a5b6366e453971d3aad5fe8e897b37f41", 2403 | "reference": "f4ba089a5b6366e453971d3aad5fe8e897b37f41", 2404 | "shasum": "" 2405 | }, 2406 | "require": { 2407 | "php": ">=7.1" 2408 | }, 2409 | "suggest": { 2410 | "ext-ctype": "For best performance" 2411 | }, 2412 | "type": "library", 2413 | "extra": { 2414 | "branch-alias": { 2415 | "dev-main": "1.20-dev" 2416 | }, 2417 | "thanks": { 2418 | "name": "symfony/polyfill", 2419 | "url": "https://github.com/symfony/polyfill" 2420 | } 2421 | }, 2422 | "autoload": { 2423 | "psr-4": { 2424 | "Symfony\\Polyfill\\Ctype\\": "" 2425 | }, 2426 | "files": [ 2427 | "bootstrap.php" 2428 | ] 2429 | }, 2430 | "notification-url": "https://packagist.org/downloads/", 2431 | "license": [ 2432 | "MIT" 2433 | ], 2434 | "authors": [ 2435 | { 2436 | "name": "Gert de Pagter", 2437 | "email": "BackEndTea@gmail.com" 2438 | }, 2439 | { 2440 | "name": "Symfony Community", 2441 | "homepage": "https://symfony.com/contributors" 2442 | } 2443 | ], 2444 | "description": "Symfony polyfill for ctype functions", 2445 | "homepage": "https://symfony.com", 2446 | "keywords": [ 2447 | "compatibility", 2448 | "ctype", 2449 | "polyfill", 2450 | "portable" 2451 | ], 2452 | "funding": [ 2453 | { 2454 | "url": "https://symfony.com/sponsor", 2455 | "type": "custom" 2456 | }, 2457 | { 2458 | "url": "https://github.com/fabpot", 2459 | "type": "github" 2460 | }, 2461 | { 2462 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2463 | "type": "tidelift" 2464 | } 2465 | ], 2466 | "time": "2020-10-23T14:02:19+00:00" 2467 | }, 2468 | { 2469 | "name": "symfony/polyfill-iconv", 2470 | "version": "v1.14.0", 2471 | "source": { 2472 | "type": "git", 2473 | "url": "https://github.com/symfony/polyfill-iconv.git", 2474 | "reference": "926832ce51059bb58211b7b2080a88e0c3b5328e" 2475 | }, 2476 | "dist": { 2477 | "type": "zip", 2478 | "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/926832ce51059bb58211b7b2080a88e0c3b5328e", 2479 | "reference": "926832ce51059bb58211b7b2080a88e0c3b5328e", 2480 | "shasum": "" 2481 | }, 2482 | "require": { 2483 | "php": ">=5.3.3" 2484 | }, 2485 | "suggest": { 2486 | "ext-iconv": "For best performance" 2487 | }, 2488 | "type": "library", 2489 | "extra": { 2490 | "branch-alias": { 2491 | "dev-master": "1.14-dev" 2492 | } 2493 | }, 2494 | "autoload": { 2495 | "psr-4": { 2496 | "Symfony\\Polyfill\\Iconv\\": "" 2497 | }, 2498 | "files": [ 2499 | "bootstrap.php" 2500 | ] 2501 | }, 2502 | "notification-url": "https://packagist.org/downloads/", 2503 | "license": [ 2504 | "MIT" 2505 | ], 2506 | "authors": [ 2507 | { 2508 | "name": "Nicolas Grekas", 2509 | "email": "p@tchwork.com" 2510 | }, 2511 | { 2512 | "name": "Symfony Community", 2513 | "homepage": "https://symfony.com/contributors" 2514 | } 2515 | ], 2516 | "description": "Symfony polyfill for the Iconv extension", 2517 | "homepage": "https://symfony.com", 2518 | "keywords": [ 2519 | "compatibility", 2520 | "iconv", 2521 | "polyfill", 2522 | "portable", 2523 | "shim" 2524 | ], 2525 | "time": "2020-01-13T11:15:53+00:00" 2526 | }, 2527 | { 2528 | "name": "symfony/polyfill-intl-idn", 2529 | "version": "v1.20.0", 2530 | "source": { 2531 | "type": "git", 2532 | "url": "https://github.com/symfony/polyfill-intl-idn.git", 2533 | "reference": "3b75acd829741c768bc8b1f84eb33265e7cc5117" 2534 | }, 2535 | "dist": { 2536 | "type": "zip", 2537 | "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/3b75acd829741c768bc8b1f84eb33265e7cc5117", 2538 | "reference": "3b75acd829741c768bc8b1f84eb33265e7cc5117", 2539 | "shasum": "" 2540 | }, 2541 | "require": { 2542 | "php": ">=7.1", 2543 | "symfony/polyfill-intl-normalizer": "^1.10", 2544 | "symfony/polyfill-php72": "^1.10" 2545 | }, 2546 | "suggest": { 2547 | "ext-intl": "For best performance" 2548 | }, 2549 | "type": "library", 2550 | "extra": { 2551 | "branch-alias": { 2552 | "dev-main": "1.20-dev" 2553 | }, 2554 | "thanks": { 2555 | "name": "symfony/polyfill", 2556 | "url": "https://github.com/symfony/polyfill" 2557 | } 2558 | }, 2559 | "autoload": { 2560 | "psr-4": { 2561 | "Symfony\\Polyfill\\Intl\\Idn\\": "" 2562 | }, 2563 | "files": [ 2564 | "bootstrap.php" 2565 | ] 2566 | }, 2567 | "notification-url": "https://packagist.org/downloads/", 2568 | "license": [ 2569 | "MIT" 2570 | ], 2571 | "authors": [ 2572 | { 2573 | "name": "Laurent Bassin", 2574 | "email": "laurent@bassin.info" 2575 | }, 2576 | { 2577 | "name": "Trevor Rowbotham", 2578 | "email": "trevor.rowbotham@pm.me" 2579 | }, 2580 | { 2581 | "name": "Symfony Community", 2582 | "homepage": "https://symfony.com/contributors" 2583 | } 2584 | ], 2585 | "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", 2586 | "homepage": "https://symfony.com", 2587 | "keywords": [ 2588 | "compatibility", 2589 | "idn", 2590 | "intl", 2591 | "polyfill", 2592 | "portable", 2593 | "shim" 2594 | ], 2595 | "funding": [ 2596 | { 2597 | "url": "https://symfony.com/sponsor", 2598 | "type": "custom" 2599 | }, 2600 | { 2601 | "url": "https://github.com/fabpot", 2602 | "type": "github" 2603 | }, 2604 | { 2605 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2606 | "type": "tidelift" 2607 | } 2608 | ], 2609 | "time": "2020-10-23T14:02:19+00:00" 2610 | }, 2611 | { 2612 | "name": "symfony/polyfill-intl-normalizer", 2613 | "version": "v1.20.0", 2614 | "source": { 2615 | "type": "git", 2616 | "url": "https://github.com/symfony/polyfill-intl-normalizer.git", 2617 | "reference": "727d1096295d807c309fb01a851577302394c897" 2618 | }, 2619 | "dist": { 2620 | "type": "zip", 2621 | "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/727d1096295d807c309fb01a851577302394c897", 2622 | "reference": "727d1096295d807c309fb01a851577302394c897", 2623 | "shasum": "" 2624 | }, 2625 | "require": { 2626 | "php": ">=7.1" 2627 | }, 2628 | "suggest": { 2629 | "ext-intl": "For best performance" 2630 | }, 2631 | "type": "library", 2632 | "extra": { 2633 | "branch-alias": { 2634 | "dev-main": "1.20-dev" 2635 | }, 2636 | "thanks": { 2637 | "name": "symfony/polyfill", 2638 | "url": "https://github.com/symfony/polyfill" 2639 | } 2640 | }, 2641 | "autoload": { 2642 | "psr-4": { 2643 | "Symfony\\Polyfill\\Intl\\Normalizer\\": "" 2644 | }, 2645 | "files": [ 2646 | "bootstrap.php" 2647 | ], 2648 | "classmap": [ 2649 | "Resources/stubs" 2650 | ] 2651 | }, 2652 | "notification-url": "https://packagist.org/downloads/", 2653 | "license": [ 2654 | "MIT" 2655 | ], 2656 | "authors": [ 2657 | { 2658 | "name": "Nicolas Grekas", 2659 | "email": "p@tchwork.com" 2660 | }, 2661 | { 2662 | "name": "Symfony Community", 2663 | "homepage": "https://symfony.com/contributors" 2664 | } 2665 | ], 2666 | "description": "Symfony polyfill for intl's Normalizer class and related functions", 2667 | "homepage": "https://symfony.com", 2668 | "keywords": [ 2669 | "compatibility", 2670 | "intl", 2671 | "normalizer", 2672 | "polyfill", 2673 | "portable", 2674 | "shim" 2675 | ], 2676 | "funding": [ 2677 | { 2678 | "url": "https://symfony.com/sponsor", 2679 | "type": "custom" 2680 | }, 2681 | { 2682 | "url": "https://github.com/fabpot", 2683 | "type": "github" 2684 | }, 2685 | { 2686 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2687 | "type": "tidelift" 2688 | } 2689 | ], 2690 | "time": "2020-10-23T14:02:19+00:00" 2691 | }, 2692 | { 2693 | "name": "symfony/polyfill-mbstring", 2694 | "version": "v1.20.0", 2695 | "source": { 2696 | "type": "git", 2697 | "url": "https://github.com/symfony/polyfill-mbstring.git", 2698 | "reference": "39d483bdf39be819deabf04ec872eb0b2410b531" 2699 | }, 2700 | "dist": { 2701 | "type": "zip", 2702 | "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/39d483bdf39be819deabf04ec872eb0b2410b531", 2703 | "reference": "39d483bdf39be819deabf04ec872eb0b2410b531", 2704 | "shasum": "" 2705 | }, 2706 | "require": { 2707 | "php": ">=7.1" 2708 | }, 2709 | "suggest": { 2710 | "ext-mbstring": "For best performance" 2711 | }, 2712 | "type": "library", 2713 | "extra": { 2714 | "branch-alias": { 2715 | "dev-main": "1.20-dev" 2716 | }, 2717 | "thanks": { 2718 | "name": "symfony/polyfill", 2719 | "url": "https://github.com/symfony/polyfill" 2720 | } 2721 | }, 2722 | "autoload": { 2723 | "psr-4": { 2724 | "Symfony\\Polyfill\\Mbstring\\": "" 2725 | }, 2726 | "files": [ 2727 | "bootstrap.php" 2728 | ] 2729 | }, 2730 | "notification-url": "https://packagist.org/downloads/", 2731 | "license": [ 2732 | "MIT" 2733 | ], 2734 | "authors": [ 2735 | { 2736 | "name": "Nicolas Grekas", 2737 | "email": "p@tchwork.com" 2738 | }, 2739 | { 2740 | "name": "Symfony Community", 2741 | "homepage": "https://symfony.com/contributors" 2742 | } 2743 | ], 2744 | "description": "Symfony polyfill for the Mbstring extension", 2745 | "homepage": "https://symfony.com", 2746 | "keywords": [ 2747 | "compatibility", 2748 | "mbstring", 2749 | "polyfill", 2750 | "portable", 2751 | "shim" 2752 | ], 2753 | "funding": [ 2754 | { 2755 | "url": "https://symfony.com/sponsor", 2756 | "type": "custom" 2757 | }, 2758 | { 2759 | "url": "https://github.com/fabpot", 2760 | "type": "github" 2761 | }, 2762 | { 2763 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2764 | "type": "tidelift" 2765 | } 2766 | ], 2767 | "time": "2020-10-23T14:02:19+00:00" 2768 | }, 2769 | { 2770 | "name": "symfony/polyfill-php72", 2771 | "version": "v1.20.0", 2772 | "source": { 2773 | "type": "git", 2774 | "url": "https://github.com/symfony/polyfill-php72.git", 2775 | "reference": "cede45fcdfabdd6043b3592e83678e42ec69e930" 2776 | }, 2777 | "dist": { 2778 | "type": "zip", 2779 | "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/cede45fcdfabdd6043b3592e83678e42ec69e930", 2780 | "reference": "cede45fcdfabdd6043b3592e83678e42ec69e930", 2781 | "shasum": "" 2782 | }, 2783 | "require": { 2784 | "php": ">=7.1" 2785 | }, 2786 | "type": "library", 2787 | "extra": { 2788 | "branch-alias": { 2789 | "dev-main": "1.20-dev" 2790 | }, 2791 | "thanks": { 2792 | "name": "symfony/polyfill", 2793 | "url": "https://github.com/symfony/polyfill" 2794 | } 2795 | }, 2796 | "autoload": { 2797 | "psr-4": { 2798 | "Symfony\\Polyfill\\Php72\\": "" 2799 | }, 2800 | "files": [ 2801 | "bootstrap.php" 2802 | ] 2803 | }, 2804 | "notification-url": "https://packagist.org/downloads/", 2805 | "license": [ 2806 | "MIT" 2807 | ], 2808 | "authors": [ 2809 | { 2810 | "name": "Nicolas Grekas", 2811 | "email": "p@tchwork.com" 2812 | }, 2813 | { 2814 | "name": "Symfony Community", 2815 | "homepage": "https://symfony.com/contributors" 2816 | } 2817 | ], 2818 | "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", 2819 | "homepage": "https://symfony.com", 2820 | "keywords": [ 2821 | "compatibility", 2822 | "polyfill", 2823 | "portable", 2824 | "shim" 2825 | ], 2826 | "funding": [ 2827 | { 2828 | "url": "https://symfony.com/sponsor", 2829 | "type": "custom" 2830 | }, 2831 | { 2832 | "url": "https://github.com/fabpot", 2833 | "type": "github" 2834 | }, 2835 | { 2836 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2837 | "type": "tidelift" 2838 | } 2839 | ], 2840 | "time": "2020-10-23T14:02:19+00:00" 2841 | }, 2842 | { 2843 | "name": "symfony/polyfill-php73", 2844 | "version": "v1.20.0", 2845 | "source": { 2846 | "type": "git", 2847 | "url": "https://github.com/symfony/polyfill-php73.git", 2848 | "reference": "8ff431c517be11c78c48a39a66d37431e26a6bed" 2849 | }, 2850 | "dist": { 2851 | "type": "zip", 2852 | "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/8ff431c517be11c78c48a39a66d37431e26a6bed", 2853 | "reference": "8ff431c517be11c78c48a39a66d37431e26a6bed", 2854 | "shasum": "" 2855 | }, 2856 | "require": { 2857 | "php": ">=7.1" 2858 | }, 2859 | "type": "library", 2860 | "extra": { 2861 | "branch-alias": { 2862 | "dev-main": "1.20-dev" 2863 | }, 2864 | "thanks": { 2865 | "name": "symfony/polyfill", 2866 | "url": "https://github.com/symfony/polyfill" 2867 | } 2868 | }, 2869 | "autoload": { 2870 | "psr-4": { 2871 | "Symfony\\Polyfill\\Php73\\": "" 2872 | }, 2873 | "files": [ 2874 | "bootstrap.php" 2875 | ], 2876 | "classmap": [ 2877 | "Resources/stubs" 2878 | ] 2879 | }, 2880 | "notification-url": "https://packagist.org/downloads/", 2881 | "license": [ 2882 | "MIT" 2883 | ], 2884 | "authors": [ 2885 | { 2886 | "name": "Nicolas Grekas", 2887 | "email": "p@tchwork.com" 2888 | }, 2889 | { 2890 | "name": "Symfony Community", 2891 | "homepage": "https://symfony.com/contributors" 2892 | } 2893 | ], 2894 | "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", 2895 | "homepage": "https://symfony.com", 2896 | "keywords": [ 2897 | "compatibility", 2898 | "polyfill", 2899 | "portable", 2900 | "shim" 2901 | ], 2902 | "funding": [ 2903 | { 2904 | "url": "https://symfony.com/sponsor", 2905 | "type": "custom" 2906 | }, 2907 | { 2908 | "url": "https://github.com/fabpot", 2909 | "type": "github" 2910 | }, 2911 | { 2912 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2913 | "type": "tidelift" 2914 | } 2915 | ], 2916 | "time": "2020-10-23T14:02:19+00:00" 2917 | }, 2918 | { 2919 | "name": "symfony/polyfill-php80", 2920 | "version": "v1.20.0", 2921 | "source": { 2922 | "type": "git", 2923 | "url": "https://github.com/symfony/polyfill-php80.git", 2924 | "reference": "e70aa8b064c5b72d3df2abd5ab1e90464ad009de" 2925 | }, 2926 | "dist": { 2927 | "type": "zip", 2928 | "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/e70aa8b064c5b72d3df2abd5ab1e90464ad009de", 2929 | "reference": "e70aa8b064c5b72d3df2abd5ab1e90464ad009de", 2930 | "shasum": "" 2931 | }, 2932 | "require": { 2933 | "php": ">=7.1" 2934 | }, 2935 | "type": "library", 2936 | "extra": { 2937 | "branch-alias": { 2938 | "dev-main": "1.20-dev" 2939 | }, 2940 | "thanks": { 2941 | "name": "symfony/polyfill", 2942 | "url": "https://github.com/symfony/polyfill" 2943 | } 2944 | }, 2945 | "autoload": { 2946 | "psr-4": { 2947 | "Symfony\\Polyfill\\Php80\\": "" 2948 | }, 2949 | "files": [ 2950 | "bootstrap.php" 2951 | ], 2952 | "classmap": [ 2953 | "Resources/stubs" 2954 | ] 2955 | }, 2956 | "notification-url": "https://packagist.org/downloads/", 2957 | "license": [ 2958 | "MIT" 2959 | ], 2960 | "authors": [ 2961 | { 2962 | "name": "Ion Bazan", 2963 | "email": "ion.bazan@gmail.com" 2964 | }, 2965 | { 2966 | "name": "Nicolas Grekas", 2967 | "email": "p@tchwork.com" 2968 | }, 2969 | { 2970 | "name": "Symfony Community", 2971 | "homepage": "https://symfony.com/contributors" 2972 | } 2973 | ], 2974 | "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", 2975 | "homepage": "https://symfony.com", 2976 | "keywords": [ 2977 | "compatibility", 2978 | "polyfill", 2979 | "portable", 2980 | "shim" 2981 | ], 2982 | "funding": [ 2983 | { 2984 | "url": "https://symfony.com/sponsor", 2985 | "type": "custom" 2986 | }, 2987 | { 2988 | "url": "https://github.com/fabpot", 2989 | "type": "github" 2990 | }, 2991 | { 2992 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2993 | "type": "tidelift" 2994 | } 2995 | ], 2996 | "time": "2020-10-23T14:02:19+00:00" 2997 | }, 2998 | { 2999 | "name": "symfony/polyfill-php80", 3000 | "version": "v1.20.0", 3001 | "source": { 3002 | "type": "git", 3003 | "url": "https://github.com/symfony/polyfill-php80.git", 3004 | "reference": "e70aa8b064c5b72d3df2abd5ab1e90464ad009de" 3005 | }, 3006 | "dist": { 3007 | "type": "zip", 3008 | "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/e70aa8b064c5b72d3df2abd5ab1e90464ad009de", 3009 | "reference": "e70aa8b064c5b72d3df2abd5ab1e90464ad009de", 3010 | "shasum": "" 3011 | }, 3012 | "require": { 3013 | "php": ">=7.1" 3014 | }, 3015 | "type": "library", 3016 | "extra": { 3017 | "branch-alias": { 3018 | "dev-main": "1.20-dev" 3019 | }, 3020 | "thanks": { 3021 | "name": "symfony/polyfill", 3022 | "url": "https://github.com/symfony/polyfill" 3023 | } 3024 | }, 3025 | "autoload": { 3026 | "psr-4": { 3027 | "Symfony\\Polyfill\\Php80\\": "" 3028 | }, 3029 | "files": [ 3030 | "bootstrap.php" 3031 | ], 3032 | "classmap": [ 3033 | "Resources/stubs" 3034 | ] 3035 | }, 3036 | "notification-url": "https://packagist.org/downloads/", 3037 | "license": [ 3038 | "MIT" 3039 | ], 3040 | "authors": [ 3041 | { 3042 | "name": "Ion Bazan", 3043 | "email": "ion.bazan@gmail.com" 3044 | }, 3045 | { 3046 | "name": "Nicolas Grekas", 3047 | "email": "p@tchwork.com" 3048 | }, 3049 | { 3050 | "name": "Symfony Community", 3051 | "homepage": "https://symfony.com/contributors" 3052 | } 3053 | ], 3054 | "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", 3055 | "homepage": "https://symfony.com", 3056 | "keywords": [ 3057 | "compatibility", 3058 | "polyfill", 3059 | "portable", 3060 | "shim" 3061 | ], 3062 | "funding": [ 3063 | { 3064 | "url": "https://symfony.com/sponsor", 3065 | "type": "custom" 3066 | }, 3067 | { 3068 | "url": "https://github.com/fabpot", 3069 | "type": "github" 3070 | }, 3071 | { 3072 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3073 | "type": "tidelift" 3074 | } 3075 | ], 3076 | "time": "2020-10-23T14:02:19+00:00" 3077 | }, 3078 | { 3079 | "name": "symfony/process", 3080 | "version": "v4.4.4", 3081 | "source": { 3082 | "type": "git", 3083 | "url": "https://github.com/symfony/process.git", 3084 | "reference": "f5697ab4cb14a5deed7473819e63141bf5352c36" 3085 | }, 3086 | "dist": { 3087 | "type": "zip", 3088 | "url": "https://api.github.com/repos/symfony/process/zipball/f5697ab4cb14a5deed7473819e63141bf5352c36", 3089 | "reference": "f5697ab4cb14a5deed7473819e63141bf5352c36", 3090 | "shasum": "" 3091 | }, 3092 | "require": { 3093 | "php": "^7.1.3" 3094 | }, 3095 | "type": "library", 3096 | "extra": { 3097 | "branch-alias": { 3098 | "dev-master": "4.4-dev" 3099 | } 3100 | }, 3101 | "autoload": { 3102 | "psr-4": { 3103 | "Symfony\\Component\\Process\\": "" 3104 | }, 3105 | "exclude-from-classmap": [ 3106 | "/Tests/" 3107 | ] 3108 | }, 3109 | "notification-url": "https://packagist.org/downloads/", 3110 | "license": [ 3111 | "MIT" 3112 | ], 3113 | "authors": [ 3114 | { 3115 | "name": "Fabien Potencier", 3116 | "email": "fabien@symfony.com" 3117 | }, 3118 | { 3119 | "name": "Symfony Community", 3120 | "homepage": "https://symfony.com/contributors" 3121 | } 3122 | ], 3123 | "description": "Symfony Process Component", 3124 | "homepage": "https://symfony.com", 3125 | "time": "2020-01-09T09:50:08+00:00" 3126 | }, 3127 | { 3128 | "name": "symfony/routing", 3129 | "version": "v4.4.4", 3130 | "source": { 3131 | "type": "git", 3132 | "url": "https://github.com/symfony/routing.git", 3133 | "reference": "7bf4e38573728e317b926ca4482ad30470d0e86a" 3134 | }, 3135 | "dist": { 3136 | "type": "zip", 3137 | "url": "https://api.github.com/repos/symfony/routing/zipball/7bf4e38573728e317b926ca4482ad30470d0e86a", 3138 | "reference": "7bf4e38573728e317b926ca4482ad30470d0e86a", 3139 | "shasum": "" 3140 | }, 3141 | "require": { 3142 | "php": "^7.1.3" 3143 | }, 3144 | "conflict": { 3145 | "symfony/config": "<4.2", 3146 | "symfony/dependency-injection": "<3.4", 3147 | "symfony/yaml": "<3.4" 3148 | }, 3149 | "require-dev": { 3150 | "doctrine/annotations": "~1.2", 3151 | "psr/log": "~1.0", 3152 | "symfony/config": "^4.2|^5.0", 3153 | "symfony/dependency-injection": "^3.4|^4.0|^5.0", 3154 | "symfony/expression-language": "^3.4|^4.0|^5.0", 3155 | "symfony/http-foundation": "^3.4|^4.0|^5.0", 3156 | "symfony/yaml": "^3.4|^4.0|^5.0" 3157 | }, 3158 | "suggest": { 3159 | "doctrine/annotations": "For using the annotation loader", 3160 | "symfony/config": "For using the all-in-one router or any loader", 3161 | "symfony/expression-language": "For using expression matching", 3162 | "symfony/http-foundation": "For using a Symfony Request object", 3163 | "symfony/yaml": "For using the YAML loader" 3164 | }, 3165 | "type": "library", 3166 | "extra": { 3167 | "branch-alias": { 3168 | "dev-master": "4.4-dev" 3169 | } 3170 | }, 3171 | "autoload": { 3172 | "psr-4": { 3173 | "Symfony\\Component\\Routing\\": "" 3174 | }, 3175 | "exclude-from-classmap": [ 3176 | "/Tests/" 3177 | ] 3178 | }, 3179 | "notification-url": "https://packagist.org/downloads/", 3180 | "license": [ 3181 | "MIT" 3182 | ], 3183 | "authors": [ 3184 | { 3185 | "name": "Fabien Potencier", 3186 | "email": "fabien@symfony.com" 3187 | }, 3188 | { 3189 | "name": "Symfony Community", 3190 | "homepage": "https://symfony.com/contributors" 3191 | } 3192 | ], 3193 | "description": "Symfony Routing Component", 3194 | "homepage": "https://symfony.com", 3195 | "keywords": [ 3196 | "router", 3197 | "routing", 3198 | "uri", 3199 | "url" 3200 | ], 3201 | "time": "2020-01-08T17:29:02+00:00" 3202 | }, 3203 | { 3204 | "name": "symfony/service-contracts", 3205 | "version": "v2.0.1", 3206 | "source": { 3207 | "type": "git", 3208 | "url": "https://github.com/symfony/service-contracts.git", 3209 | "reference": "144c5e51266b281231e947b51223ba14acf1a749" 3210 | }, 3211 | "dist": { 3212 | "type": "zip", 3213 | "url": "https://api.github.com/repos/symfony/service-contracts/zipball/144c5e51266b281231e947b51223ba14acf1a749", 3214 | "reference": "144c5e51266b281231e947b51223ba14acf1a749", 3215 | "shasum": "" 3216 | }, 3217 | "require": { 3218 | "php": "^7.2.5", 3219 | "psr/container": "^1.0" 3220 | }, 3221 | "suggest": { 3222 | "symfony/service-implementation": "" 3223 | }, 3224 | "type": "library", 3225 | "extra": { 3226 | "branch-alias": { 3227 | "dev-master": "2.0-dev" 3228 | } 3229 | }, 3230 | "autoload": { 3231 | "psr-4": { 3232 | "Symfony\\Contracts\\Service\\": "" 3233 | } 3234 | }, 3235 | "notification-url": "https://packagist.org/downloads/", 3236 | "license": [ 3237 | "MIT" 3238 | ], 3239 | "authors": [ 3240 | { 3241 | "name": "Nicolas Grekas", 3242 | "email": "p@tchwork.com" 3243 | }, 3244 | { 3245 | "name": "Symfony Community", 3246 | "homepage": "https://symfony.com/contributors" 3247 | } 3248 | ], 3249 | "description": "Generic abstractions related to writing services", 3250 | "homepage": "https://symfony.com", 3251 | "keywords": [ 3252 | "abstractions", 3253 | "contracts", 3254 | "decoupling", 3255 | "interfaces", 3256 | "interoperability", 3257 | "standards" 3258 | ], 3259 | "time": "2019-11-18T17:27:11+00:00" 3260 | }, 3261 | { 3262 | "name": "symfony/translation", 3263 | "version": "v4.4.4", 3264 | "source": { 3265 | "type": "git", 3266 | "url": "https://github.com/symfony/translation.git", 3267 | "reference": "f5d2ac46930238b30a9c2f1b17c905f3697d808c" 3268 | }, 3269 | "dist": { 3270 | "type": "zip", 3271 | "url": "https://api.github.com/repos/symfony/translation/zipball/f5d2ac46930238b30a9c2f1b17c905f3697d808c", 3272 | "reference": "f5d2ac46930238b30a9c2f1b17c905f3697d808c", 3273 | "shasum": "" 3274 | }, 3275 | "require": { 3276 | "php": "^7.1.3", 3277 | "symfony/polyfill-mbstring": "~1.0", 3278 | "symfony/translation-contracts": "^1.1.6|^2" 3279 | }, 3280 | "conflict": { 3281 | "symfony/config": "<3.4", 3282 | "symfony/dependency-injection": "<3.4", 3283 | "symfony/http-kernel": "<4.4", 3284 | "symfony/yaml": "<3.4" 3285 | }, 3286 | "provide": { 3287 | "symfony/translation-implementation": "1.0" 3288 | }, 3289 | "require-dev": { 3290 | "psr/log": "~1.0", 3291 | "symfony/config": "^3.4|^4.0|^5.0", 3292 | "symfony/console": "^3.4|^4.0|^5.0", 3293 | "symfony/dependency-injection": "^3.4|^4.0|^5.0", 3294 | "symfony/finder": "~2.8|~3.0|~4.0|^5.0", 3295 | "symfony/http-kernel": "^4.4", 3296 | "symfony/intl": "^3.4|^4.0|^5.0", 3297 | "symfony/service-contracts": "^1.1.2|^2", 3298 | "symfony/yaml": "^3.4|^4.0|^5.0" 3299 | }, 3300 | "suggest": { 3301 | "psr/log-implementation": "To use logging capability in translator", 3302 | "symfony/config": "", 3303 | "symfony/yaml": "" 3304 | }, 3305 | "type": "library", 3306 | "extra": { 3307 | "branch-alias": { 3308 | "dev-master": "4.4-dev" 3309 | } 3310 | }, 3311 | "autoload": { 3312 | "psr-4": { 3313 | "Symfony\\Component\\Translation\\": "" 3314 | }, 3315 | "exclude-from-classmap": [ 3316 | "/Tests/" 3317 | ] 3318 | }, 3319 | "notification-url": "https://packagist.org/downloads/", 3320 | "license": [ 3321 | "MIT" 3322 | ], 3323 | "authors": [ 3324 | { 3325 | "name": "Fabien Potencier", 3326 | "email": "fabien@symfony.com" 3327 | }, 3328 | { 3329 | "name": "Symfony Community", 3330 | "homepage": "https://symfony.com/contributors" 3331 | } 3332 | ], 3333 | "description": "Symfony Translation Component", 3334 | "homepage": "https://symfony.com", 3335 | "time": "2020-01-15T13:29:06+00:00" 3336 | }, 3337 | { 3338 | "name": "symfony/translation-contracts", 3339 | "version": "v2.0.1", 3340 | "source": { 3341 | "type": "git", 3342 | "url": "https://github.com/symfony/translation-contracts.git", 3343 | "reference": "8cc682ac458d75557203b2f2f14b0b92e1c744ed" 3344 | }, 3345 | "dist": { 3346 | "type": "zip", 3347 | "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/8cc682ac458d75557203b2f2f14b0b92e1c744ed", 3348 | "reference": "8cc682ac458d75557203b2f2f14b0b92e1c744ed", 3349 | "shasum": "" 3350 | }, 3351 | "require": { 3352 | "php": "^7.2.5" 3353 | }, 3354 | "suggest": { 3355 | "symfony/translation-implementation": "" 3356 | }, 3357 | "type": "library", 3358 | "extra": { 3359 | "branch-alias": { 3360 | "dev-master": "2.0-dev" 3361 | } 3362 | }, 3363 | "autoload": { 3364 | "psr-4": { 3365 | "Symfony\\Contracts\\Translation\\": "" 3366 | } 3367 | }, 3368 | "notification-url": "https://packagist.org/downloads/", 3369 | "license": [ 3370 | "MIT" 3371 | ], 3372 | "authors": [ 3373 | { 3374 | "name": "Nicolas Grekas", 3375 | "email": "p@tchwork.com" 3376 | }, 3377 | { 3378 | "name": "Symfony Community", 3379 | "homepage": "https://symfony.com/contributors" 3380 | } 3381 | ], 3382 | "description": "Generic abstractions related to translation", 3383 | "homepage": "https://symfony.com", 3384 | "keywords": [ 3385 | "abstractions", 3386 | "contracts", 3387 | "decoupling", 3388 | "interfaces", 3389 | "interoperability", 3390 | "standards" 3391 | ], 3392 | "time": "2019-11-18T17:27:11+00:00" 3393 | }, 3394 | { 3395 | "name": "symfony/var-dumper", 3396 | "version": "v4.4.17", 3397 | "source": { 3398 | "type": "git", 3399 | "url": "https://github.com/symfony/var-dumper.git", 3400 | "reference": "65c6f1e848cda840ef7278686c8e30a7cc353c93" 3401 | }, 3402 | "dist": { 3403 | "type": "zip", 3404 | "url": "https://api.github.com/repos/symfony/var-dumper/zipball/65c6f1e848cda840ef7278686c8e30a7cc353c93", 3405 | "reference": "65c6f1e848cda840ef7278686c8e30a7cc353c93", 3406 | "shasum": "" 3407 | }, 3408 | "require": { 3409 | "php": ">=7.1.3", 3410 | "symfony/polyfill-mbstring": "~1.0", 3411 | "symfony/polyfill-php72": "~1.5", 3412 | "symfony/polyfill-php80": "^1.15" 3413 | }, 3414 | "conflict": { 3415 | "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", 3416 | "symfony/console": "<3.4" 3417 | }, 3418 | "require-dev": { 3419 | "ext-iconv": "*", 3420 | "symfony/console": "^3.4|^4.0|^5.0", 3421 | "symfony/process": "^4.4|^5.0", 3422 | "twig/twig": "^1.34|^2.4|^3.0" 3423 | }, 3424 | "suggest": { 3425 | "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", 3426 | "ext-intl": "To show region name in time zone dump", 3427 | "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" 3428 | }, 3429 | "bin": [ 3430 | "Resources/bin/var-dump-server" 3431 | ], 3432 | "type": "library", 3433 | "autoload": { 3434 | "files": [ 3435 | "Resources/functions/dump.php" 3436 | ], 3437 | "psr-4": { 3438 | "Symfony\\Component\\VarDumper\\": "" 3439 | }, 3440 | "exclude-from-classmap": [ 3441 | "/Tests/" 3442 | ] 3443 | }, 3444 | "notification-url": "https://packagist.org/downloads/", 3445 | "license": [ 3446 | "MIT" 3447 | ], 3448 | "authors": [ 3449 | { 3450 | "name": "Nicolas Grekas", 3451 | "email": "p@tchwork.com" 3452 | }, 3453 | { 3454 | "name": "Symfony Community", 3455 | "homepage": "https://symfony.com/contributors" 3456 | } 3457 | ], 3458 | "description": "Symfony mechanism for exploring and dumping PHP variables", 3459 | "homepage": "https://symfony.com", 3460 | "keywords": [ 3461 | "debug", 3462 | "dump" 3463 | ], 3464 | "funding": [ 3465 | { 3466 | "url": "https://symfony.com/sponsor", 3467 | "type": "custom" 3468 | }, 3469 | { 3470 | "url": "https://github.com/fabpot", 3471 | "type": "github" 3472 | }, 3473 | { 3474 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3475 | "type": "tidelift" 3476 | } 3477 | ], 3478 | "time": "2020-11-24T09:55:37+00:00" 3479 | }, 3480 | { 3481 | "name": "tijsverkoyen/css-to-inline-styles", 3482 | "version": "2.2.2", 3483 | "source": { 3484 | "type": "git", 3485 | "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", 3486 | "reference": "dda2ee426acd6d801d5b7fd1001cde9b5f790e15" 3487 | }, 3488 | "dist": { 3489 | "type": "zip", 3490 | "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/dda2ee426acd6d801d5b7fd1001cde9b5f790e15", 3491 | "reference": "dda2ee426acd6d801d5b7fd1001cde9b5f790e15", 3492 | "shasum": "" 3493 | }, 3494 | "require": { 3495 | "ext-dom": "*", 3496 | "ext-libxml": "*", 3497 | "php": "^5.5 || ^7.0", 3498 | "symfony/css-selector": "^2.7 || ^3.0 || ^4.0 || ^5.0" 3499 | }, 3500 | "require-dev": { 3501 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" 3502 | }, 3503 | "type": "library", 3504 | "extra": { 3505 | "branch-alias": { 3506 | "dev-master": "2.2.x-dev" 3507 | } 3508 | }, 3509 | "autoload": { 3510 | "psr-4": { 3511 | "TijsVerkoyen\\CssToInlineStyles\\": "src" 3512 | } 3513 | }, 3514 | "notification-url": "https://packagist.org/downloads/", 3515 | "license": [ 3516 | "BSD-3-Clause" 3517 | ], 3518 | "authors": [ 3519 | { 3520 | "name": "Tijs Verkoyen", 3521 | "email": "css_to_inline_styles@verkoyen.eu", 3522 | "role": "Developer" 3523 | } 3524 | ], 3525 | "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.", 3526 | "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", 3527 | "time": "2019-10-24T08:53:34+00:00" 3528 | }, 3529 | { 3530 | "name": "vlucas/phpdotenv", 3531 | "version": "v3.6.0", 3532 | "source": { 3533 | "type": "git", 3534 | "url": "https://github.com/vlucas/phpdotenv.git", 3535 | "reference": "1bdf24f065975594f6a117f0f1f6cabf1333b156" 3536 | }, 3537 | "dist": { 3538 | "type": "zip", 3539 | "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/1bdf24f065975594f6a117f0f1f6cabf1333b156", 3540 | "reference": "1bdf24f065975594f6a117f0f1f6cabf1333b156", 3541 | "shasum": "" 3542 | }, 3543 | "require": { 3544 | "php": "^5.4 || ^7.0", 3545 | "phpoption/phpoption": "^1.5", 3546 | "symfony/polyfill-ctype": "^1.9" 3547 | }, 3548 | "require-dev": { 3549 | "phpunit/phpunit": "^4.8.35 || ^5.0 || ^6.0 || ^7.0" 3550 | }, 3551 | "type": "library", 3552 | "extra": { 3553 | "branch-alias": { 3554 | "dev-master": "3.6-dev" 3555 | } 3556 | }, 3557 | "autoload": { 3558 | "psr-4": { 3559 | "Dotenv\\": "src/" 3560 | } 3561 | }, 3562 | "notification-url": "https://packagist.org/downloads/", 3563 | "license": [ 3564 | "BSD-3-Clause" 3565 | ], 3566 | "authors": [ 3567 | { 3568 | "name": "Graham Campbell", 3569 | "email": "graham@alt-three.com", 3570 | "homepage": "https://gjcampbell.co.uk/" 3571 | }, 3572 | { 3573 | "name": "Vance Lucas", 3574 | "email": "vance@vancelucas.com", 3575 | "homepage": "https://vancelucas.com/" 3576 | } 3577 | ], 3578 | "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", 3579 | "keywords": [ 3580 | "dotenv", 3581 | "env", 3582 | "environment" 3583 | ], 3584 | "time": "2019-09-10T21:37:39+00:00" 3585 | } 3586 | ], 3587 | "packages-dev": [], 3588 | "aliases": [], 3589 | "minimum-stability": "stable", 3590 | "stability-flags": [], 3591 | "prefer-stable": false, 3592 | "prefer-lowest": false, 3593 | "platform": { 3594 | "php": ">=5.4.0" 3595 | }, 3596 | "platform-dev": [], 3597 | "plugin-api-version": "1.1.0" 3598 | } 3599 | -------------------------------------------------------------------------------- /config/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/provisions-group/ms-application-insights-laravel/23678895021632abd1d97b7336afe5c0b67a7fbf/config/.gitkeep -------------------------------------------------------------------------------- /config/MSApplicationInsightsLaravel.php: -------------------------------------------------------------------------------- 1 | Browse > Application Insights > (Application Name) > Settings > Properties 11 | * 12 | * Add the MS_INSTRUMENTATION_KEY field to your application's .env file, 13 | * then paste in the value found on the properties page shown above. 14 | * 15 | * Alternatively, replace the env call below with a string containing your key. 16 | */ 17 | 18 | 'instrumentationKey' => env('MS_INSTRUMENTATION_KEY', null), 19 | 20 | ]; 21 | -------------------------------------------------------------------------------- /src/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/provisions-group/ms-application-insights-laravel/23678895021632abd1d97b7336afe5c0b67a7fbf/src/.gitkeep -------------------------------------------------------------------------------- /src/Exceptions/InvalidMSInstrumentationKeyException.php: -------------------------------------------------------------------------------- 1 | msApplicationInsightsHelpers = $msApplicationInsightsHelpers; 23 | 24 | // Laravel 5.3 introduced a breaking change in the Exception Handler constructor. 25 | // See the section 'Exception Handler'->'Constructor' in https://laravel.com/docs/5.3/upgrade#upgrade-5.3.0 26 | if (version_compare(app()->version(), '5.3.0', '>=')) { 27 | parent::__construct($container); 28 | } else { 29 | parent::__construct($log); 30 | } 31 | } 32 | 33 | /** 34 | * Report or log an exception. 35 | * 36 | * This is a great spot to send exceptions to Sentry, Bugsnag, etc. 37 | * 38 | * @param \Exception $e 39 | * @return void 40 | */ 41 | public function report(Exception $e) 42 | { 43 | foreach ($this->dontReport as $type) 44 | { 45 | if ($e instanceof $type) 46 | { 47 | return parent::report($e); 48 | } 49 | } 50 | 51 | $this->msApplicationInsightsHelpers->trackException($e); 52 | 53 | return parent::report($e); 54 | } 55 | } -------------------------------------------------------------------------------- /src/InstrumentationKey.php: -------------------------------------------------------------------------------- 1 | setInstrumentationKey(); 13 | } 14 | 15 | protected function setInstrumentationKey() 16 | { 17 | $instrumentationKey = config('MSApplicationInsightsLaravel.instrumentationKey'); 18 | 19 | if ( ! empty($instrumentationKey) 20 | && $this->checkInstrumentationKeyValidity($instrumentationKey)) 21 | { 22 | $this->instrumentationKey = $instrumentationKey; 23 | 24 | return; 25 | } 26 | 27 | $this->instrumentationKey = null; 28 | } 29 | 30 | protected function checkInstrumentationKeyValidity($instrumentationKey) 31 | { 32 | if (preg_match('/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/', $instrumentationKey) === 1) 33 | { 34 | return true; 35 | } 36 | 37 | throw new InvalidMSInstrumentationKeyException("'{$instrumentationKey}' is not a valid Microsoft Application Insights instrumentation key."); 38 | } 39 | } -------------------------------------------------------------------------------- /src/MSApplicationInsightsClient.php: -------------------------------------------------------------------------------- 1 | instrumentationKey)) { 8 | return << 19 | SCRIPT; 20 | } 21 | } 22 | } -------------------------------------------------------------------------------- /src/MSApplicationInsightsHelpers.php: -------------------------------------------------------------------------------- 1 | msApplicationInsights = $msApplicationInsights; 22 | } 23 | 24 | /** 25 | * Track a page view 26 | * 27 | * @param $request 28 | * @return void 29 | */ 30 | public function trackPageViewDuration($request) 31 | { 32 | if ($this->telemetryEnabled()) { 33 | if ($request->session()->has('ms_application_insights_page_info')) { 34 | $this->msApplicationInsights->telemetryClient->trackMessage('browse_duration', 35 | $this->getPageViewProperties($request)); 36 | try { 37 | $this->msApplicationInsights->telemetryClient->flush(); 38 | } catch (RequestException $e) {} 39 | } 40 | } 41 | } 42 | 43 | 44 | /** 45 | * Track application performance 46 | * 47 | * @param $request 48 | * @param $response 49 | */ 50 | public function trackRequest($request, $response) 51 | { 52 | if ($this->telemetryEnabled()) 53 | { 54 | if ($this->msApplicationInsights->telemetryClient) 55 | { 56 | $this->msApplicationInsights->telemetryClient->trackRequest( 57 | 'application', 58 | $request->fullUrl(), 59 | $_SERVER['REQUEST_TIME_FLOAT'], 60 | $this->getRequestDuration(), 61 | $this->getResponseCode($response), 62 | $this->isSuccessful($response), 63 | $this->getRequestProperties($request), 64 | $this->getRequestMeasurements($request, $response) 65 | ); 66 | try { 67 | $this->msApplicationInsights->telemetryClient->flush(); 68 | } catch (RequestException $e) {} 69 | } 70 | } 71 | } 72 | 73 | /** 74 | * Track application exceptions 75 | * 76 | * @param Exception $e 77 | */ 78 | public function trackException(Exception $e) 79 | { 80 | if ($this->telemetryEnabled()) { 81 | $this->msApplicationInsights->telemetryClient->trackException($e, 82 | $this->getRequestPropertiesFromException($e)); 83 | try { 84 | $this->msApplicationInsights->telemetryClient->flush(); 85 | } catch (RequestException $e) {} 86 | } 87 | } 88 | 89 | 90 | /** 91 | * Get request properties from the exception trace, if available 92 | * 93 | * @param Exception $e 94 | * 95 | * @return array|null 96 | */ 97 | private function getRequestPropertiesFromException(Exception $e) 98 | { 99 | foreach ($e->getTrace() as $item) 100 | { 101 | if (isset($item['args'])) 102 | { 103 | foreach ($item['args'] as $arg) 104 | { 105 | if ($arg instanceof Request) 106 | { 107 | return $this->getRequestProperties($arg); 108 | } 109 | } 110 | } 111 | } 112 | 113 | return null; 114 | } 115 | 116 | /** 117 | * Flash page info for use in following page request 118 | * 119 | * @param $request 120 | */ 121 | public function flashPageInfo($request) 122 | { 123 | if ($this->telemetryEnabled()) 124 | { 125 | $request->session()->flash('ms_application_insights_page_info', [ 126 | 'url' => $request->fullUrl(), 127 | 'load_time' => microtime(true), 128 | 'properties' => $this->getRequestProperties($request) 129 | ]); 130 | } 131 | 132 | } 133 | 134 | /** 135 | * Determines whether the Telemetry Client is enabled 136 | * 137 | * @return bool 138 | */ 139 | private function telemetryEnabled() 140 | { 141 | return isset($this->msApplicationInsights->telemetryClient); 142 | } 143 | 144 | 145 | /** 146 | * Get properties from the Laravel request 147 | * 148 | * @param $request 149 | * 150 | * @return array|null 151 | */ 152 | private function getRequestProperties($request) 153 | { 154 | $properties = [ 155 | 'ajax' => $request->ajax(), 156 | 'fullUrl' => $request->fullUrl(), 157 | 'ip' => $request->ip(), 158 | 'pjax' => $request->pjax(), 159 | 'secure' => $request->secure(), 160 | ]; 161 | 162 | if ($request->route() 163 | && $request->route()->getName()) 164 | { 165 | $properties['route'] = $request->route()->getName(); 166 | } 167 | 168 | if ($request->user()) 169 | { 170 | $properties['user'] = $request->user()->id; 171 | } 172 | 173 | if ($request->server('HTTP_REFERER')) 174 | { 175 | $properties['referer'] = $request->server('HTTP_REFERER'); 176 | } 177 | 178 | return $properties; 179 | } 180 | 181 | 182 | /** 183 | * Doesn't do a lot right now! 184 | * 185 | * @param $request 186 | * @param $response 187 | * 188 | * @return array|null 189 | */ 190 | private function getRequestMeasurements($request, $response) 191 | { 192 | $measurements = []; 193 | 194 | return ( ! empty($measurements)) ? $measurements : null; 195 | } 196 | 197 | 198 | /** 199 | * Estimate the time spent viewing the previous page 200 | * 201 | * @param $loadTime 202 | * 203 | * @return mixed 204 | */ 205 | private function getPageViewDuration($loadTime) 206 | { 207 | return round(($_SERVER['REQUEST_TIME_FLOAT'] - $loadTime), 2); 208 | } 209 | 210 | /** 211 | * Calculate the time spent processing the request 212 | * 213 | * @return mixed 214 | */ 215 | private function getRequestDuration() 216 | { 217 | return (microtime(true) - $_SERVER['REQUEST_TIME_FLOAT']) * 1000; 218 | } 219 | 220 | 221 | /** 222 | * Determine if the request was successful 223 | * 224 | * @param $response 225 | * 226 | * @return bool 227 | */ 228 | private function isSuccessful($response) 229 | { 230 | return ($this->getResponseCode($response) < 400); 231 | } 232 | 233 | 234 | /** 235 | * Get additional properties for page view at the end of the request 236 | * 237 | * @param $request 238 | * 239 | * @return mixed 240 | */ 241 | private function getPageViewProperties($request) 242 | { 243 | $pageInfo = $request->session()->get('ms_application_insights_page_info'); 244 | 245 | $properties = $pageInfo['properties']; 246 | 247 | $properties['url'] = $pageInfo['url']; 248 | $properties['duration'] = $this->getPageViewDuration($pageInfo['load_time']); 249 | $properties['duration_formatted'] = $this->formatTime($properties['duration']); 250 | 251 | return $properties; 252 | } 253 | 254 | 255 | /** 256 | * Formats time strings into a human-readable format 257 | * 258 | * @param $duration 259 | * 260 | * @return string 261 | */ 262 | private function formatTime($duration) 263 | { 264 | $milliseconds = str_pad((round($duration - floor($duration), 2) * 100), 2, '0', STR_PAD_LEFT); 265 | 266 | if ($duration < 1) { 267 | return "0.{$milliseconds} seconds"; 268 | } 269 | 270 | $seconds = floor($duration % 60); 271 | 272 | if ($duration < 60) { 273 | return "{$seconds}.{$milliseconds} seconds"; 274 | } 275 | 276 | $string = str_pad($seconds, 2, '0', STR_PAD_LEFT) . '.' . $milliseconds; 277 | 278 | $minutes = floor(($duration % 3600) / 60); 279 | 280 | if ($duration < 3600) { 281 | return "{$minutes}:{$string}"; 282 | } 283 | 284 | $string = str_pad($minutes, 2, '0', STR_PAD_LEFT) . ':' . $string; 285 | 286 | $hours = floor(($duration % 86400) / 3600); 287 | 288 | if ($duration < 86400) { 289 | return "{$hours}:{$string}"; 290 | } 291 | 292 | $string = str_pad($hours, 2, '0', STR_PAD_LEFT) . ':' . $string; 293 | 294 | $days = floor($duration / 86400); 295 | 296 | return $days . ':' . $string; 297 | } 298 | 299 | /** 300 | * If you use stream() or streamDownload() then the response object isn't a standard one. Here we check different 301 | * places for the status code depending on the object that Laravel sends us. 302 | * 303 | * @param StreamedResponse|Response $response The response object 304 | * 305 | * @return int The HTTP status code 306 | */ 307 | private function getResponseCode($response) 308 | { 309 | return $response instanceof StreamedResponse ? $response->getStatusCode() : $response->status(); 310 | } 311 | } 312 | -------------------------------------------------------------------------------- /src/MSApplicationInsightsServer.php: -------------------------------------------------------------------------------- 1 | instrumentationKey)) 18 | { 19 | $this->telemetryClient = $telemetryClient; 20 | $this->telemetryClient->getContext()->setInstrumentationKey($this->instrumentationKey); 21 | } 22 | } 23 | 24 | public function __call($name, $arguments) 25 | { 26 | if (isset($this->instrumentationKey, $this->telemetryClient)) { 27 | return call_user_func_array([&$this->telemetryClient, $name], $arguments); 28 | } 29 | } 30 | } -------------------------------------------------------------------------------- /src/Middleware/MSApplicationInsightsMiddleware.php: -------------------------------------------------------------------------------- 1 | msApplicationInsightHelpers = $msApplicationInsightHelpers; 22 | } 23 | 24 | /** 25 | * Handle an incoming request. 26 | * 27 | * @param \Illuminate\Http\Request $request 28 | * @param \Closure $next 29 | * @return mixed 30 | */ 31 | public function handle($request, Closure $next) 32 | { 33 | $this->msApplicationInsightHelpers->trackPageViewDuration($request); 34 | 35 | $response = $next($request); 36 | 37 | $this->msApplicationInsightHelpers->flashPageInfo($request); 38 | 39 | return $response; 40 | } 41 | 42 | /** 43 | * @param \Illuminate\Http\Request $request 44 | * @param \Illuminate\Http\Response $response 45 | * @return void 46 | */ 47 | public function terminate($request, $response) 48 | { 49 | $this->msApplicationInsightHelpers->trackRequest($request, $response); 50 | } 51 | 52 | } -------------------------------------------------------------------------------- /src/Providers/MSApplicationInsightsServiceProvider.php: -------------------------------------------------------------------------------- 1 | handleConfigs(); 26 | } 27 | 28 | /** 29 | * Register the service provider. 30 | * 31 | * @return void 32 | */ 33 | public function register() 34 | { 35 | $this->app->singleton('MSApplicationInsightsServer', function ($app) { 36 | $telemetryClient = new Telemetry_Client(); 37 | return new MSApplicationInsightsServer($telemetryClient); 38 | }); 39 | 40 | $this->app->singleton('MSApplicationInsightsMiddleware', function ($app) { 41 | $msApplicationInsightsHelpers = new MSApplicationInsightsHelpers($app['MSApplicationInsightsServer']); 42 | 43 | return new MSApplicationInsightsMiddleware($msApplicationInsightsHelpers); 44 | }); 45 | 46 | $this->app->singleton('MSApplicationInsightsClient', function ($app) { 47 | return new MSApplicationInsightsClient(); 48 | }); 49 | } 50 | 51 | /** 52 | * Get the services provided by the provider. 53 | * 54 | * @return array 55 | */ 56 | public function provides() { 57 | 58 | return [ 59 | 'MSApplicationInsightsServer', 60 | 'MSApplicationInsightsMiddleware', 61 | 'MSApplicationInsightsClient' 62 | ]; 63 | } 64 | 65 | private function handleConfigs() { 66 | 67 | $configPath = __DIR__ . '/../../config/MSApplicationInsightsLaravel.php'; 68 | 69 | $this->publishes([$configPath => config_path('MSApplicationInsightsLaravel.php')]); 70 | 71 | $this->mergeConfigFrom($configPath, 'MSApplicationInsightsLaravel'); 72 | } 73 | } 74 | --------------------------------------------------------------------------------