├── .editorconfig ├── .gitignore ├── README.md ├── _config.yml ├── composer.json ├── composer.lock └── src ├── Prettus └── RequestLogger │ ├── Contracts │ └── Interpolable.php │ ├── Handler │ └── HttpLoggerHandler.php │ ├── Helpers │ ├── BaseInterpolation.php │ ├── Benchmarking.php │ ├── RequestInterpolation.php │ └── ResponseInterpolation.php │ ├── Jobs │ ├── Compatibility │ │ ├── LogTask51.php │ │ └── LogTask53.php │ └── LogTask.php │ ├── Logger.php │ ├── Providers │ └── LoggerServiceProvider.php │ └── ResponseLogger.php └── resources └── config └── request-logger.php /.editorconfig: -------------------------------------------------------------------------------- 1 | # This file is for unifying the coding style for different editors and IDEs 2 | # editorconfig.org 3 | 4 | root = true 5 | 6 | [*] 7 | charset = utf-8 8 | trim_trailing_whitespace = true 9 | insert_final_newline = true 10 | end_of_line = lf 11 | 12 | [**.less] 13 | indent_style = tab 14 | indent_size = 2 15 | 16 | [**.{css,scss}] 17 | indent_style = tab 18 | indent_size = 2 19 | 20 | [**.php] 21 | indent_style = space 22 | indent_size = 4 23 | 24 | [**.html] 25 | indent_style = tab 26 | indent_size = 2 27 | 28 | [**.js] 29 | indent_style = space 30 | indent_size = 2 31 | 32 | [**.yml] 33 | indent_style = space 34 | indent_size = 2 35 | insert_final_newline = false 36 | 37 | [**.md] 38 | indent_size = 4 39 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by .ignore support plugin (hsz.mobi) 2 | ### JetBrains template 3 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm 4 | 5 | *.iml 6 | 7 | ## Directory-based project format: 8 | .idea/ 9 | # if you remove the above rule, at least ignore the following: 10 | 11 | # User-specific stuff: 12 | # .idea/workspace.xml 13 | # .idea/tasks.xml 14 | # .idea/dictionaries 15 | 16 | # Sensitive or high-churn files: 17 | # .idea/dataSources.ids 18 | # .idea/dataSources.xml 19 | # .idea/sqlDataSources.xml 20 | # .idea/dynamic.xml 21 | # .idea/uiDesigner.xml 22 | 23 | # Gradle: 24 | # .idea/gradle.xml 25 | # .idea/libraries 26 | 27 | # Mongo Explorer plugin: 28 | # .idea/mongoSettings.xml 29 | 30 | ## File-based project format: 31 | *.ipr 32 | *.iws 33 | 34 | ## Plugin-specific files: 35 | 36 | # IntelliJ 37 | out/ 38 | 39 | # mpeltonen/sbt-idea plugin 40 | .idea_modules/ 41 | 42 | # JIRA plugin 43 | atlassian-ide-plugin.xml 44 | 45 | # Crashlytics plugin (for Android Studio and IntelliJ) 46 | com_crashlytics_export_strings.xml 47 | crashlytics.properties 48 | crashlytics-build.properties 49 | 50 | 51 | ### Composer template 52 | composer.phar 53 | vendor/ 54 | 55 | # Commit your application's lock file http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file 56 | # You may choose to ignore a library lock file http://getcomposer.org/doc/02-libraries.md#lock-file 57 | # composer.lock 58 | 59 | 60 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Laravel Request Logger 2 | 3 | Request and Response Logger for Laravel 4 | 5 | Insiperd by [Morgan - Node HTTP request logger](https://github.com/expressjs/morgan) 6 | 7 | [![Latest Stable Version](https://poser.pugx.org/prettus/laravel-request-logger/v/stable.svg)](https://packagist.org/packages/prettus/laravel-request-logger) [![Total Downloads](https://poser.pugx.org/prettus/laravel-request-logger/downloads.svg)](https://packagist.org/packages/prettus/laravel-request-logger) [![Latest Unstable Version](https://poser.pugx.org/prettus/laravel-request-logger/v/unstable.svg)](https://packagist.org/packages/prettus/laravel-request-logger) [![License](https://poser.pugx.org/prettus/laravel-request-logger/license.svg)](https://packagist.org/packages/prettus/laravel-request-logger) 8 | [![Analytics](https://ga-beacon.appspot.com/UA-61050740-1/laravel-request-logger/readme)](https://packagist.org/packages/prettus/laravel-request-logger) 9 | 10 | ## Installation 11 | 12 | ### Composer 13 | 14 | Add `prettus/laravel-request-logger` to the "require" section of your `composer.json` file. 15 | 16 | ```json 17 | "prettus/laravel-request-logger": "1.2.*" 18 | ``` 19 | 20 | Run `composer update` to get the latest version of the package. 21 | 22 | or 23 | 24 | Run `composer require prettus/laravel-request-logger` direct in your terminal 25 | 26 | ### Laravel 27 | 28 | In your `config/app.php` add `Prettus\RequestLogger\Providers\LoggerServiceProvider::class` to the end of the `providers` array: 29 | 30 | ```php 31 | 'providers' => array( 32 | ..., 33 | Prettus\RequestLogger\Providers\LoggerServiceProvider::class, 34 | ), 35 | ``` 36 | 37 | Publish Configuration 38 | 39 | ```shell 40 | php artisan vendor:publish --provider="Prettus\RequestLogger\Providers\LoggerServiceProvider" 41 | ``` 42 | 43 | ## Configuration 44 | 45 | In your `config/request-logger.php` file, you can change configuration for logger 46 | 47 | ```php 48 | 'logger' => [ 49 | 'enabled' => true, 50 | 'handlers' => ['Prettus\RequestLogger\Handler\HttpLoggerHandler'], 51 | 'file' => storage_path("logs/http.log"), 52 | 'level' => 'info', 53 | 'format' => 'common' 54 | ] 55 | ``` 56 | 57 | | Property | Type | Default Value | Description | 58 | |----------|------------|-------------------------------------------------------|-------------| 59 | | enabled | boolean | true | Enable or disable log http | 60 | | handlers | array | ['Prettus\RequestLogger\Handler\HttpLoggerHandler'] | Instance of the `Monolog\Handler\HandlerInterface`. (See more)[https://github.com/Seldaek/monolog#handlers] | 61 | | file | string | storage_path("logs/http.log") | If you are using `Prettus\RequestLogger\Handler\HttpLoggerHandler`, you can set the file will be saved walk logs | 62 | | level | string | info | Level logger write: [notice, info, debug, emergency, alert, critical, error, warning] | 63 | | format | string | common | Format for the log record | 64 | 65 | 66 | 67 | ### Format Interpolation 68 | 69 | #### Variables 70 | 71 | | Format | Description | Exemple | 72 | |----------------|-----------------------------------------------------------------------|-----------------------------------------| 73 | | {method} | Get the request method. | PUT | 74 | | {root} | Get the root URL for the application. | http://prettus.local | 75 | | {url} | Get the URL (no query string) for the request. | http://prettus.local/users | 76 | | {full-url} | Get the full URL for the request. | http://prettus.local/users?search=lorem | 77 | | {path} | Get the current path info for the request. | /users | 78 | | {decoded-path} | Get the current encoded path info for the request. | /users | 79 | | {remote-addr} | Returns the client IP address. | 192.168.10.1 | 80 | | {format} | Gets the format associated with the mime type. | html | 81 | | {scheme} | Gets the request's scheme. | http | 82 | | {port} | Returns the port on which the request is made. | 80 | 83 | | {query-string} | Generates the normalized query string for the Request. | ?search=lorem | 84 | | {remote-user} | Returns the user. | | 85 | | {referer} | The page address (if any) by which the user agent to the current page | | 86 | | {user-agent} | Get user agent | Mozilla/5.0 (Windows NT 6.3; WOW64) | 87 | | {date} | Current Date | 2015-04-05 14:00:00 | 88 | | {content} | Get the response content. | {json:response} | 89 | | {content-length} | Get the content length in bytes | 4863 | 90 | | {response-time} | Response time in ms | 231 | 91 | | {status} | Http status code | 200 | 92 | | {http-version} | Http protocol version | 1.1 | 93 | | {server[*KEY*]} | $_SERVER Server and execution environment information (See more)[http://php.net/manual/reserved.variables.server.php] | | 94 | | {req[*HEADER*]} | Request Header values | | 95 | | {res[*HEADER*]} | Response Header values | | 96 | 97 | 98 | 99 | #### Default formats 100 | 101 | | Name | Format | 102 | |-----------|---------------------------------------------------------------------------------------------------------------------------------------| 103 | | combined | {remote-addr} - {remote-user} [{date}] "{method} {url} HTTP/{http-version}" {status} {content-length} "{referer}" "{user-agent}" | 104 | | common | {remote-addr} - {remote-user} [{date}] "{method} {url} HTTP/{http-version}" {status} {content-length} | 105 | | dev | {method} {url} {status} {response-time} ms - {content-length} | 106 | | short | {remote-addr} {remote-user} {method} {url} HTTP/{http-version} {status} {content-length} - {response-time} ms | 107 | | tiny | {method} {url} {status} {content-length} - {response-time} ms | 108 | 109 | 110 | ## Examples 111 | 112 | `{method} {full-url}` 113 | 114 | ``` 115 | [2015-04-03 00:00:00] local.INFO: GET http://prettus.local/user/1?param=lorem ["REQUEST"] 116 | ``` 117 | 118 | `{method} {full-url} {remote-addr} {port}` 119 | 120 | ``` 121 | [2015-04-03 00:00:00] local.INFO: GET http://prettus.local/user/1?param=lorem 192.168.10.1 80 ["REQUEST"] 122 | ``` 123 | 124 | `{method} {root} {url} {full-url} {path} {decoded-path} {remote-addr} {format} {scheme} {port} {query-string}` 125 | 126 | ``` 127 | [2015-04-03 00:00:00] local.INFO: GET http://prettus.local http://prettus.local/user/1 http://prettus.local/user/1?param=lorem user/1 user/1 192.168.10.1 html http 80 param=lorem ["REQUEST"] 128 | ``` 129 | 130 | `[{status}] HTTP:{http-version} {content}` 131 | 132 | ``` 133 | [2015-04-03 00:00:00] local.INFO: [200] HTTP:1.1 {"id":1,"name":"Anderson Andrade", "email":"contato@andersonandra.de"} ["RESPONSE"] 134 | ``` 135 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-cayman -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "prettus/laravel-request-logger", 3 | "description": "HTTP request logger middleware for Laravel", 4 | "keywords": ["laravel", "logger", "request", "response"], 5 | "license": "MIT", 6 | "authors": [ 7 | { 8 | "name": "Anderson Andrade", 9 | "homepage": "http://andersonandra.de", 10 | "email": "contato@andersonandra.de", 11 | "role": "Developer" 12 | } 13 | ], 14 | "homepage": "http://andersao.github.io/laravel-request-logger", 15 | "support": { 16 | "email": "contato@andersonandra.de", 17 | "issues":"https://github.com/andersao/laravel-request-logger/issues", 18 | "wiki":"https://github.com/andersao/laravel-request-logger", 19 | "source":"https://github.com/andersao/laravel-request-logger", 20 | "docs": "http://andersao.github.io/laravel-request-logger" 21 | }, 22 | "require": { 23 | "php": ">=5.4.0", 24 | "illuminate/support": "~5.0", 25 | "illuminate/http": "~5.0", 26 | "monolog/monolog": "~1.11" 27 | }, 28 | "require-dev" : { 29 | "laravel/framework": "~5.0" 30 | }, 31 | "autoload": { 32 | "psr-4": { 33 | "Prettus\\RequestLogger\\": "src/Prettus/RequestLogger/" 34 | } 35 | }, 36 | "config": { 37 | "preferred-install": "dist" 38 | }, 39 | "extra": { 40 | "laravel": { 41 | "providers": [ 42 | "Prettus\\RequestLogger\\Providers\\LoggerServiceProvider" 43 | ] 44 | }, 45 | "branch-alias": { 46 | "dev-develop": "1.2-dev" 47 | } 48 | }, 49 | "minimum-stability": "stable" 50 | } 51 | -------------------------------------------------------------------------------- /composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "edea3c20ad9b26e29b753e31b7d53f4f", 8 | "packages": [ 9 | { 10 | "name": "doctrine/inflector", 11 | "version": "v1.3.0", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/doctrine/inflector.git", 15 | "reference": "5527a48b7313d15261292c149e55e26eae771b0a" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/doctrine/inflector/zipball/5527a48b7313d15261292c149e55e26eae771b0a", 20 | "reference": "5527a48b7313d15261292c149e55e26eae771b0a", 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": "Roman Borschel", 47 | "email": "roman@code-factory.org" 48 | }, 49 | { 50 | "name": "Benjamin Eberlei", 51 | "email": "kontakt@beberlei.de" 52 | }, 53 | { 54 | "name": "Guilherme Blanco", 55 | "email": "guilhermeblanco@gmail.com" 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": "2018-01-09T20:05:19+00:00" 75 | }, 76 | { 77 | "name": "doctrine/lexer", 78 | "version": "v1.0.1", 79 | "source": { 80 | "type": "git", 81 | "url": "https://github.com/doctrine/lexer.git", 82 | "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c" 83 | }, 84 | "dist": { 85 | "type": "zip", 86 | "url": "https://api.github.com/repos/doctrine/lexer/zipball/83893c552fd2045dd78aef794c31e694c37c0b8c", 87 | "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c", 88 | "shasum": "" 89 | }, 90 | "require": { 91 | "php": ">=5.3.2" 92 | }, 93 | "type": "library", 94 | "extra": { 95 | "branch-alias": { 96 | "dev-master": "1.0.x-dev" 97 | } 98 | }, 99 | "autoload": { 100 | "psr-0": { 101 | "Doctrine\\Common\\Lexer\\": "lib/" 102 | } 103 | }, 104 | "notification-url": "https://packagist.org/downloads/", 105 | "license": [ 106 | "MIT" 107 | ], 108 | "authors": [ 109 | { 110 | "name": "Roman Borschel", 111 | "email": "roman@code-factory.org" 112 | }, 113 | { 114 | "name": "Guilherme Blanco", 115 | "email": "guilhermeblanco@gmail.com" 116 | }, 117 | { 118 | "name": "Johannes Schmitt", 119 | "email": "schmittjoh@gmail.com" 120 | } 121 | ], 122 | "description": "Base library for a lexer that can be used in Top-Down, Recursive Descent Parsers.", 123 | "homepage": "http://www.doctrine-project.org", 124 | "keywords": [ 125 | "lexer", 126 | "parser" 127 | ], 128 | "time": "2014-09-09T13:34:57+00:00" 129 | }, 130 | { 131 | "name": "egulias/email-validator", 132 | "version": "2.1.3", 133 | "source": { 134 | "type": "git", 135 | "url": "https://github.com/egulias/EmailValidator.git", 136 | "reference": "1bec00a10039b823cc94eef4eddd47dcd3b2ca04" 137 | }, 138 | "dist": { 139 | "type": "zip", 140 | "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/1bec00a10039b823cc94eef4eddd47dcd3b2ca04", 141 | "reference": "1bec00a10039b823cc94eef4eddd47dcd3b2ca04", 142 | "shasum": "" 143 | }, 144 | "require": { 145 | "doctrine/lexer": "^1.0.1", 146 | "php": ">= 5.5" 147 | }, 148 | "require-dev": { 149 | "dominicsayers/isemail": "dev-master", 150 | "phpunit/phpunit": "^4.8.35", 151 | "satooshi/php-coveralls": "^1.0.1" 152 | }, 153 | "suggest": { 154 | "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" 155 | }, 156 | "type": "library", 157 | "extra": { 158 | "branch-alias": { 159 | "dev-master": "2.0.x-dev" 160 | } 161 | }, 162 | "autoload": { 163 | "psr-4": { 164 | "Egulias\\EmailValidator\\": "EmailValidator" 165 | } 166 | }, 167 | "notification-url": "https://packagist.org/downloads/", 168 | "license": [ 169 | "MIT" 170 | ], 171 | "authors": [ 172 | { 173 | "name": "Eduardo Gulias Davis" 174 | } 175 | ], 176 | "description": "A library for validating emails against several RFCs", 177 | "homepage": "https://github.com/egulias/EmailValidator", 178 | "keywords": [ 179 | "email", 180 | "emailvalidation", 181 | "emailvalidator", 182 | "validation", 183 | "validator" 184 | ], 185 | "time": "2017-11-15T23:40:40+00:00" 186 | }, 187 | { 188 | "name": "erusev/parsedown", 189 | "version": "1.6.4", 190 | "source": { 191 | "type": "git", 192 | "url": "https://github.com/erusev/parsedown.git", 193 | "reference": "fbe3fe878f4fe69048bb8a52783a09802004f548" 194 | }, 195 | "dist": { 196 | "type": "zip", 197 | "url": "https://api.github.com/repos/erusev/parsedown/zipball/fbe3fe878f4fe69048bb8a52783a09802004f548", 198 | "reference": "fbe3fe878f4fe69048bb8a52783a09802004f548", 199 | "shasum": "" 200 | }, 201 | "require": { 202 | "php": ">=5.3.0" 203 | }, 204 | "require-dev": { 205 | "phpunit/phpunit": "^4.8.35" 206 | }, 207 | "type": "library", 208 | "autoload": { 209 | "psr-0": { 210 | "Parsedown": "" 211 | } 212 | }, 213 | "notification-url": "https://packagist.org/downloads/", 214 | "license": [ 215 | "MIT" 216 | ], 217 | "authors": [ 218 | { 219 | "name": "Emanuil Rusev", 220 | "email": "hello@erusev.com", 221 | "homepage": "http://erusev.com" 222 | } 223 | ], 224 | "description": "Parser for Markdown.", 225 | "homepage": "http://parsedown.org", 226 | "keywords": [ 227 | "markdown", 228 | "parser" 229 | ], 230 | "time": "2017-11-14T20:44:03+00:00" 231 | }, 232 | { 233 | "name": "laravel/framework", 234 | "version": "v5.5.31", 235 | "source": { 236 | "type": "git", 237 | "url": "https://github.com/laravel/framework.git", 238 | "reference": "a47b50a5981c0cf0139939dfaea4191784b65acb" 239 | }, 240 | "dist": { 241 | "type": "zip", 242 | "url": "https://api.github.com/repos/laravel/framework/zipball/a47b50a5981c0cf0139939dfaea4191784b65acb", 243 | "reference": "a47b50a5981c0cf0139939dfaea4191784b65acb", 244 | "shasum": "" 245 | }, 246 | "require": { 247 | "doctrine/inflector": "~1.1", 248 | "erusev/parsedown": "~1.6", 249 | "ext-mbstring": "*", 250 | "ext-openssl": "*", 251 | "league/flysystem": "~1.0", 252 | "monolog/monolog": "~1.12", 253 | "mtdowling/cron-expression": "~1.0", 254 | "nesbot/carbon": "~1.20", 255 | "php": ">=7.0", 256 | "psr/container": "~1.0", 257 | "psr/simple-cache": "^1.0", 258 | "ramsey/uuid": "~3.0", 259 | "swiftmailer/swiftmailer": "~6.0", 260 | "symfony/console": "~3.3", 261 | "symfony/debug": "~3.3", 262 | "symfony/finder": "~3.3", 263 | "symfony/http-foundation": "~3.3", 264 | "symfony/http-kernel": "~3.3", 265 | "symfony/process": "~3.3", 266 | "symfony/routing": "~3.3", 267 | "symfony/var-dumper": "~3.3", 268 | "tijsverkoyen/css-to-inline-styles": "~2.2", 269 | "vlucas/phpdotenv": "~2.2" 270 | }, 271 | "replace": { 272 | "illuminate/auth": "self.version", 273 | "illuminate/broadcasting": "self.version", 274 | "illuminate/bus": "self.version", 275 | "illuminate/cache": "self.version", 276 | "illuminate/config": "self.version", 277 | "illuminate/console": "self.version", 278 | "illuminate/container": "self.version", 279 | "illuminate/contracts": "self.version", 280 | "illuminate/cookie": "self.version", 281 | "illuminate/database": "self.version", 282 | "illuminate/encryption": "self.version", 283 | "illuminate/events": "self.version", 284 | "illuminate/filesystem": "self.version", 285 | "illuminate/hashing": "self.version", 286 | "illuminate/http": "self.version", 287 | "illuminate/log": "self.version", 288 | "illuminate/mail": "self.version", 289 | "illuminate/notifications": "self.version", 290 | "illuminate/pagination": "self.version", 291 | "illuminate/pipeline": "self.version", 292 | "illuminate/queue": "self.version", 293 | "illuminate/redis": "self.version", 294 | "illuminate/routing": "self.version", 295 | "illuminate/session": "self.version", 296 | "illuminate/support": "self.version", 297 | "illuminate/translation": "self.version", 298 | "illuminate/validation": "self.version", 299 | "illuminate/view": "self.version", 300 | "tightenco/collect": "self.version" 301 | }, 302 | "require-dev": { 303 | "aws/aws-sdk-php": "~3.0", 304 | "doctrine/dbal": "~2.5", 305 | "filp/whoops": "^2.1.4", 306 | "mockery/mockery": "~1.0", 307 | "orchestra/testbench-core": "3.5.*", 308 | "pda/pheanstalk": "~3.0", 309 | "phpunit/phpunit": "~6.0", 310 | "predis/predis": "^1.1.1", 311 | "symfony/css-selector": "~3.3", 312 | "symfony/dom-crawler": "~3.3" 313 | }, 314 | "suggest": { 315 | "aws/aws-sdk-php": "Required to use the SQS queue driver and SES mail driver (~3.0).", 316 | "doctrine/dbal": "Required to rename columns and drop SQLite columns (~2.5).", 317 | "ext-pcntl": "Required to use all features of the queue worker.", 318 | "ext-posix": "Required to use all features of the queue worker.", 319 | "fzaninotto/faker": "Required to use the eloquent factory builder (~1.4).", 320 | "guzzlehttp/guzzle": "Required to use the Mailgun and Mandrill mail drivers and the ping methods on schedules (~6.0).", 321 | "laravel/tinker": "Required to use the tinker console command (~1.0).", 322 | "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (~1.0).", 323 | "league/flysystem-cached-adapter": "Required to use Flysystem caching (~1.0).", 324 | "league/flysystem-rackspace": "Required to use the Flysystem Rackspace driver (~1.0).", 325 | "nexmo/client": "Required to use the Nexmo transport (~1.0).", 326 | "pda/pheanstalk": "Required to use the beanstalk queue driver (~3.0).", 327 | "predis/predis": "Required to use the redis cache and queue drivers (~1.0).", 328 | "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (~3.0).", 329 | "symfony/css-selector": "Required to use some of the crawler integration testing tools (~3.3).", 330 | "symfony/dom-crawler": "Required to use most of the crawler integration testing tools (~3.3).", 331 | "symfony/psr-http-message-bridge": "Required to psr7 bridging features (~1.0)." 332 | }, 333 | "type": "library", 334 | "extra": { 335 | "branch-alias": { 336 | "dev-master": "5.5-dev" 337 | } 338 | }, 339 | "autoload": { 340 | "files": [ 341 | "src/Illuminate/Foundation/helpers.php", 342 | "src/Illuminate/Support/helpers.php" 343 | ], 344 | "psr-4": { 345 | "Illuminate\\": "src/Illuminate/" 346 | } 347 | }, 348 | "notification-url": "https://packagist.org/downloads/", 349 | "license": [ 350 | "MIT" 351 | ], 352 | "authors": [ 353 | { 354 | "name": "Taylor Otwell", 355 | "email": "taylor@laravel.com" 356 | } 357 | ], 358 | "description": "The Laravel Framework.", 359 | "homepage": "https://laravel.com", 360 | "keywords": [ 361 | "framework", 362 | "laravel" 363 | ], 364 | "time": "2018-01-16T15:39:45+00:00" 365 | }, 366 | { 367 | "name": "league/flysystem", 368 | "version": "1.0.41", 369 | "source": { 370 | "type": "git", 371 | "url": "https://github.com/thephpleague/flysystem.git", 372 | "reference": "f400aa98912c561ba625ea4065031b7a41e5a155" 373 | }, 374 | "dist": { 375 | "type": "zip", 376 | "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/f400aa98912c561ba625ea4065031b7a41e5a155", 377 | "reference": "f400aa98912c561ba625ea4065031b7a41e5a155", 378 | "shasum": "" 379 | }, 380 | "require": { 381 | "php": ">=5.5.9" 382 | }, 383 | "conflict": { 384 | "league/flysystem-sftp": "<1.0.6" 385 | }, 386 | "require-dev": { 387 | "ext-fileinfo": "*", 388 | "mockery/mockery": "~0.9", 389 | "phpspec/phpspec": "^2.2", 390 | "phpunit/phpunit": "~4.8" 391 | }, 392 | "suggest": { 393 | "ext-fileinfo": "Required for MimeType", 394 | "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2", 395 | "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3", 396 | "league/flysystem-azure": "Allows you to use Windows Azure Blob storage", 397 | "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching", 398 | "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem", 399 | "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files", 400 | "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib", 401 | "league/flysystem-webdav": "Allows you to use WebDAV storage", 402 | "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter", 403 | "spatie/flysystem-dropbox": "Allows you to use Dropbox storage", 404 | "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications" 405 | }, 406 | "type": "library", 407 | "extra": { 408 | "branch-alias": { 409 | "dev-master": "1.1-dev" 410 | } 411 | }, 412 | "autoload": { 413 | "psr-4": { 414 | "League\\Flysystem\\": "src/" 415 | } 416 | }, 417 | "notification-url": "https://packagist.org/downloads/", 418 | "license": [ 419 | "MIT" 420 | ], 421 | "authors": [ 422 | { 423 | "name": "Frank de Jonge", 424 | "email": "info@frenky.net" 425 | } 426 | ], 427 | "description": "Filesystem abstraction: Many filesystems, one API.", 428 | "keywords": [ 429 | "Cloud Files", 430 | "WebDAV", 431 | "abstraction", 432 | "aws", 433 | "cloud", 434 | "copy.com", 435 | "dropbox", 436 | "file systems", 437 | "files", 438 | "filesystem", 439 | "filesystems", 440 | "ftp", 441 | "rackspace", 442 | "remote", 443 | "s3", 444 | "sftp", 445 | "storage" 446 | ], 447 | "time": "2017-08-06T17:41:04+00:00" 448 | }, 449 | { 450 | "name": "monolog/monolog", 451 | "version": "1.23.0", 452 | "source": { 453 | "type": "git", 454 | "url": "https://github.com/Seldaek/monolog.git", 455 | "reference": "fd8c787753b3a2ad11bc60c063cff1358a32a3b4" 456 | }, 457 | "dist": { 458 | "type": "zip", 459 | "url": "https://api.github.com/repos/Seldaek/monolog/zipball/fd8c787753b3a2ad11bc60c063cff1358a32a3b4", 460 | "reference": "fd8c787753b3a2ad11bc60c063cff1358a32a3b4", 461 | "shasum": "" 462 | }, 463 | "require": { 464 | "php": ">=5.3.0", 465 | "psr/log": "~1.0" 466 | }, 467 | "provide": { 468 | "psr/log-implementation": "1.0.0" 469 | }, 470 | "require-dev": { 471 | "aws/aws-sdk-php": "^2.4.9 || ^3.0", 472 | "doctrine/couchdb": "~1.0@dev", 473 | "graylog2/gelf-php": "~1.0", 474 | "jakub-onderka/php-parallel-lint": "0.9", 475 | "php-amqplib/php-amqplib": "~2.4", 476 | "php-console/php-console": "^3.1.3", 477 | "phpunit/phpunit": "~4.5", 478 | "phpunit/phpunit-mock-objects": "2.3.0", 479 | "ruflin/elastica": ">=0.90 <3.0", 480 | "sentry/sentry": "^0.13", 481 | "swiftmailer/swiftmailer": "^5.3|^6.0" 482 | }, 483 | "suggest": { 484 | "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", 485 | "doctrine/couchdb": "Allow sending log messages to a CouchDB server", 486 | "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", 487 | "ext-mongo": "Allow sending log messages to a MongoDB server", 488 | "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", 489 | "mongodb/mongodb": "Allow sending log messages to a MongoDB server via PHP Driver", 490 | "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", 491 | "php-console/php-console": "Allow sending log messages to Google Chrome", 492 | "rollbar/rollbar": "Allow sending log messages to Rollbar", 493 | "ruflin/elastica": "Allow sending log messages to an Elastic Search server", 494 | "sentry/sentry": "Allow sending log messages to a Sentry server" 495 | }, 496 | "type": "library", 497 | "extra": { 498 | "branch-alias": { 499 | "dev-master": "2.0.x-dev" 500 | } 501 | }, 502 | "autoload": { 503 | "psr-4": { 504 | "Monolog\\": "src/Monolog" 505 | } 506 | }, 507 | "notification-url": "https://packagist.org/downloads/", 508 | "license": [ 509 | "MIT" 510 | ], 511 | "authors": [ 512 | { 513 | "name": "Jordi Boggiano", 514 | "email": "j.boggiano@seld.be", 515 | "homepage": "http://seld.be" 516 | } 517 | ], 518 | "description": "Sends your logs to files, sockets, inboxes, databases and various web services", 519 | "homepage": "http://github.com/Seldaek/monolog", 520 | "keywords": [ 521 | "log", 522 | "logging", 523 | "psr-3" 524 | ], 525 | "time": "2017-06-19T01:22:40+00:00" 526 | }, 527 | { 528 | "name": "mtdowling/cron-expression", 529 | "version": "v1.2.1", 530 | "source": { 531 | "type": "git", 532 | "url": "https://github.com/mtdowling/cron-expression.git", 533 | "reference": "9504fa9ea681b586028adaaa0877db4aecf32bad" 534 | }, 535 | "dist": { 536 | "type": "zip", 537 | "url": "https://api.github.com/repos/mtdowling/cron-expression/zipball/9504fa9ea681b586028adaaa0877db4aecf32bad", 538 | "reference": "9504fa9ea681b586028adaaa0877db4aecf32bad", 539 | "shasum": "" 540 | }, 541 | "require": { 542 | "php": ">=5.3.2" 543 | }, 544 | "require-dev": { 545 | "phpunit/phpunit": "~4.0|~5.0" 546 | }, 547 | "type": "library", 548 | "autoload": { 549 | "psr-4": { 550 | "Cron\\": "src/Cron/" 551 | } 552 | }, 553 | "notification-url": "https://packagist.org/downloads/", 554 | "license": [ 555 | "MIT" 556 | ], 557 | "authors": [ 558 | { 559 | "name": "Michael Dowling", 560 | "email": "mtdowling@gmail.com", 561 | "homepage": "https://github.com/mtdowling" 562 | } 563 | ], 564 | "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", 565 | "keywords": [ 566 | "cron", 567 | "schedule" 568 | ], 569 | "time": "2017-01-23T04:29:33+00:00" 570 | }, 571 | { 572 | "name": "nesbot/carbon", 573 | "version": "1.22.1", 574 | "source": { 575 | "type": "git", 576 | "url": "https://github.com/briannesbitt/Carbon.git", 577 | "reference": "7cdf42c0b1cc763ab7e4c33c47a24e27c66bfccc" 578 | }, 579 | "dist": { 580 | "type": "zip", 581 | "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/7cdf42c0b1cc763ab7e4c33c47a24e27c66bfccc", 582 | "reference": "7cdf42c0b1cc763ab7e4c33c47a24e27c66bfccc", 583 | "shasum": "" 584 | }, 585 | "require": { 586 | "php": ">=5.3.0", 587 | "symfony/translation": "~2.6 || ~3.0" 588 | }, 589 | "require-dev": { 590 | "friendsofphp/php-cs-fixer": "~2", 591 | "phpunit/phpunit": "~4.0 || ~5.0" 592 | }, 593 | "type": "library", 594 | "extra": { 595 | "branch-alias": { 596 | "dev-master": "1.23-dev" 597 | } 598 | }, 599 | "autoload": { 600 | "psr-4": { 601 | "Carbon\\": "src/Carbon/" 602 | } 603 | }, 604 | "notification-url": "https://packagist.org/downloads/", 605 | "license": [ 606 | "MIT" 607 | ], 608 | "authors": [ 609 | { 610 | "name": "Brian Nesbitt", 611 | "email": "brian@nesbot.com", 612 | "homepage": "http://nesbot.com" 613 | } 614 | ], 615 | "description": "A simple API extension for DateTime.", 616 | "homepage": "http://carbon.nesbot.com", 617 | "keywords": [ 618 | "date", 619 | "datetime", 620 | "time" 621 | ], 622 | "time": "2017-01-16T07:55:07+00:00" 623 | }, 624 | { 625 | "name": "paragonie/random_compat", 626 | "version": "v2.0.11", 627 | "source": { 628 | "type": "git", 629 | "url": "https://github.com/paragonie/random_compat.git", 630 | "reference": "5da4d3c796c275c55f057af5a643ae297d96b4d8" 631 | }, 632 | "dist": { 633 | "type": "zip", 634 | "url": "https://api.github.com/repos/paragonie/random_compat/zipball/5da4d3c796c275c55f057af5a643ae297d96b4d8", 635 | "reference": "5da4d3c796c275c55f057af5a643ae297d96b4d8", 636 | "shasum": "" 637 | }, 638 | "require": { 639 | "php": ">=5.2.0" 640 | }, 641 | "require-dev": { 642 | "phpunit/phpunit": "4.*|5.*" 643 | }, 644 | "suggest": { 645 | "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." 646 | }, 647 | "type": "library", 648 | "autoload": { 649 | "files": [ 650 | "lib/random.php" 651 | ] 652 | }, 653 | "notification-url": "https://packagist.org/downloads/", 654 | "license": [ 655 | "MIT" 656 | ], 657 | "authors": [ 658 | { 659 | "name": "Paragon Initiative Enterprises", 660 | "email": "security@paragonie.com", 661 | "homepage": "https://paragonie.com" 662 | } 663 | ], 664 | "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", 665 | "keywords": [ 666 | "csprng", 667 | "pseudorandom", 668 | "random" 669 | ], 670 | "time": "2017-09-27T21:40:39+00:00" 671 | }, 672 | { 673 | "name": "psr/container", 674 | "version": "1.0.0", 675 | "source": { 676 | "type": "git", 677 | "url": "https://github.com/php-fig/container.git", 678 | "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" 679 | }, 680 | "dist": { 681 | "type": "zip", 682 | "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", 683 | "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", 684 | "shasum": "" 685 | }, 686 | "require": { 687 | "php": ">=5.3.0" 688 | }, 689 | "type": "library", 690 | "extra": { 691 | "branch-alias": { 692 | "dev-master": "1.0.x-dev" 693 | } 694 | }, 695 | "autoload": { 696 | "psr-4": { 697 | "Psr\\Container\\": "src/" 698 | } 699 | }, 700 | "notification-url": "https://packagist.org/downloads/", 701 | "license": [ 702 | "MIT" 703 | ], 704 | "authors": [ 705 | { 706 | "name": "PHP-FIG", 707 | "homepage": "http://www.php-fig.org/" 708 | } 709 | ], 710 | "description": "Common Container Interface (PHP FIG PSR-11)", 711 | "homepage": "https://github.com/php-fig/container", 712 | "keywords": [ 713 | "PSR-11", 714 | "container", 715 | "container-interface", 716 | "container-interop", 717 | "psr" 718 | ], 719 | "time": "2017-02-14T16:28:37+00:00" 720 | }, 721 | { 722 | "name": "psr/log", 723 | "version": "1.0.2", 724 | "source": { 725 | "type": "git", 726 | "url": "https://github.com/php-fig/log.git", 727 | "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d" 728 | }, 729 | "dist": { 730 | "type": "zip", 731 | "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", 732 | "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", 733 | "shasum": "" 734 | }, 735 | "require": { 736 | "php": ">=5.3.0" 737 | }, 738 | "type": "library", 739 | "extra": { 740 | "branch-alias": { 741 | "dev-master": "1.0.x-dev" 742 | } 743 | }, 744 | "autoload": { 745 | "psr-4": { 746 | "Psr\\Log\\": "Psr/Log/" 747 | } 748 | }, 749 | "notification-url": "https://packagist.org/downloads/", 750 | "license": [ 751 | "MIT" 752 | ], 753 | "authors": [ 754 | { 755 | "name": "PHP-FIG", 756 | "homepage": "http://www.php-fig.org/" 757 | } 758 | ], 759 | "description": "Common interface for logging libraries", 760 | "homepage": "https://github.com/php-fig/log", 761 | "keywords": [ 762 | "log", 763 | "psr", 764 | "psr-3" 765 | ], 766 | "time": "2016-10-10T12:19:37+00:00" 767 | }, 768 | { 769 | "name": "psr/simple-cache", 770 | "version": "1.0.0", 771 | "source": { 772 | "type": "git", 773 | "url": "https://github.com/php-fig/simple-cache.git", 774 | "reference": "753fa598e8f3b9966c886fe13f370baa45ef0e24" 775 | }, 776 | "dist": { 777 | "type": "zip", 778 | "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/753fa598e8f3b9966c886fe13f370baa45ef0e24", 779 | "reference": "753fa598e8f3b9966c886fe13f370baa45ef0e24", 780 | "shasum": "" 781 | }, 782 | "require": { 783 | "php": ">=5.3.0" 784 | }, 785 | "type": "library", 786 | "extra": { 787 | "branch-alias": { 788 | "dev-master": "1.0.x-dev" 789 | } 790 | }, 791 | "autoload": { 792 | "psr-4": { 793 | "Psr\\SimpleCache\\": "src/" 794 | } 795 | }, 796 | "notification-url": "https://packagist.org/downloads/", 797 | "license": [ 798 | "MIT" 799 | ], 800 | "authors": [ 801 | { 802 | "name": "PHP-FIG", 803 | "homepage": "http://www.php-fig.org/" 804 | } 805 | ], 806 | "description": "Common interfaces for simple caching", 807 | "keywords": [ 808 | "cache", 809 | "caching", 810 | "psr", 811 | "psr-16", 812 | "simple-cache" 813 | ], 814 | "time": "2017-01-02T13:31:39+00:00" 815 | }, 816 | { 817 | "name": "ramsey/uuid", 818 | "version": "3.7.2", 819 | "source": { 820 | "type": "git", 821 | "url": "https://github.com/ramsey/uuid.git", 822 | "reference": "bba83ad77bb9deb6d3c352a7361b818e415b221d" 823 | }, 824 | "dist": { 825 | "type": "zip", 826 | "url": "https://api.github.com/repos/ramsey/uuid/zipball/bba83ad77bb9deb6d3c352a7361b818e415b221d", 827 | "reference": "bba83ad77bb9deb6d3c352a7361b818e415b221d", 828 | "shasum": "" 829 | }, 830 | "require": { 831 | "paragonie/random_compat": "^1.0|^2.0", 832 | "php": "^5.4 || ^7.0" 833 | }, 834 | "replace": { 835 | "rhumsaa/uuid": "self.version" 836 | }, 837 | "require-dev": { 838 | "apigen/apigen": "^4.1", 839 | "codeception/aspect-mock": "^1.0 | ~2.0.0", 840 | "doctrine/annotations": "~1.2.0", 841 | "goaop/framework": "1.0.0-alpha.2 | ^1.0 | ^2.1", 842 | "ircmaxell/random-lib": "^1.1", 843 | "jakub-onderka/php-parallel-lint": "^0.9.0", 844 | "mockery/mockery": "^0.9.4", 845 | "moontoast/math": "^1.1", 846 | "php-mock/php-mock-phpunit": "^0.3|^1.1", 847 | "phpunit/phpunit": "^4.7|^5.0", 848 | "satooshi/php-coveralls": "^0.6.1", 849 | "squizlabs/php_codesniffer": "^2.3" 850 | }, 851 | "suggest": { 852 | "ext-libsodium": "Provides the PECL libsodium extension for use with the SodiumRandomGenerator", 853 | "ext-uuid": "Provides the PECL UUID extension for use with the PeclUuidTimeGenerator and PeclUuidRandomGenerator", 854 | "ircmaxell/random-lib": "Provides RandomLib for use with the RandomLibAdapter", 855 | "moontoast/math": "Provides support for converting UUID to 128-bit integer (in string form).", 856 | "ramsey/uuid-console": "A console application for generating UUIDs with ramsey/uuid", 857 | "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." 858 | }, 859 | "type": "library", 860 | "extra": { 861 | "branch-alias": { 862 | "dev-master": "3.x-dev" 863 | } 864 | }, 865 | "autoload": { 866 | "psr-4": { 867 | "Ramsey\\Uuid\\": "src/" 868 | } 869 | }, 870 | "notification-url": "https://packagist.org/downloads/", 871 | "license": [ 872 | "MIT" 873 | ], 874 | "authors": [ 875 | { 876 | "name": "Marijn Huizendveld", 877 | "email": "marijn.huizendveld@gmail.com" 878 | }, 879 | { 880 | "name": "Thibaud Fabre", 881 | "email": "thibaud@aztech.io" 882 | }, 883 | { 884 | "name": "Ben Ramsey", 885 | "email": "ben@benramsey.com", 886 | "homepage": "https://benramsey.com" 887 | } 888 | ], 889 | "description": "Formerly rhumsaa/uuid. A PHP 5.4+ library for generating RFC 4122 version 1, 3, 4, and 5 universally unique identifiers (UUID).", 890 | "homepage": "https://github.com/ramsey/uuid", 891 | "keywords": [ 892 | "guid", 893 | "identifier", 894 | "uuid" 895 | ], 896 | "time": "2018-01-13T22:22:03+00:00" 897 | }, 898 | { 899 | "name": "swiftmailer/swiftmailer", 900 | "version": "v6.0.2", 901 | "source": { 902 | "type": "git", 903 | "url": "https://github.com/swiftmailer/swiftmailer.git", 904 | "reference": "412333372fb6c8ffb65496a2bbd7321af75733fc" 905 | }, 906 | "dist": { 907 | "type": "zip", 908 | "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/412333372fb6c8ffb65496a2bbd7321af75733fc", 909 | "reference": "412333372fb6c8ffb65496a2bbd7321af75733fc", 910 | "shasum": "" 911 | }, 912 | "require": { 913 | "egulias/email-validator": "~2.0", 914 | "php": ">=7.0.0" 915 | }, 916 | "require-dev": { 917 | "mockery/mockery": "~0.9.1", 918 | "symfony/phpunit-bridge": "~3.3@dev" 919 | }, 920 | "type": "library", 921 | "extra": { 922 | "branch-alias": { 923 | "dev-master": "6.0-dev" 924 | } 925 | }, 926 | "autoload": { 927 | "files": [ 928 | "lib/swift_required.php" 929 | ] 930 | }, 931 | "notification-url": "https://packagist.org/downloads/", 932 | "license": [ 933 | "MIT" 934 | ], 935 | "authors": [ 936 | { 937 | "name": "Chris Corbyn" 938 | }, 939 | { 940 | "name": "Fabien Potencier", 941 | "email": "fabien@symfony.com" 942 | } 943 | ], 944 | "description": "Swiftmailer, free feature-rich PHP mailer", 945 | "homepage": "http://swiftmailer.symfony.com", 946 | "keywords": [ 947 | "email", 948 | "mail", 949 | "mailer" 950 | ], 951 | "time": "2017-09-30T22:39:41+00:00" 952 | }, 953 | { 954 | "name": "symfony/console", 955 | "version": "v3.4.3", 956 | "source": { 957 | "type": "git", 958 | "url": "https://github.com/symfony/console.git", 959 | "reference": "8394c8ef121949e8f858f13bc1e34f05169e4e7d" 960 | }, 961 | "dist": { 962 | "type": "zip", 963 | "url": "https://api.github.com/repos/symfony/console/zipball/8394c8ef121949e8f858f13bc1e34f05169e4e7d", 964 | "reference": "8394c8ef121949e8f858f13bc1e34f05169e4e7d", 965 | "shasum": "" 966 | }, 967 | "require": { 968 | "php": "^5.5.9|>=7.0.8", 969 | "symfony/debug": "~2.8|~3.0|~4.0", 970 | "symfony/polyfill-mbstring": "~1.0" 971 | }, 972 | "conflict": { 973 | "symfony/dependency-injection": "<3.4", 974 | "symfony/process": "<3.3" 975 | }, 976 | "require-dev": { 977 | "psr/log": "~1.0", 978 | "symfony/config": "~3.3|~4.0", 979 | "symfony/dependency-injection": "~3.4|~4.0", 980 | "symfony/event-dispatcher": "~2.8|~3.0|~4.0", 981 | "symfony/lock": "~3.4|~4.0", 982 | "symfony/process": "~3.3|~4.0" 983 | }, 984 | "suggest": { 985 | "psr/log": "For using the console logger", 986 | "symfony/event-dispatcher": "", 987 | "symfony/lock": "", 988 | "symfony/process": "" 989 | }, 990 | "type": "library", 991 | "extra": { 992 | "branch-alias": { 993 | "dev-master": "3.4-dev" 994 | } 995 | }, 996 | "autoload": { 997 | "psr-4": { 998 | "Symfony\\Component\\Console\\": "" 999 | }, 1000 | "exclude-from-classmap": [ 1001 | "/Tests/" 1002 | ] 1003 | }, 1004 | "notification-url": "https://packagist.org/downloads/", 1005 | "license": [ 1006 | "MIT" 1007 | ], 1008 | "authors": [ 1009 | { 1010 | "name": "Fabien Potencier", 1011 | "email": "fabien@symfony.com" 1012 | }, 1013 | { 1014 | "name": "Symfony Community", 1015 | "homepage": "https://symfony.com/contributors" 1016 | } 1017 | ], 1018 | "description": "Symfony Console Component", 1019 | "homepage": "https://symfony.com", 1020 | "time": "2018-01-03T07:37:34+00:00" 1021 | }, 1022 | { 1023 | "name": "symfony/css-selector", 1024 | "version": "v4.0.3", 1025 | "source": { 1026 | "type": "git", 1027 | "url": "https://github.com/symfony/css-selector.git", 1028 | "reference": "f97600434e3141ef3cbb9ea42cf500fba88022b7" 1029 | }, 1030 | "dist": { 1031 | "type": "zip", 1032 | "url": "https://api.github.com/repos/symfony/css-selector/zipball/f97600434e3141ef3cbb9ea42cf500fba88022b7", 1033 | "reference": "f97600434e3141ef3cbb9ea42cf500fba88022b7", 1034 | "shasum": "" 1035 | }, 1036 | "require": { 1037 | "php": "^7.1.3" 1038 | }, 1039 | "type": "library", 1040 | "extra": { 1041 | "branch-alias": { 1042 | "dev-master": "4.0-dev" 1043 | } 1044 | }, 1045 | "autoload": { 1046 | "psr-4": { 1047 | "Symfony\\Component\\CssSelector\\": "" 1048 | }, 1049 | "exclude-from-classmap": [ 1050 | "/Tests/" 1051 | ] 1052 | }, 1053 | "notification-url": "https://packagist.org/downloads/", 1054 | "license": [ 1055 | "MIT" 1056 | ], 1057 | "authors": [ 1058 | { 1059 | "name": "Jean-François Simon", 1060 | "email": "jeanfrancois.simon@sensiolabs.com" 1061 | }, 1062 | { 1063 | "name": "Fabien Potencier", 1064 | "email": "fabien@symfony.com" 1065 | }, 1066 | { 1067 | "name": "Symfony Community", 1068 | "homepage": "https://symfony.com/contributors" 1069 | } 1070 | ], 1071 | "description": "Symfony CssSelector Component", 1072 | "homepage": "https://symfony.com", 1073 | "time": "2018-01-03T07:38:00+00:00" 1074 | }, 1075 | { 1076 | "name": "symfony/debug", 1077 | "version": "v3.4.3", 1078 | "source": { 1079 | "type": "git", 1080 | "url": "https://github.com/symfony/debug.git", 1081 | "reference": "603b95dda8b00020e4e6e60dc906e7b715b1c245" 1082 | }, 1083 | "dist": { 1084 | "type": "zip", 1085 | "url": "https://api.github.com/repos/symfony/debug/zipball/603b95dda8b00020e4e6e60dc906e7b715b1c245", 1086 | "reference": "603b95dda8b00020e4e6e60dc906e7b715b1c245", 1087 | "shasum": "" 1088 | }, 1089 | "require": { 1090 | "php": "^5.5.9|>=7.0.8", 1091 | "psr/log": "~1.0" 1092 | }, 1093 | "conflict": { 1094 | "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2" 1095 | }, 1096 | "require-dev": { 1097 | "symfony/http-kernel": "~2.8|~3.0|~4.0" 1098 | }, 1099 | "type": "library", 1100 | "extra": { 1101 | "branch-alias": { 1102 | "dev-master": "3.4-dev" 1103 | } 1104 | }, 1105 | "autoload": { 1106 | "psr-4": { 1107 | "Symfony\\Component\\Debug\\": "" 1108 | }, 1109 | "exclude-from-classmap": [ 1110 | "/Tests/" 1111 | ] 1112 | }, 1113 | "notification-url": "https://packagist.org/downloads/", 1114 | "license": [ 1115 | "MIT" 1116 | ], 1117 | "authors": [ 1118 | { 1119 | "name": "Fabien Potencier", 1120 | "email": "fabien@symfony.com" 1121 | }, 1122 | { 1123 | "name": "Symfony Community", 1124 | "homepage": "https://symfony.com/contributors" 1125 | } 1126 | ], 1127 | "description": "Symfony Debug Component", 1128 | "homepage": "https://symfony.com", 1129 | "time": "2018-01-03T17:14:19+00:00" 1130 | }, 1131 | { 1132 | "name": "symfony/event-dispatcher", 1133 | "version": "v4.0.3", 1134 | "source": { 1135 | "type": "git", 1136 | "url": "https://github.com/symfony/event-dispatcher.git", 1137 | "reference": "74d33aac36208c4d6757807d9f598f0133a3a4eb" 1138 | }, 1139 | "dist": { 1140 | "type": "zip", 1141 | "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/74d33aac36208c4d6757807d9f598f0133a3a4eb", 1142 | "reference": "74d33aac36208c4d6757807d9f598f0133a3a4eb", 1143 | "shasum": "" 1144 | }, 1145 | "require": { 1146 | "php": "^7.1.3" 1147 | }, 1148 | "conflict": { 1149 | "symfony/dependency-injection": "<3.4" 1150 | }, 1151 | "require-dev": { 1152 | "psr/log": "~1.0", 1153 | "symfony/config": "~3.4|~4.0", 1154 | "symfony/dependency-injection": "~3.4|~4.0", 1155 | "symfony/expression-language": "~3.4|~4.0", 1156 | "symfony/stopwatch": "~3.4|~4.0" 1157 | }, 1158 | "suggest": { 1159 | "symfony/dependency-injection": "", 1160 | "symfony/http-kernel": "" 1161 | }, 1162 | "type": "library", 1163 | "extra": { 1164 | "branch-alias": { 1165 | "dev-master": "4.0-dev" 1166 | } 1167 | }, 1168 | "autoload": { 1169 | "psr-4": { 1170 | "Symfony\\Component\\EventDispatcher\\": "" 1171 | }, 1172 | "exclude-from-classmap": [ 1173 | "/Tests/" 1174 | ] 1175 | }, 1176 | "notification-url": "https://packagist.org/downloads/", 1177 | "license": [ 1178 | "MIT" 1179 | ], 1180 | "authors": [ 1181 | { 1182 | "name": "Fabien Potencier", 1183 | "email": "fabien@symfony.com" 1184 | }, 1185 | { 1186 | "name": "Symfony Community", 1187 | "homepage": "https://symfony.com/contributors" 1188 | } 1189 | ], 1190 | "description": "Symfony EventDispatcher Component", 1191 | "homepage": "https://symfony.com", 1192 | "time": "2018-01-03T07:38:00+00:00" 1193 | }, 1194 | { 1195 | "name": "symfony/finder", 1196 | "version": "v3.4.3", 1197 | "source": { 1198 | "type": "git", 1199 | "url": "https://github.com/symfony/finder.git", 1200 | "reference": "613e26310776f49a1773b6737c6bd554b8bc8c6f" 1201 | }, 1202 | "dist": { 1203 | "type": "zip", 1204 | "url": "https://api.github.com/repos/symfony/finder/zipball/613e26310776f49a1773b6737c6bd554b8bc8c6f", 1205 | "reference": "613e26310776f49a1773b6737c6bd554b8bc8c6f", 1206 | "shasum": "" 1207 | }, 1208 | "require": { 1209 | "php": "^5.5.9|>=7.0.8" 1210 | }, 1211 | "type": "library", 1212 | "extra": { 1213 | "branch-alias": { 1214 | "dev-master": "3.4-dev" 1215 | } 1216 | }, 1217 | "autoload": { 1218 | "psr-4": { 1219 | "Symfony\\Component\\Finder\\": "" 1220 | }, 1221 | "exclude-from-classmap": [ 1222 | "/Tests/" 1223 | ] 1224 | }, 1225 | "notification-url": "https://packagist.org/downloads/", 1226 | "license": [ 1227 | "MIT" 1228 | ], 1229 | "authors": [ 1230 | { 1231 | "name": "Fabien Potencier", 1232 | "email": "fabien@symfony.com" 1233 | }, 1234 | { 1235 | "name": "Symfony Community", 1236 | "homepage": "https://symfony.com/contributors" 1237 | } 1238 | ], 1239 | "description": "Symfony Finder Component", 1240 | "homepage": "https://symfony.com", 1241 | "time": "2018-01-03T07:37:34+00:00" 1242 | }, 1243 | { 1244 | "name": "symfony/http-foundation", 1245 | "version": "v3.4.3", 1246 | "source": { 1247 | "type": "git", 1248 | "url": "https://github.com/symfony/http-foundation.git", 1249 | "reference": "4a213be1cc8598089b8c7451529a2927b49b5d26" 1250 | }, 1251 | "dist": { 1252 | "type": "zip", 1253 | "url": "https://api.github.com/repos/symfony/http-foundation/zipball/4a213be1cc8598089b8c7451529a2927b49b5d26", 1254 | "reference": "4a213be1cc8598089b8c7451529a2927b49b5d26", 1255 | "shasum": "" 1256 | }, 1257 | "require": { 1258 | "php": "^5.5.9|>=7.0.8", 1259 | "symfony/polyfill-mbstring": "~1.1", 1260 | "symfony/polyfill-php70": "~1.6" 1261 | }, 1262 | "require-dev": { 1263 | "symfony/expression-language": "~2.8|~3.0|~4.0" 1264 | }, 1265 | "type": "library", 1266 | "extra": { 1267 | "branch-alias": { 1268 | "dev-master": "3.4-dev" 1269 | } 1270 | }, 1271 | "autoload": { 1272 | "psr-4": { 1273 | "Symfony\\Component\\HttpFoundation\\": "" 1274 | }, 1275 | "exclude-from-classmap": [ 1276 | "/Tests/" 1277 | ] 1278 | }, 1279 | "notification-url": "https://packagist.org/downloads/", 1280 | "license": [ 1281 | "MIT" 1282 | ], 1283 | "authors": [ 1284 | { 1285 | "name": "Fabien Potencier", 1286 | "email": "fabien@symfony.com" 1287 | }, 1288 | { 1289 | "name": "Symfony Community", 1290 | "homepage": "https://symfony.com/contributors" 1291 | } 1292 | ], 1293 | "description": "Symfony HttpFoundation Component", 1294 | "homepage": "https://symfony.com", 1295 | "time": "2018-01-03T17:14:19+00:00" 1296 | }, 1297 | { 1298 | "name": "symfony/http-kernel", 1299 | "version": "v3.4.3", 1300 | "source": { 1301 | "type": "git", 1302 | "url": "https://github.com/symfony/http-kernel.git", 1303 | "reference": "1c2a82d6a8ec9b354fe4ef48ad1ad3f1a4f7db0e" 1304 | }, 1305 | "dist": { 1306 | "type": "zip", 1307 | "url": "https://api.github.com/repos/symfony/http-kernel/zipball/1c2a82d6a8ec9b354fe4ef48ad1ad3f1a4f7db0e", 1308 | "reference": "1c2a82d6a8ec9b354fe4ef48ad1ad3f1a4f7db0e", 1309 | "shasum": "" 1310 | }, 1311 | "require": { 1312 | "php": "^5.5.9|>=7.0.8", 1313 | "psr/log": "~1.0", 1314 | "symfony/debug": "~2.8|~3.0|~4.0", 1315 | "symfony/event-dispatcher": "~2.8|~3.0|~4.0", 1316 | "symfony/http-foundation": "^3.3.11|~4.0" 1317 | }, 1318 | "conflict": { 1319 | "symfony/config": "<2.8", 1320 | "symfony/dependency-injection": "<3.4", 1321 | "symfony/var-dumper": "<3.3", 1322 | "twig/twig": "<1.34|<2.4,>=2" 1323 | }, 1324 | "provide": { 1325 | "psr/log-implementation": "1.0" 1326 | }, 1327 | "require-dev": { 1328 | "psr/cache": "~1.0", 1329 | "symfony/browser-kit": "~2.8|~3.0|~4.0", 1330 | "symfony/class-loader": "~2.8|~3.0", 1331 | "symfony/config": "~2.8|~3.0|~4.0", 1332 | "symfony/console": "~2.8|~3.0|~4.0", 1333 | "symfony/css-selector": "~2.8|~3.0|~4.0", 1334 | "symfony/dependency-injection": "~3.4|~4.0", 1335 | "symfony/dom-crawler": "~2.8|~3.0|~4.0", 1336 | "symfony/expression-language": "~2.8|~3.0|~4.0", 1337 | "symfony/finder": "~2.8|~3.0|~4.0", 1338 | "symfony/process": "~2.8|~3.0|~4.0", 1339 | "symfony/routing": "~3.4|~4.0", 1340 | "symfony/stopwatch": "~2.8|~3.0|~4.0", 1341 | "symfony/templating": "~2.8|~3.0|~4.0", 1342 | "symfony/translation": "~2.8|~3.0|~4.0", 1343 | "symfony/var-dumper": "~3.3|~4.0" 1344 | }, 1345 | "suggest": { 1346 | "symfony/browser-kit": "", 1347 | "symfony/config": "", 1348 | "symfony/console": "", 1349 | "symfony/dependency-injection": "", 1350 | "symfony/finder": "", 1351 | "symfony/var-dumper": "" 1352 | }, 1353 | "type": "library", 1354 | "extra": { 1355 | "branch-alias": { 1356 | "dev-master": "3.4-dev" 1357 | } 1358 | }, 1359 | "autoload": { 1360 | "psr-4": { 1361 | "Symfony\\Component\\HttpKernel\\": "" 1362 | }, 1363 | "exclude-from-classmap": [ 1364 | "/Tests/" 1365 | ] 1366 | }, 1367 | "notification-url": "https://packagist.org/downloads/", 1368 | "license": [ 1369 | "MIT" 1370 | ], 1371 | "authors": [ 1372 | { 1373 | "name": "Fabien Potencier", 1374 | "email": "fabien@symfony.com" 1375 | }, 1376 | { 1377 | "name": "Symfony Community", 1378 | "homepage": "https://symfony.com/contributors" 1379 | } 1380 | ], 1381 | "description": "Symfony HttpKernel Component", 1382 | "homepage": "https://symfony.com", 1383 | "time": "2018-01-05T08:33:00+00:00" 1384 | }, 1385 | { 1386 | "name": "symfony/polyfill-mbstring", 1387 | "version": "v1.6.0", 1388 | "source": { 1389 | "type": "git", 1390 | "url": "https://github.com/symfony/polyfill-mbstring.git", 1391 | "reference": "2ec8b39c38cb16674bbf3fea2b6ce5bf117e1296" 1392 | }, 1393 | "dist": { 1394 | "type": "zip", 1395 | "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/2ec8b39c38cb16674bbf3fea2b6ce5bf117e1296", 1396 | "reference": "2ec8b39c38cb16674bbf3fea2b6ce5bf117e1296", 1397 | "shasum": "" 1398 | }, 1399 | "require": { 1400 | "php": ">=5.3.3" 1401 | }, 1402 | "suggest": { 1403 | "ext-mbstring": "For best performance" 1404 | }, 1405 | "type": "library", 1406 | "extra": { 1407 | "branch-alias": { 1408 | "dev-master": "1.6-dev" 1409 | } 1410 | }, 1411 | "autoload": { 1412 | "psr-4": { 1413 | "Symfony\\Polyfill\\Mbstring\\": "" 1414 | }, 1415 | "files": [ 1416 | "bootstrap.php" 1417 | ] 1418 | }, 1419 | "notification-url": "https://packagist.org/downloads/", 1420 | "license": [ 1421 | "MIT" 1422 | ], 1423 | "authors": [ 1424 | { 1425 | "name": "Nicolas Grekas", 1426 | "email": "p@tchwork.com" 1427 | }, 1428 | { 1429 | "name": "Symfony Community", 1430 | "homepage": "https://symfony.com/contributors" 1431 | } 1432 | ], 1433 | "description": "Symfony polyfill for the Mbstring extension", 1434 | "homepage": "https://symfony.com", 1435 | "keywords": [ 1436 | "compatibility", 1437 | "mbstring", 1438 | "polyfill", 1439 | "portable", 1440 | "shim" 1441 | ], 1442 | "time": "2017-10-11T12:05:26+00:00" 1443 | }, 1444 | { 1445 | "name": "symfony/polyfill-php70", 1446 | "version": "v1.6.0", 1447 | "source": { 1448 | "type": "git", 1449 | "url": "https://github.com/symfony/polyfill-php70.git", 1450 | "reference": "0442b9c0596610bd24ae7b5f0a6cdbbc16d9fcff" 1451 | }, 1452 | "dist": { 1453 | "type": "zip", 1454 | "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/0442b9c0596610bd24ae7b5f0a6cdbbc16d9fcff", 1455 | "reference": "0442b9c0596610bd24ae7b5f0a6cdbbc16d9fcff", 1456 | "shasum": "" 1457 | }, 1458 | "require": { 1459 | "paragonie/random_compat": "~1.0|~2.0", 1460 | "php": ">=5.3.3" 1461 | }, 1462 | "type": "library", 1463 | "extra": { 1464 | "branch-alias": { 1465 | "dev-master": "1.6-dev" 1466 | } 1467 | }, 1468 | "autoload": { 1469 | "psr-4": { 1470 | "Symfony\\Polyfill\\Php70\\": "" 1471 | }, 1472 | "files": [ 1473 | "bootstrap.php" 1474 | ], 1475 | "classmap": [ 1476 | "Resources/stubs" 1477 | ] 1478 | }, 1479 | "notification-url": "https://packagist.org/downloads/", 1480 | "license": [ 1481 | "MIT" 1482 | ], 1483 | "authors": [ 1484 | { 1485 | "name": "Nicolas Grekas", 1486 | "email": "p@tchwork.com" 1487 | }, 1488 | { 1489 | "name": "Symfony Community", 1490 | "homepage": "https://symfony.com/contributors" 1491 | } 1492 | ], 1493 | "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions", 1494 | "homepage": "https://symfony.com", 1495 | "keywords": [ 1496 | "compatibility", 1497 | "polyfill", 1498 | "portable", 1499 | "shim" 1500 | ], 1501 | "time": "2017-10-11T12:05:26+00:00" 1502 | }, 1503 | { 1504 | "name": "symfony/process", 1505 | "version": "v3.4.3", 1506 | "source": { 1507 | "type": "git", 1508 | "url": "https://github.com/symfony/process.git", 1509 | "reference": "ff69f110c6b33fd33cd2089ba97d6112f44ef0ba" 1510 | }, 1511 | "dist": { 1512 | "type": "zip", 1513 | "url": "https://api.github.com/repos/symfony/process/zipball/ff69f110c6b33fd33cd2089ba97d6112f44ef0ba", 1514 | "reference": "ff69f110c6b33fd33cd2089ba97d6112f44ef0ba", 1515 | "shasum": "" 1516 | }, 1517 | "require": { 1518 | "php": "^5.5.9|>=7.0.8" 1519 | }, 1520 | "type": "library", 1521 | "extra": { 1522 | "branch-alias": { 1523 | "dev-master": "3.4-dev" 1524 | } 1525 | }, 1526 | "autoload": { 1527 | "psr-4": { 1528 | "Symfony\\Component\\Process\\": "" 1529 | }, 1530 | "exclude-from-classmap": [ 1531 | "/Tests/" 1532 | ] 1533 | }, 1534 | "notification-url": "https://packagist.org/downloads/", 1535 | "license": [ 1536 | "MIT" 1537 | ], 1538 | "authors": [ 1539 | { 1540 | "name": "Fabien Potencier", 1541 | "email": "fabien@symfony.com" 1542 | }, 1543 | { 1544 | "name": "Symfony Community", 1545 | "homepage": "https://symfony.com/contributors" 1546 | } 1547 | ], 1548 | "description": "Symfony Process Component", 1549 | "homepage": "https://symfony.com", 1550 | "time": "2018-01-03T07:37:34+00:00" 1551 | }, 1552 | { 1553 | "name": "symfony/routing", 1554 | "version": "v3.4.3", 1555 | "source": { 1556 | "type": "git", 1557 | "url": "https://github.com/symfony/routing.git", 1558 | "reference": "e2b6d6fe7b090c7af720b75c7722c6dfa7a52658" 1559 | }, 1560 | "dist": { 1561 | "type": "zip", 1562 | "url": "https://api.github.com/repos/symfony/routing/zipball/e2b6d6fe7b090c7af720b75c7722c6dfa7a52658", 1563 | "reference": "e2b6d6fe7b090c7af720b75c7722c6dfa7a52658", 1564 | "shasum": "" 1565 | }, 1566 | "require": { 1567 | "php": "^5.5.9|>=7.0.8" 1568 | }, 1569 | "conflict": { 1570 | "symfony/config": "<2.8", 1571 | "symfony/dependency-injection": "<3.3", 1572 | "symfony/yaml": "<3.4" 1573 | }, 1574 | "require-dev": { 1575 | "doctrine/annotations": "~1.0", 1576 | "doctrine/common": "~2.2", 1577 | "psr/log": "~1.0", 1578 | "symfony/config": "~2.8|~3.0|~4.0", 1579 | "symfony/dependency-injection": "~3.3|~4.0", 1580 | "symfony/expression-language": "~2.8|~3.0|~4.0", 1581 | "symfony/http-foundation": "~2.8|~3.0|~4.0", 1582 | "symfony/yaml": "~3.4|~4.0" 1583 | }, 1584 | "suggest": { 1585 | "doctrine/annotations": "For using the annotation loader", 1586 | "symfony/config": "For using the all-in-one router or any loader", 1587 | "symfony/dependency-injection": "For loading routes from a service", 1588 | "symfony/expression-language": "For using expression matching", 1589 | "symfony/http-foundation": "For using a Symfony Request object", 1590 | "symfony/yaml": "For using the YAML loader" 1591 | }, 1592 | "type": "library", 1593 | "extra": { 1594 | "branch-alias": { 1595 | "dev-master": "3.4-dev" 1596 | } 1597 | }, 1598 | "autoload": { 1599 | "psr-4": { 1600 | "Symfony\\Component\\Routing\\": "" 1601 | }, 1602 | "exclude-from-classmap": [ 1603 | "/Tests/" 1604 | ] 1605 | }, 1606 | "notification-url": "https://packagist.org/downloads/", 1607 | "license": [ 1608 | "MIT" 1609 | ], 1610 | "authors": [ 1611 | { 1612 | "name": "Fabien Potencier", 1613 | "email": "fabien@symfony.com" 1614 | }, 1615 | { 1616 | "name": "Symfony Community", 1617 | "homepage": "https://symfony.com/contributors" 1618 | } 1619 | ], 1620 | "description": "Symfony Routing Component", 1621 | "homepage": "https://symfony.com", 1622 | "keywords": [ 1623 | "router", 1624 | "routing", 1625 | "uri", 1626 | "url" 1627 | ], 1628 | "time": "2018-01-04T15:09:34+00:00" 1629 | }, 1630 | { 1631 | "name": "symfony/translation", 1632 | "version": "v3.4.3", 1633 | "source": { 1634 | "type": "git", 1635 | "url": "https://github.com/symfony/translation.git", 1636 | "reference": "17b5962d252b2d6d1d37a2485ebb7ddc5b2bef0a" 1637 | }, 1638 | "dist": { 1639 | "type": "zip", 1640 | "url": "https://api.github.com/repos/symfony/translation/zipball/17b5962d252b2d6d1d37a2485ebb7ddc5b2bef0a", 1641 | "reference": "17b5962d252b2d6d1d37a2485ebb7ddc5b2bef0a", 1642 | "shasum": "" 1643 | }, 1644 | "require": { 1645 | "php": "^5.5.9|>=7.0.8", 1646 | "symfony/polyfill-mbstring": "~1.0" 1647 | }, 1648 | "conflict": { 1649 | "symfony/config": "<2.8", 1650 | "symfony/dependency-injection": "<3.4", 1651 | "symfony/yaml": "<3.4" 1652 | }, 1653 | "require-dev": { 1654 | "psr/log": "~1.0", 1655 | "symfony/config": "~2.8|~3.0|~4.0", 1656 | "symfony/dependency-injection": "~3.4|~4.0", 1657 | "symfony/finder": "~2.8|~3.0|~4.0", 1658 | "symfony/intl": "^2.8.18|^3.2.5|~4.0", 1659 | "symfony/yaml": "~3.4|~4.0" 1660 | }, 1661 | "suggest": { 1662 | "psr/log": "To use logging capability in translator", 1663 | "symfony/config": "", 1664 | "symfony/yaml": "" 1665 | }, 1666 | "type": "library", 1667 | "extra": { 1668 | "branch-alias": { 1669 | "dev-master": "3.4-dev" 1670 | } 1671 | }, 1672 | "autoload": { 1673 | "psr-4": { 1674 | "Symfony\\Component\\Translation\\": "" 1675 | }, 1676 | "exclude-from-classmap": [ 1677 | "/Tests/" 1678 | ] 1679 | }, 1680 | "notification-url": "https://packagist.org/downloads/", 1681 | "license": [ 1682 | "MIT" 1683 | ], 1684 | "authors": [ 1685 | { 1686 | "name": "Fabien Potencier", 1687 | "email": "fabien@symfony.com" 1688 | }, 1689 | { 1690 | "name": "Symfony Community", 1691 | "homepage": "https://symfony.com/contributors" 1692 | } 1693 | ], 1694 | "description": "Symfony Translation Component", 1695 | "homepage": "https://symfony.com", 1696 | "time": "2018-01-03T07:37:34+00:00" 1697 | }, 1698 | { 1699 | "name": "symfony/var-dumper", 1700 | "version": "v3.4.3", 1701 | "source": { 1702 | "type": "git", 1703 | "url": "https://github.com/symfony/var-dumper.git", 1704 | "reference": "545be7e78ccbec43e599f10ff7500d0b09eda9d0" 1705 | }, 1706 | "dist": { 1707 | "type": "zip", 1708 | "url": "https://api.github.com/repos/symfony/var-dumper/zipball/545be7e78ccbec43e599f10ff7500d0b09eda9d0", 1709 | "reference": "545be7e78ccbec43e599f10ff7500d0b09eda9d0", 1710 | "shasum": "" 1711 | }, 1712 | "require": { 1713 | "php": "^5.5.9|>=7.0.8", 1714 | "symfony/polyfill-mbstring": "~1.0" 1715 | }, 1716 | "conflict": { 1717 | "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0" 1718 | }, 1719 | "require-dev": { 1720 | "ext-iconv": "*", 1721 | "twig/twig": "~1.34|~2.4" 1722 | }, 1723 | "suggest": { 1724 | "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", 1725 | "ext-intl": "To show region name in time zone dump", 1726 | "ext-symfony_debug": "" 1727 | }, 1728 | "type": "library", 1729 | "extra": { 1730 | "branch-alias": { 1731 | "dev-master": "3.4-dev" 1732 | } 1733 | }, 1734 | "autoload": { 1735 | "files": [ 1736 | "Resources/functions/dump.php" 1737 | ], 1738 | "psr-4": { 1739 | "Symfony\\Component\\VarDumper\\": "" 1740 | }, 1741 | "exclude-from-classmap": [ 1742 | "/Tests/" 1743 | ] 1744 | }, 1745 | "notification-url": "https://packagist.org/downloads/", 1746 | "license": [ 1747 | "MIT" 1748 | ], 1749 | "authors": [ 1750 | { 1751 | "name": "Nicolas Grekas", 1752 | "email": "p@tchwork.com" 1753 | }, 1754 | { 1755 | "name": "Symfony Community", 1756 | "homepage": "https://symfony.com/contributors" 1757 | } 1758 | ], 1759 | "description": "Symfony mechanism for exploring and dumping PHP variables", 1760 | "homepage": "https://symfony.com", 1761 | "keywords": [ 1762 | "debug", 1763 | "dump" 1764 | ], 1765 | "time": "2018-01-03T17:14:19+00:00" 1766 | }, 1767 | { 1768 | "name": "tijsverkoyen/css-to-inline-styles", 1769 | "version": "2.2.1", 1770 | "source": { 1771 | "type": "git", 1772 | "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", 1773 | "reference": "0ed4a2ea4e0902dac0489e6436ebcd5bbcae9757" 1774 | }, 1775 | "dist": { 1776 | "type": "zip", 1777 | "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/0ed4a2ea4e0902dac0489e6436ebcd5bbcae9757", 1778 | "reference": "0ed4a2ea4e0902dac0489e6436ebcd5bbcae9757", 1779 | "shasum": "" 1780 | }, 1781 | "require": { 1782 | "php": "^5.5 || ^7.0", 1783 | "symfony/css-selector": "^2.7 || ^3.0 || ^4.0" 1784 | }, 1785 | "require-dev": { 1786 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" 1787 | }, 1788 | "type": "library", 1789 | "extra": { 1790 | "branch-alias": { 1791 | "dev-master": "2.2.x-dev" 1792 | } 1793 | }, 1794 | "autoload": { 1795 | "psr-4": { 1796 | "TijsVerkoyen\\CssToInlineStyles\\": "src" 1797 | } 1798 | }, 1799 | "notification-url": "https://packagist.org/downloads/", 1800 | "license": [ 1801 | "BSD-3-Clause" 1802 | ], 1803 | "authors": [ 1804 | { 1805 | "name": "Tijs Verkoyen", 1806 | "email": "css_to_inline_styles@verkoyen.eu", 1807 | "role": "Developer" 1808 | } 1809 | ], 1810 | "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.", 1811 | "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", 1812 | "time": "2017-11-27T11:13:29+00:00" 1813 | }, 1814 | { 1815 | "name": "vlucas/phpdotenv", 1816 | "version": "v2.4.0", 1817 | "source": { 1818 | "type": "git", 1819 | "url": "https://github.com/vlucas/phpdotenv.git", 1820 | "reference": "3cc116adbe4b11be5ec557bf1d24dc5e3a21d18c" 1821 | }, 1822 | "dist": { 1823 | "type": "zip", 1824 | "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/3cc116adbe4b11be5ec557bf1d24dc5e3a21d18c", 1825 | "reference": "3cc116adbe4b11be5ec557bf1d24dc5e3a21d18c", 1826 | "shasum": "" 1827 | }, 1828 | "require": { 1829 | "php": ">=5.3.9" 1830 | }, 1831 | "require-dev": { 1832 | "phpunit/phpunit": "^4.8 || ^5.0" 1833 | }, 1834 | "type": "library", 1835 | "extra": { 1836 | "branch-alias": { 1837 | "dev-master": "2.4-dev" 1838 | } 1839 | }, 1840 | "autoload": { 1841 | "psr-4": { 1842 | "Dotenv\\": "src/" 1843 | } 1844 | }, 1845 | "notification-url": "https://packagist.org/downloads/", 1846 | "license": [ 1847 | "BSD-3-Clause-Attribution" 1848 | ], 1849 | "authors": [ 1850 | { 1851 | "name": "Vance Lucas", 1852 | "email": "vance@vancelucas.com", 1853 | "homepage": "http://www.vancelucas.com" 1854 | } 1855 | ], 1856 | "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", 1857 | "keywords": [ 1858 | "dotenv", 1859 | "env", 1860 | "environment" 1861 | ], 1862 | "time": "2016-09-01T10:05:43+00:00" 1863 | } 1864 | ], 1865 | "packages-dev": [], 1866 | "aliases": [], 1867 | "minimum-stability": "stable", 1868 | "stability-flags": [], 1869 | "prefer-stable": false, 1870 | "prefer-lowest": false, 1871 | "platform": { 1872 | "php": ">=5.4.0" 1873 | }, 1874 | "platform-dev": [] 1875 | } 1876 | -------------------------------------------------------------------------------- /src/Prettus/RequestLogger/Contracts/Interpolable.php: -------------------------------------------------------------------------------- 1 | 7 | */ 8 | interface Interpolable { 9 | 10 | /** 11 | * @param string $text 12 | * @return string 13 | */ 14 | public function interpolate($text); 15 | } 16 | -------------------------------------------------------------------------------- /src/Prettus/RequestLogger/Handler/HttpLoggerHandler.php: -------------------------------------------------------------------------------- 1 | 11 | */ 12 | class HttpLoggerHandler extends RotatingFileHandler implements HandlerInterface { 13 | 14 | public function __construct($filename = null, $maxFiles = 0, $level = Logger::DEBUG, $bubble = true, $filePermission = null, $useLocking = false) 15 | { 16 | 17 | $filename = !is_null($filename) ? $filename : config("request-logger.logger.file", storage_path("logs/http.log") ); 18 | parent::__construct($filename, $maxFiles, $level, $bubble, $filePermission, $useLocking); 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /src/Prettus/RequestLogger/Helpers/BaseInterpolation.php: -------------------------------------------------------------------------------- 1 | 12 | */ 13 | abstract class BaseInterpolation implements Interpolable { 14 | 15 | /** 16 | * @var Request 17 | */ 18 | protected $request; 19 | 20 | /** 21 | * @var Response 22 | */ 23 | protected $response; 24 | 25 | /** 26 | * @param Request $request 27 | */ 28 | public function setRequest(Request $request) 29 | { 30 | $this->request = $request; 31 | } 32 | 33 | /** 34 | * @param Response $response 35 | */ 36 | public function setResponse(Response $response) 37 | { 38 | $this->response = $response; 39 | } 40 | 41 | /** 42 | * @param string $raw 43 | */ 44 | protected function escape($raw) 45 | { 46 | return preg_replace('/\s/', "\\s", $raw); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/Prettus/RequestLogger/Helpers/Benchmarking.php: -------------------------------------------------------------------------------- 1 | 7 | */ 8 | class Benchmarking 9 | { 10 | 11 | /** 12 | * @var array 13 | */ 14 | protected static $timers = []; 15 | 16 | /** 17 | * @param $name 18 | * @return mixed 19 | */ 20 | public static function start($name) 21 | { 22 | $start = microtime(true); 23 | 24 | static::$timers[$name] = [ 25 | 'start'=>$start 26 | ]; 27 | 28 | return $start; 29 | } 30 | 31 | /** 32 | * @param $name 33 | * @return float 34 | * @throws \Exception 35 | */ 36 | public static function end($name) 37 | { 38 | 39 | $end = microtime(true); 40 | 41 | if( isset(static::$timers[$name]) && isset(static::$timers[$name]['start']) ) { 42 | 43 | if( isset(static::$timers[$name]['duration']) ){ 44 | return static::$timers[$name]['duration']; 45 | } 46 | 47 | $start = static::$timers[$name]['start']; 48 | static::$timers[$name]['end'] = $end; 49 | static::$timers[$name]['duration'] = $end - $start; 50 | 51 | return static::$timers[$name]['duration']; 52 | } 53 | 54 | throw new \Exception("Benchmarking '{$name}' not started"); 55 | } 56 | 57 | /** 58 | * @param $name 59 | * @return float 60 | * @throws \Exception 61 | */ 62 | public static function duration($name) 63 | { 64 | return static::end($name); 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /src/Prettus/RequestLogger/Helpers/RequestInterpolation.php: -------------------------------------------------------------------------------- 1 | 9 | */ 10 | class RequestInterpolation extends BaseInterpolation { 11 | 12 | /** 13 | * @param string $text 14 | * @return string 15 | */ 16 | public function interpolate($text) 17 | { 18 | 19 | $variables = explode(" ",$text); 20 | 21 | foreach( $variables as $variable ) { 22 | $matches = []; 23 | preg_match("/{\s*(.+?)\s*}(\r?\n)?/", $variable, $matches); 24 | if( isset($matches[1]) ) { 25 | $value = $this->escape($this->resolveVariable($matches[0], $matches[1])); 26 | $text = str_replace($matches[0], $value, $text); 27 | } 28 | } 29 | 30 | return $text; 31 | } 32 | 33 | /** 34 | * @param $raw 35 | * @param $variable 36 | * @return string 37 | */ 38 | public function resolveVariable($raw, $variable) 39 | { 40 | $method = str_replace([ 41 | "remoteAddr", 42 | "scheme", 43 | "port", 44 | "queryString", 45 | "remoteUser", 46 | "referrer", 47 | 'body' 48 | ], [ 49 | "ip", 50 | "getScheme", 51 | "getPort", 52 | "getQueryString", 53 | "getUser", 54 | "referer", 55 | "getContent" 56 | ],camel_case($variable)); 57 | 58 | $server_var = str_replace([ 59 | "ACCEPT", 60 | "ACCEPT_CHARSET", 61 | "ACCEPT_ENCODING", 62 | "ACCEPT_LANGUAGE", 63 | "HOST", 64 | "REFERER", 65 | "USER_AGENT", 66 | ], [ 67 | "HTTP_ACCEPT", 68 | "HTTP_ACCEPT_CHARSET", 69 | "HTTP_ACCEPT_ENCODING", 70 | "HTTP_ACCEPT_LANGUAGE", 71 | "HTTP_HOST", 72 | "HTTP_REFERER", 73 | "HTTP_USER_AGENT" 74 | ], strtoupper(str_replace("-","_", $variable)) ); 75 | 76 | if( method_exists($this->request, $method) ) { 77 | return $this->request->$method(); 78 | } elseif( isset($_SERVER[$server_var]) ) { 79 | return $this->request->server($server_var); 80 | } else { 81 | $matches = []; 82 | preg_match("/([-\w]{2,})(?:\[([^\]]+)\])?/", $variable, $matches); 83 | 84 | if( count($matches) == 2 ) { 85 | switch($matches[0]) { 86 | case "date": 87 | $matches[] = "clf"; 88 | break; 89 | } 90 | } 91 | 92 | if( is_array($matches) && count($matches) == 3 ) { 93 | list($line, $var, $option) = $matches; 94 | 95 | switch(strtolower($var)) { 96 | case "date": 97 | 98 | $formats = [ 99 | "clf"=>Carbon::now()->format("d/M/Y:H:i:s O"), 100 | "iso"=>Carbon::now()->toIso8601String(), 101 | "web"=>Carbon::now()->toRfc1123String() 102 | ]; 103 | 104 | return isset($formats[$option]) ? $formats[$option] : Carbon::now()->format($option); 105 | 106 | case "req": 107 | case "header": 108 | return $this->request->header(strtolower($option)); 109 | case "server": 110 | return $this->request->server($option); 111 | default; 112 | return $raw; 113 | } 114 | } 115 | } 116 | 117 | return $raw; 118 | } 119 | } 120 | -------------------------------------------------------------------------------- /src/Prettus/RequestLogger/Helpers/ResponseInterpolation.php: -------------------------------------------------------------------------------- 1 | 7 | */ 8 | class ResponseInterpolation extends BaseInterpolation { 9 | 10 | /** 11 | * @param string $text 12 | * @return string 13 | */ 14 | public function interpolate($text) 15 | { 16 | $variables = explode(" ",$text); 17 | 18 | foreach( $variables as $variable ) { 19 | $matches = []; 20 | preg_match("/{\s*(.+?)\s*}(\r?\n)?/", $variable, $matches); 21 | if( isset($matches[1]) ) { 22 | $value = $this->escape($this->resolveVariable($matches[0], $matches[1])); 23 | $text = str_replace($matches[0], $value, $text); 24 | } 25 | } 26 | 27 | return $text; 28 | } 29 | 30 | /** 31 | * @param $raw 32 | * @param $variable 33 | * @return string 34 | */ 35 | public function resolveVariable($raw, $variable) 36 | { 37 | $method = str_replace([ 38 | "content", 39 | "httpVersion", 40 | "status", 41 | "statusCode" 42 | ], [ 43 | "getContent", 44 | "getProtocolVersion", 45 | "getStatusCode", 46 | "getStatusCode" 47 | ],camel_case($variable)); 48 | 49 | if( method_exists($this->response, $method) ) { 50 | return $this->response->$method(); 51 | } elseif( method_exists($this, $method) ) { 52 | return $this->$method(); 53 | } else { 54 | $matches = []; 55 | preg_match("/([-\w]{2,})(?:\[([^\]]+)\])?/", $variable, $matches); 56 | 57 | if( count($matches) == 3 ) { 58 | list($line, $var, $option) = $matches; 59 | 60 | switch(strtolower($var)) { 61 | case "res": 62 | return $this->response->headers->get($option); 63 | default; 64 | return $raw; 65 | } 66 | } 67 | } 68 | 69 | return $raw; 70 | } 71 | 72 | /** 73 | * @return int 74 | */ 75 | public function getContentLength() 76 | { 77 | 78 | $path = storage_path("framework".DIRECTORY_SEPARATOR."temp"); 79 | 80 | if( !file_exists($path)){ 81 | mkdir($path, 0777, true); 82 | } 83 | 84 | $content = $this->response->getContent(); 85 | $file = $path.DIRECTORY_SEPARATOR."response-".time(); 86 | file_put_contents($file, $content); 87 | $content_length = filesize($file); 88 | unlink($file); 89 | 90 | return $content_length; 91 | } 92 | 93 | /** 94 | * @return float|null 95 | */ 96 | public function responseTime() 97 | { 98 | try{ 99 | return Benchmarking::duration('application'); 100 | }catch (\Exception $e){ 101 | return null; 102 | } 103 | } 104 | } 105 | -------------------------------------------------------------------------------- /src/Prettus/RequestLogger/Jobs/Compatibility/LogTask51.php: -------------------------------------------------------------------------------- 1 | 15 | */ 16 | class LogTask51 implements SelfHandling, ShouldQueue 17 | { 18 | use Queueable, InteractsWithQueue, SerializesModels; 19 | 20 | protected $request; 21 | protected $response; 22 | 23 | /** 24 | * LogTask constructor. 25 | * @param $request 26 | * @param $response 27 | */ 28 | public function __construct($request, $response) 29 | { 30 | $this->request = $request; 31 | $this->response = $response; 32 | } 33 | 34 | /** 35 | * Execute the job. 36 | */ 37 | public function handle() 38 | { 39 | $requestLogger = app(\Prettus\RequestLogger\ResponseLogger::class); 40 | $requestLogger->log($this->request, $this->response); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/Prettus/RequestLogger/Jobs/Compatibility/LogTask53.php: -------------------------------------------------------------------------------- 1 | 14 | */ 15 | class LogTask53 implements ShouldQueue 16 | { 17 | use Queueable, InteractsWithQueue, SerializesModels; 18 | 19 | protected $request; 20 | protected $response; 21 | 22 | /** 23 | * LogTask constructor. 24 | * @param $request 25 | * @param $response 26 | */ 27 | public function __construct($request, $response) 28 | { 29 | $this->request = $request; 30 | $this->response = $response; 31 | } 32 | 33 | /** 34 | * Execute the job. 35 | */ 36 | public function handle() 37 | { 38 | $requestLogger = app(\Prettus\RequestLogger\ResponseLogger::class); 39 | $requestLogger->log($this->request, $this->response); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/Prettus/RequestLogger/Jobs/LogTask.php: -------------------------------------------------------------------------------- 1 | 15 | */ 16 | class LogTask implements ShouldQueue 17 | { 18 | use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; 19 | 20 | protected $request; 21 | protected $response; 22 | 23 | /** 24 | * LogTask constructor. 25 | * @param $request 26 | * @param $response 27 | */ 28 | public function __construct($request, $response) 29 | { 30 | $this->request = $request; 31 | $this->response = $response; 32 | } 33 | 34 | /** 35 | * Execute the job. 36 | */ 37 | public function handle() 38 | { 39 | $requestLogger = app(\Prettus\RequestLogger\ResponseLogger::class); 40 | $requestLogger->log($this->request, $this->response); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/Prettus/RequestLogger/Logger.php: -------------------------------------------------------------------------------- 1 | 11 | */ 12 | class Logger implements Log 13 | { 14 | 15 | /** 16 | * @var \Monolog\Logger; 17 | */ 18 | protected $monolog; 19 | 20 | /** 21 | * 22 | */ 23 | public function __construct() 24 | { 25 | $this->monolog = clone app('log')->getMonolog(); 26 | 27 | if( config('request-logger.logger.enabled') && $handlers = config('request-logger.logger.handlers') ) { 28 | if( count($handlers) ) { 29 | //Remove default laravel handler 30 | $this->monolog->popHandler(); 31 | 32 | foreach($handlers as $handler) { 33 | if( class_exists($handler) ) { 34 | $this->monolog->pushHandler(app($handler)); 35 | } else { 36 | throw new \Exception("Handler class [{$handler}] does not exist"); 37 | } 38 | } 39 | } 40 | } 41 | } 42 | 43 | /** 44 | * Log an alert message to the logs. 45 | * 46 | * @param string $message 47 | * @param array $context 48 | * @return void 49 | */ 50 | public function alert($message, array $context = array()) 51 | { 52 | $this->monolog->alert($message, $context); 53 | } 54 | 55 | /** 56 | * Log a critical message to the logs. 57 | * 58 | * @param string $message 59 | * @param array $context 60 | * @return void 61 | */ 62 | public function critical($message, array $context = array()) 63 | { 64 | $this->monolog->critical($message, $context); 65 | } 66 | 67 | /** 68 | * Log an error message to the logs. 69 | * 70 | * @param string $message 71 | * @param array $context 72 | * @return void 73 | */ 74 | public function error($message, array $context = array()) 75 | { 76 | $this->monolog->error($message, $context); 77 | } 78 | 79 | /** 80 | * Log a warning message to the logs. 81 | * 82 | * @param string $message 83 | * @param array $context 84 | * @return void 85 | */ 86 | public function warning($message, array $context = array()) 87 | { 88 | $this->monolog->warning($message, $context); 89 | } 90 | 91 | /** 92 | * Log a notice to the logs. 93 | * 94 | * @param string $message 95 | * @param array $context 96 | * @return void 97 | */ 98 | public function notice($message, array $context = array()) 99 | { 100 | $this->monolog->notice($message, $context); 101 | } 102 | 103 | /** 104 | * Log an informational message to the logs. 105 | * 106 | * @param string $message 107 | * @param array $context 108 | * @return void 109 | */ 110 | public function info($message, array $context = array()) 111 | { 112 | $this->monolog->info($message, $context); 113 | } 114 | 115 | /** 116 | * Log a debug message to the logs. 117 | * 118 | * @param string $message 119 | * @param array $context 120 | * @return void 121 | */ 122 | public function debug($message, array $context = array()) 123 | { 124 | $this->monolog->debug($message, $context); 125 | } 126 | 127 | /** 128 | * Log a message to the logs. 129 | * 130 | * @param string $level 131 | * @param string $message 132 | * @param array $context 133 | * @return void 134 | */ 135 | public function log($level, $message, array $context = array()) 136 | { 137 | $this->monolog->log($level, $message, $context); 138 | } 139 | 140 | /** 141 | * Register a file log handler. 142 | * 143 | * @param string $path 144 | * @param string $level 145 | * @return void 146 | */ 147 | public function useFiles($path, $level = 'debug') 148 | { 149 | 150 | } 151 | 152 | /** 153 | * Register a daily file log handler. 154 | * 155 | * @param string $path 156 | * @param int $days 157 | * @param string $level 158 | * @return void 159 | */ 160 | public function useDailyFiles($path, $days = 0, $level = 'debug') 161 | { 162 | 163 | } 164 | } 165 | -------------------------------------------------------------------------------- /src/Prettus/RequestLogger/Providers/LoggerServiceProvider.php: -------------------------------------------------------------------------------- 1 | 17 | */ 18 | class LoggerServiceProvider extends ServiceProvider 19 | { 20 | use DispatchesJobs; 21 | 22 | /** 23 | * Bootstrap any application services. 24 | * 25 | * @return void 26 | */ 27 | public function boot() 28 | { 29 | $this->publishes([ 30 | __DIR__ . '/../../../resources/config/request-logger.php' => config_path('request-logger.php') 31 | ]); 32 | 33 | $this->mergeConfigFrom( 34 | __DIR__ . '/../../../resources/config/request-logger.php', 'request-logger' 35 | ); 36 | } 37 | 38 | /** 39 | * Register any application services. 40 | * 41 | * @return void 42 | */ 43 | public function register() 44 | { 45 | Benchmarking::start('application'); 46 | 47 | $this->app['events']->listen('kernel.handled', function ($request, $response) { 48 | 49 | Benchmarking::end('application'); 50 | 51 | if(!$this->excluded($request)) { 52 | 53 | if( version_compare($this->app->version(), "5.2.99", "<=")) { 54 | //Compatible with Laravel 5.1 and 5.2 55 | $task = new LogTask51($request, $response); 56 | }else if( version_compare($this->app->version(), "5.3.99", "<=") ){ 57 | //Compatible with Laravel 5.3 58 | $task = new LogTask53($request, $response); 59 | }else{ 60 | //Compatible with Laravel 5.4 or later 61 | $task = new LogTask($request, $response); 62 | } 63 | 64 | if($queueName = config('request-logger.queue')) { 65 | $this->dispatch(is_string($queueName) ? $task->onQueue($queueName) : $task); 66 | } else { 67 | $task->handle(); 68 | } 69 | } 70 | }); 71 | } 72 | 73 | protected function excluded(Request $request) { 74 | $exclude = config('request-logger.exclude'); 75 | 76 | if (null === $exclude || empty($exclude)) { 77 | return false; 78 | } 79 | 80 | foreach($exclude as $path) { 81 | if($request->is($path)) return true; 82 | } 83 | 84 | return false; 85 | } 86 | 87 | } 88 | -------------------------------------------------------------------------------- /src/Prettus/RequestLogger/ResponseLogger.php: -------------------------------------------------------------------------------- 1 | 14 | */ 15 | class ResponseLogger 16 | { 17 | /** 18 | * 19 | */ 20 | const LOG_CONTEXT = "RESPONSE"; 21 | 22 | /** 23 | * @var array 24 | */ 25 | protected $formats = [ 26 | "combined" =>'{remote-addr} - {remote-user} [{date}] "{method} {url} HTTP/{http-version}" {status} {content-length} "{referer}" "{user-agent}"', 27 | "common" =>'{remote-addr} - {remote-user} [{date}] "{method} {url} HTTP/{http-version}" {status} {content-length}', 28 | "dev" =>'{method} {url} {status} {response-time} ms - {content-length}', 29 | "short" =>'{remote-addr} {remote-user} {method} {url} HTTP/{http-version} {status} {content-length} - {response-time} ms', 30 | "tiny" =>'{method} {url} {status} {content-length} - {response-time} ms' 31 | ]; 32 | 33 | /** 34 | * @var RequestInterpolation 35 | */ 36 | protected $requestInterpolation; 37 | 38 | /** 39 | * @var ResponseInterpolation 40 | */ 41 | protected $responseInterpolation; 42 | 43 | /** 44 | * @var Logger 45 | */ 46 | protected $logger; 47 | 48 | public function __construct(Logger $logger, RequestInterpolation $requestInterpolation, ResponseInterpolation $responseInterpolation) 49 | { 50 | $this->logger = $logger; 51 | $this->requestInterpolation = $requestInterpolation; 52 | $this->responseInterpolation = $responseInterpolation; 53 | } 54 | 55 | /** 56 | * @param Request $request 57 | * @param Response $response 58 | */ 59 | public function log(Request $request, Response $response) 60 | { 61 | $this->responseInterpolation->setResponse($response); 62 | $this->responseInterpolation->setRequest($request); 63 | $this->requestInterpolation->setRequest($request); 64 | 65 | if( config('request-logger.logger.enabled') ) { 66 | $format = config('request-logger.logger.format', "{ip} {remote_user} {date} {method} {url} HTTP/{http_version} {status} {content_length} {referer} {user_agent}"); 67 | $format = array_get($this->formats, $format, $format); 68 | $message = $this->responseInterpolation->interpolate($format); 69 | $message = $this->requestInterpolation->interpolate($message); 70 | $this->logger->log( config('request-logger.logger.level', 'info') , $message, [ 71 | static::LOG_CONTEXT 72 | ]); 73 | } 74 | } 75 | 76 | } 77 | -------------------------------------------------------------------------------- /src/resources/config/request-logger.php: -------------------------------------------------------------------------------- 1 | [ 23 | 'enabled' => true, 24 | 'handlers' => ['Prettus\RequestLogger\Handler\HttpLoggerHandler'], 25 | 'file' => storage_path("logs/http.log"), 26 | 'level' => 'info', 27 | 'format' => 'common' 28 | ] 29 | ]; --------------------------------------------------------------------------------