├── .bowerrc ├── .gitignore ├── LICENSE.md ├── README.md ├── assets └── AppAsset.php ├── codeception.yml ├── commands └── HelloController.php ├── composer.json ├── composer.lock ├── config ├── console.php ├── db.php ├── params.php ├── test.php ├── test_db.php └── web.php ├── controllers ├── SiteController.php └── api │ └── GraphqlController.php ├── mail └── layouts │ └── html.php ├── migrations ├── m170828_175739_init.php ├── m170828_190719_insert_demo_data.php └── m170905_192740_add_email_to_user.php ├── models ├── Address.php ├── City.php ├── ContactForm.php ├── LoginForm.php └── User.php ├── requirements.php ├── runtime └── .gitignore ├── schema ├── AddressType.php ├── CityType.php ├── MutationType.php ├── QueryType.php ├── Types.php ├── UserType.php ├── ValidationErrorType.php ├── ValidationErrorsListType.php └── mutations │ ├── AddressMutationType.php │ └── UserMutationType.php ├── tests ├── _bootstrap.php ├── _data │ └── .gitkeep ├── _output │ └── .gitignore ├── _support │ ├── AcceptanceTester.php │ ├── FunctionalTester.php │ └── UnitTester.php ├── acceptance.suite.yml.example ├── acceptance │ ├── AboutCest.php │ ├── ContactCest.php │ ├── HomeCest.php │ ├── LoginCest.php │ └── _bootstrap.php ├── bin │ ├── yii │ └── yii.bat ├── functional.suite.yml ├── functional │ ├── ContactFormCest.php │ ├── LoginFormCest.php │ └── _bootstrap.php ├── unit.suite.yml └── unit │ ├── _bootstrap.php │ └── models │ ├── ContactFormTest.php │ ├── LoginFormTest.php │ └── UserTest.php ├── views ├── layouts │ └── main.php └── site │ ├── about.php │ ├── contact.php │ ├── error.php │ ├── index.php │ └── login.php ├── web ├── .htaccess ├── assets │ └── .gitignore ├── css │ └── site.css ├── favicon.ico ├── index-test.php ├── index.php └── robots.txt ├── yii └── yii.bat /.bowerrc: -------------------------------------------------------------------------------- 1 | { 2 | "directory" : "vendor/bower" 3 | } 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # phpstorm project files 2 | .idea 3 | 4 | # netbeans project files 5 | nbproject 6 | 7 | # zend studio for eclipse project files 8 | .buildpath 9 | .project 10 | .settings 11 | 12 | # windows thumbnail cache 13 | Thumbs.db 14 | 15 | # composer vendor dir 16 | /vendor 17 | 18 | # composer itself is not needed 19 | composer.phar 20 | 21 | # Mac DS_Store Files 22 | .DS_Store 23 | 24 | # phpunit itself is not needed 25 | phpunit.phar 26 | # local phpunit config 27 | /phpunit.xml 28 | 29 | tests/_output/* 30 | tests/_support/_generated -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | The Yii framework is free software. It is released under the terms of 2 | the following BSD License. 3 | 4 | Copyright © 2008 by Yii Software LLC (http://www.yiisoft.com) 5 | All rights reserved. 6 | 7 | Redistribution and use in source and binary forms, with or without 8 | modification, are permitted provided that the following conditions 9 | are met: 10 | 11 | * Redistributions of source code must retain the above copyright 12 | notice, this list of conditions and the following disclaimer. 13 | * Redistributions in binary form must reproduce the above copyright 14 | notice, this list of conditions and the following disclaimer in 15 | the documentation and/or other materials provided with the 16 | distribution. 17 | * Neither the name of Yii Software LLC nor the names of its 18 | contributors may be used to endorse or promote products derived 19 | from this software without specific prior written permission. 20 | 21 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 22 | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 23 | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 24 | FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 25 | COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 26 | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 27 | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 28 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 29 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30 | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 31 | ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 32 | POSSIBILITY OF SUCH DAMAGE. 33 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | GraphQL Server Demo Project 2 | ============================ 3 | 4 | Project demonstrates how to implement GraphQL API server based on Yii2 PHP framework. 5 | 6 | https://habrahabr.ru/post/336758/ -------------------------------------------------------------------------------- /assets/AppAsset.php: -------------------------------------------------------------------------------- 1 | 14 | * @since 2.0 15 | */ 16 | class AppAsset extends AssetBundle 17 | { 18 | public $basePath = '@webroot'; 19 | public $baseUrl = '@web'; 20 | public $css = [ 21 | 'css/site.css', 22 | ]; 23 | public $js = [ 24 | ]; 25 | public $depends = [ 26 | 'yii\web\YiiAsset', 27 | 'yii\bootstrap\BootstrapAsset', 28 | ]; 29 | } 30 | -------------------------------------------------------------------------------- /codeception.yml: -------------------------------------------------------------------------------- 1 | actor: Tester 2 | paths: 3 | tests: tests 4 | log: tests/_output 5 | data: tests/_data 6 | helpers: tests/_support 7 | settings: 8 | bootstrap: _bootstrap.php 9 | memory_limit: 1024M 10 | colors: true 11 | modules: 12 | config: 13 | Yii2: 14 | configFile: 'config/test.php' 15 | cleanup: false 16 | 17 | # To enable code coverage: 18 | #coverage: 19 | # #c3_url: http://localhost:8080/index-test.php/ 20 | # enabled: true 21 | # #remote: true 22 | # #remote_config: '../codeception.yml' 23 | # whitelist: 24 | # include: 25 | # - models/* 26 | # - controllers/* 27 | # - commands/* 28 | # - mail/* 29 | # blacklist: 30 | # include: 31 | # - assets/* 32 | # - config/* 33 | # - runtime/* 34 | # - vendor/* 35 | # - views/* 36 | # - web/* 37 | # - tests/* 38 | -------------------------------------------------------------------------------- /commands/HelloController.php: -------------------------------------------------------------------------------- 1 | 18 | * @since 2.0 19 | */ 20 | class HelloController extends Controller 21 | { 22 | /** 23 | * This command echoes what you have entered as the message. 24 | * @param string $message the message to be echoed. 25 | */ 26 | public function actionIndex($message = 'hello world') 27 | { 28 | echo $message . "\n"; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "yiisoft/yii2-app-basic", 3 | "description": "Yii 2 Basic Project Template", 4 | "keywords": ["yii2", "framework", "basic", "project template"], 5 | "homepage": "http://www.yiiframework.com/", 6 | "type": "project", 7 | "license": "BSD-3-Clause", 8 | "support": { 9 | "issues": "https://github.com/yiisoft/yii2/issues?state=open", 10 | "forum": "http://www.yiiframework.com/forum/", 11 | "wiki": "http://www.yiiframework.com/wiki/", 12 | "irc": "irc://irc.freenode.net/yii", 13 | "source": "https://github.com/yiisoft/yii2" 14 | }, 15 | "minimum-stability": "stable", 16 | "require": { 17 | "php": ">=5.4.0", 18 | "yiisoft/yii2": "~2.0.5", 19 | "yiisoft/yii2-bootstrap": "~2.0.0", 20 | "yiisoft/yii2-swiftmailer": "~2.0.0", 21 | "webonyx/graphql-php": "^0.10.1" 22 | }, 23 | "require-dev": { 24 | "yiisoft/yii2-debug": "~2.0.0", 25 | "yiisoft/yii2-gii": "~2.0.0", 26 | "yiisoft/yii2-faker": "~2.0.0", 27 | 28 | "codeception/base": "^2.2.3", 29 | "codeception/verify": "~0.3.1", 30 | "codeception/specify": "~0.4.3" 31 | }, 32 | "config": { 33 | "process-timeout": 1800, 34 | "fxp-asset":{ 35 | "installer-paths": { 36 | "npm-asset-library": "vendor/npm", 37 | "bower-asset-library": "vendor/bower" 38 | } 39 | } 40 | }, 41 | "scripts": { 42 | "post-create-project-cmd": [ 43 | "yii\\composer\\Installer::postCreateProject" 44 | ] 45 | }, 46 | "extra": { 47 | "yii\\composer\\Installer::postCreateProject": { 48 | "setPermission": [ 49 | { 50 | "runtime": "0777", 51 | "web/assets": "0777", 52 | "yii": "0755" 53 | } 54 | ], 55 | "generateCookieValidationKey": [ 56 | "config/web.php" 57 | ] 58 | } 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /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": "790887170b330f89e254d76d1ffa2c5b", 8 | "packages": [ 9 | { 10 | "name": "bower-asset/bootstrap", 11 | "version": "v3.3.7", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/twbs/bootstrap.git", 15 | "reference": "0b9c4a4007c44201dce9a6cc1a38407005c26c86" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/twbs/bootstrap/zipball/0b9c4a4007c44201dce9a6cc1a38407005c26c86", 20 | "reference": "0b9c4a4007c44201dce9a6cc1a38407005c26c86", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "bower-asset/jquery": ">=1.9.1,<4.0" 25 | }, 26 | "type": "bower-asset-library", 27 | "extra": { 28 | "bower-asset-main": [ 29 | "less/bootstrap.less", 30 | "dist/js/bootstrap.js" 31 | ], 32 | "bower-asset-ignore": [ 33 | "/.*", 34 | "_config.yml", 35 | "CNAME", 36 | "composer.json", 37 | "CONTRIBUTING.md", 38 | "docs", 39 | "js/tests", 40 | "test-infra" 41 | ] 42 | }, 43 | "license": [ 44 | "MIT" 45 | ], 46 | "description": "The most popular front-end framework for developing responsive, mobile first projects on the web.", 47 | "keywords": [ 48 | "css", 49 | "framework", 50 | "front-end", 51 | "js", 52 | "less", 53 | "mobile-first", 54 | "responsive", 55 | "web" 56 | ] 57 | }, 58 | { 59 | "name": "bower-asset/jquery", 60 | "version": "2.2.4", 61 | "source": { 62 | "type": "git", 63 | "url": "https://github.com/jquery/jquery-dist.git", 64 | "reference": "c0185ab7c75aab88762c5aae780b9d83b80eda72" 65 | }, 66 | "dist": { 67 | "type": "zip", 68 | "url": "https://api.github.com/repos/jquery/jquery-dist/zipball/c0185ab7c75aab88762c5aae780b9d83b80eda72", 69 | "reference": "c0185ab7c75aab88762c5aae780b9d83b80eda72", 70 | "shasum": "" 71 | }, 72 | "type": "bower-asset-library", 73 | "extra": { 74 | "bower-asset-main": "dist/jquery.js", 75 | "bower-asset-ignore": [ 76 | "package.json" 77 | ] 78 | }, 79 | "license": [ 80 | "MIT" 81 | ], 82 | "keywords": [ 83 | "browser", 84 | "javascript", 85 | "jquery", 86 | "library" 87 | ] 88 | }, 89 | { 90 | "name": "bower-asset/jquery.inputmask", 91 | "version": "3.3.6", 92 | "source": { 93 | "type": "git", 94 | "url": "https://github.com/RobinHerbots/Inputmask.git", 95 | "reference": "e42852f4afa01a80815394a5b2f9ce504c1a8d0b" 96 | }, 97 | "dist": { 98 | "type": "zip", 99 | "url": "https://api.github.com/repos/RobinHerbots/Inputmask/zipball/e42852f4afa01a80815394a5b2f9ce504c1a8d0b", 100 | "reference": "e42852f4afa01a80815394a5b2f9ce504c1a8d0b", 101 | "shasum": "" 102 | }, 103 | "require": { 104 | "bower-asset/jquery": ">=1.7" 105 | }, 106 | "type": "bower-asset-library", 107 | "extra": { 108 | "bower-asset-main": [ 109 | "./dist/inputmask/inputmask.js", 110 | "./dist/inputmask/inputmask.extensions.js", 111 | "./dist/inputmask/inputmask.date.extensions.js", 112 | "./dist/inputmask/inputmask.numeric.extensions.js", 113 | "./dist/inputmask/inputmask.phone.extensions.js", 114 | "./dist/inputmask/jquery.inputmask.js", 115 | "./dist/inputmask/global/document.js", 116 | "./dist/inputmask/global/window.js", 117 | "./dist/inputmask/phone-codes/phone.js", 118 | "./dist/inputmask/phone-codes/phone-be.js", 119 | "./dist/inputmask/phone-codes/phone-nl.js", 120 | "./dist/inputmask/phone-codes/phone-ru.js", 121 | "./dist/inputmask/phone-codes/phone-uk.js", 122 | "./dist/inputmask/dependencyLibs/inputmask.dependencyLib.jqlite.js", 123 | "./dist/inputmask/dependencyLibs/inputmask.dependencyLib.jquery.js", 124 | "./dist/inputmask/dependencyLibs/inputmask.dependencyLib.js", 125 | "./dist/inputmask/bindings/inputmask.binding.js" 126 | ], 127 | "bower-asset-ignore": [ 128 | "**/*", 129 | "!dist/*", 130 | "!dist/inputmask/*", 131 | "!dist/min/*", 132 | "!dist/min/inputmask/*" 133 | ] 134 | }, 135 | "license": [ 136 | "http://opensource.org/licenses/mit-license.php" 137 | ], 138 | "description": "Inputmask is a javascript library which creates an input mask. Inputmask can run against vanilla javascript, jQuery and jqlite.", 139 | "keywords": [ 140 | "form", 141 | "input", 142 | "inputmask", 143 | "jquery", 144 | "mask", 145 | "plugins" 146 | ] 147 | }, 148 | { 149 | "name": "bower-asset/punycode", 150 | "version": "v1.3.2", 151 | "source": { 152 | "type": "git", 153 | "url": "https://github.com/bestiejs/punycode.js.git", 154 | "reference": "38c8d3131a82567bfef18da09f7f4db68c84f8a3" 155 | }, 156 | "dist": { 157 | "type": "zip", 158 | "url": "https://api.github.com/repos/bestiejs/punycode.js/zipball/38c8d3131a82567bfef18da09f7f4db68c84f8a3", 159 | "reference": "38c8d3131a82567bfef18da09f7f4db68c84f8a3", 160 | "shasum": "" 161 | }, 162 | "type": "bower-asset-library", 163 | "extra": { 164 | "bower-asset-main": "punycode.js", 165 | "bower-asset-ignore": [ 166 | "coverage", 167 | "tests", 168 | ".*", 169 | "component.json", 170 | "Gruntfile.js", 171 | "node_modules", 172 | "package.json" 173 | ] 174 | } 175 | }, 176 | { 177 | "name": "bower-asset/yii2-pjax", 178 | "version": "v2.0.6", 179 | "source": { 180 | "type": "git", 181 | "url": "https://github.com/yiisoft/jquery-pjax.git", 182 | "reference": "60728da6ade5879e807a49ce59ef9a72039b8978" 183 | }, 184 | "dist": { 185 | "type": "zip", 186 | "url": "https://api.github.com/repos/yiisoft/jquery-pjax/zipball/60728da6ade5879e807a49ce59ef9a72039b8978", 187 | "reference": "60728da6ade5879e807a49ce59ef9a72039b8978", 188 | "shasum": "" 189 | }, 190 | "require": { 191 | "bower-asset/jquery": ">=1.8" 192 | }, 193 | "type": "bower-asset-library", 194 | "extra": { 195 | "bower-asset-main": "./jquery.pjax.js", 196 | "bower-asset-ignore": [ 197 | ".travis.yml", 198 | "Gemfile", 199 | "Gemfile.lock", 200 | "CONTRIBUTING.md", 201 | "vendor/", 202 | "script/", 203 | "test/" 204 | ] 205 | }, 206 | "license": [ 207 | "MIT" 208 | ] 209 | }, 210 | { 211 | "name": "cebe/markdown", 212 | "version": "1.1.1", 213 | "source": { 214 | "type": "git", 215 | "url": "https://github.com/cebe/markdown.git", 216 | "reference": "c30eb5e01fe021cc5bba2f9ee0eeef96d4931166" 217 | }, 218 | "dist": { 219 | "type": "zip", 220 | "url": "https://api.github.com/repos/cebe/markdown/zipball/c30eb5e01fe021cc5bba2f9ee0eeef96d4931166", 221 | "reference": "c30eb5e01fe021cc5bba2f9ee0eeef96d4931166", 222 | "shasum": "" 223 | }, 224 | "require": { 225 | "lib-pcre": "*", 226 | "php": ">=5.4.0" 227 | }, 228 | "require-dev": { 229 | "cebe/indent": "*", 230 | "facebook/xhprof": "*@dev", 231 | "phpunit/phpunit": "4.1.*" 232 | }, 233 | "bin": [ 234 | "bin/markdown" 235 | ], 236 | "type": "library", 237 | "extra": { 238 | "branch-alias": { 239 | "dev-master": "1.1.x-dev" 240 | } 241 | }, 242 | "autoload": { 243 | "psr-4": { 244 | "cebe\\markdown\\": "" 245 | } 246 | }, 247 | "notification-url": "https://packagist.org/downloads/", 248 | "license": [ 249 | "MIT" 250 | ], 251 | "authors": [ 252 | { 253 | "name": "Carsten Brandt", 254 | "email": "mail@cebe.cc", 255 | "homepage": "http://cebe.cc/", 256 | "role": "Creator" 257 | } 258 | ], 259 | "description": "A super fast, highly extensible markdown parser for PHP", 260 | "homepage": "https://github.com/cebe/markdown#readme", 261 | "keywords": [ 262 | "extensible", 263 | "fast", 264 | "gfm", 265 | "markdown", 266 | "markdown-extra" 267 | ], 268 | "time": "2016-09-14T20:40:20+00:00" 269 | }, 270 | { 271 | "name": "ezyang/htmlpurifier", 272 | "version": "v4.9.3", 273 | "source": { 274 | "type": "git", 275 | "url": "https://github.com/ezyang/htmlpurifier.git", 276 | "reference": "95e1bae3182efc0f3422896a3236e991049dac69" 277 | }, 278 | "dist": { 279 | "type": "zip", 280 | "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/95e1bae3182efc0f3422896a3236e991049dac69", 281 | "reference": "95e1bae3182efc0f3422896a3236e991049dac69", 282 | "shasum": "" 283 | }, 284 | "require": { 285 | "php": ">=5.2" 286 | }, 287 | "require-dev": { 288 | "simpletest/simpletest": "^1.1" 289 | }, 290 | "type": "library", 291 | "autoload": { 292 | "psr-0": { 293 | "HTMLPurifier": "library/" 294 | }, 295 | "files": [ 296 | "library/HTMLPurifier.composer.php" 297 | ] 298 | }, 299 | "notification-url": "https://packagist.org/downloads/", 300 | "license": [ 301 | "LGPL" 302 | ], 303 | "authors": [ 304 | { 305 | "name": "Edward Z. Yang", 306 | "email": "admin@htmlpurifier.org", 307 | "homepage": "http://ezyang.com" 308 | } 309 | ], 310 | "description": "Standards compliant HTML filter written in PHP", 311 | "homepage": "http://htmlpurifier.org/", 312 | "keywords": [ 313 | "html" 314 | ], 315 | "time": "2017-06-03T02:28:16+00:00" 316 | }, 317 | { 318 | "name": "swiftmailer/swiftmailer", 319 | "version": "v5.4.8", 320 | "source": { 321 | "type": "git", 322 | "url": "https://github.com/swiftmailer/swiftmailer.git", 323 | "reference": "9a06dc570a0367850280eefd3f1dc2da45aef517" 324 | }, 325 | "dist": { 326 | "type": "zip", 327 | "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/9a06dc570a0367850280eefd3f1dc2da45aef517", 328 | "reference": "9a06dc570a0367850280eefd3f1dc2da45aef517", 329 | "shasum": "" 330 | }, 331 | "require": { 332 | "php": ">=5.3.3" 333 | }, 334 | "require-dev": { 335 | "mockery/mockery": "~0.9.1", 336 | "symfony/phpunit-bridge": "~3.2" 337 | }, 338 | "type": "library", 339 | "extra": { 340 | "branch-alias": { 341 | "dev-master": "5.4-dev" 342 | } 343 | }, 344 | "autoload": { 345 | "files": [ 346 | "lib/swift_required.php" 347 | ] 348 | }, 349 | "notification-url": "https://packagist.org/downloads/", 350 | "license": [ 351 | "MIT" 352 | ], 353 | "authors": [ 354 | { 355 | "name": "Chris Corbyn" 356 | }, 357 | { 358 | "name": "Fabien Potencier", 359 | "email": "fabien@symfony.com" 360 | } 361 | ], 362 | "description": "Swiftmailer, free feature-rich PHP mailer", 363 | "homepage": "http://swiftmailer.org", 364 | "keywords": [ 365 | "email", 366 | "mail", 367 | "mailer" 368 | ], 369 | "time": "2017-05-01T15:54:03+00:00" 370 | }, 371 | { 372 | "name": "webonyx/graphql-php", 373 | "version": "v0.10.1", 374 | "source": { 375 | "type": "git", 376 | "url": "https://github.com/webonyx/graphql-php.git", 377 | "reference": "1eb2ccac76e3ff4e1864477729915463bd6a409b" 378 | }, 379 | "dist": { 380 | "type": "zip", 381 | "url": "https://api.github.com/repos/webonyx/graphql-php/zipball/1eb2ccac76e3ff4e1864477729915463bd6a409b", 382 | "reference": "1eb2ccac76e3ff4e1864477729915463bd6a409b", 383 | "shasum": "" 384 | }, 385 | "require": { 386 | "ext-mbstring": "*", 387 | "php": ">=5.5,<8.0-DEV" 388 | }, 389 | "require-dev": { 390 | "phpunit/phpunit": "^4.8", 391 | "psr/http-message": "^1.0" 392 | }, 393 | "suggest": { 394 | "psr/http-message": "To use standard GraphQL server", 395 | "react/promise": "To leverage async resolving on React PHP platform" 396 | }, 397 | "type": "library", 398 | "autoload": { 399 | "files": [ 400 | "src/deprecated.php" 401 | ], 402 | "psr-4": { 403 | "GraphQL\\": "src/" 404 | } 405 | }, 406 | "notification-url": "https://packagist.org/downloads/", 407 | "license": [ 408 | "BSD" 409 | ], 410 | "description": "A PHP port of GraphQL reference implementation", 411 | "homepage": "https://github.com/webonyx/graphql-php", 412 | "keywords": [ 413 | "api", 414 | "graphql" 415 | ], 416 | "time": "2017-08-20T18:27:58+00:00" 417 | }, 418 | { 419 | "name": "yiisoft/yii2", 420 | "version": "2.0.12", 421 | "source": { 422 | "type": "git", 423 | "url": "https://github.com/yiisoft/yii2-framework.git", 424 | "reference": "70acbecc75cb26b6cd66d16be0b06e4b73db190d" 425 | }, 426 | "dist": { 427 | "type": "zip", 428 | "url": "https://api.github.com/repos/yiisoft/yii2-framework/zipball/70acbecc75cb26b6cd66d16be0b06e4b73db190d", 429 | "reference": "70acbecc75cb26b6cd66d16be0b06e4b73db190d", 430 | "shasum": "" 431 | }, 432 | "require": { 433 | "bower-asset/jquery": "2.2.*@stable | 2.1.*@stable | 1.11.*@stable | 1.12.*@stable", 434 | "bower-asset/jquery.inputmask": "~3.2.2 | ~3.3.5", 435 | "bower-asset/punycode": "1.3.*", 436 | "bower-asset/yii2-pjax": "~2.0.1", 437 | "cebe/markdown": "~1.0.0 | ~1.1.0", 438 | "ext-ctype": "*", 439 | "ext-mbstring": "*", 440 | "ezyang/htmlpurifier": "~4.6", 441 | "lib-pcre": "*", 442 | "php": ">=5.4.0", 443 | "yiisoft/yii2-composer": "~2.0.4" 444 | }, 445 | "bin": [ 446 | "yii" 447 | ], 448 | "type": "library", 449 | "extra": { 450 | "branch-alias": { 451 | "dev-master": "2.0.x-dev" 452 | } 453 | }, 454 | "autoload": { 455 | "psr-4": { 456 | "yii\\": "" 457 | } 458 | }, 459 | "notification-url": "https://packagist.org/downloads/", 460 | "license": [ 461 | "BSD-3-Clause" 462 | ], 463 | "authors": [ 464 | { 465 | "name": "Qiang Xue", 466 | "email": "qiang.xue@gmail.com", 467 | "homepage": "http://www.yiiframework.com/", 468 | "role": "Founder and project lead" 469 | }, 470 | { 471 | "name": "Alexander Makarov", 472 | "email": "sam@rmcreative.ru", 473 | "homepage": "http://rmcreative.ru/", 474 | "role": "Core framework development" 475 | }, 476 | { 477 | "name": "Maurizio Domba", 478 | "homepage": "http://mdomba.info/", 479 | "role": "Core framework development" 480 | }, 481 | { 482 | "name": "Carsten Brandt", 483 | "email": "mail@cebe.cc", 484 | "homepage": "http://cebe.cc/", 485 | "role": "Core framework development" 486 | }, 487 | { 488 | "name": "Timur Ruziev", 489 | "email": "resurtm@gmail.com", 490 | "homepage": "http://resurtm.com/", 491 | "role": "Core framework development" 492 | }, 493 | { 494 | "name": "Paul Klimov", 495 | "email": "klimov.paul@gmail.com", 496 | "role": "Core framework development" 497 | }, 498 | { 499 | "name": "Dmitry Naumenko", 500 | "email": "d.naumenko.a@gmail.com", 501 | "role": "Core framework development" 502 | }, 503 | { 504 | "name": "Boudewijn Vahrmeijer", 505 | "email": "info@dynasource.eu", 506 | "homepage": "http://dynasource.eu", 507 | "role": "Core framework development" 508 | } 509 | ], 510 | "description": "Yii PHP Framework Version 2", 511 | "homepage": "http://www.yiiframework.com/", 512 | "keywords": [ 513 | "framework", 514 | "yii2" 515 | ], 516 | "time": "2017-06-05T14:33:41+00:00" 517 | }, 518 | { 519 | "name": "yiisoft/yii2-bootstrap", 520 | "version": "2.0.6", 521 | "source": { 522 | "type": "git", 523 | "url": "https://github.com/yiisoft/yii2-bootstrap.git", 524 | "reference": "3fd2b8c950cce79d60e9702d6bcb24eb3c80f6c5" 525 | }, 526 | "dist": { 527 | "type": "zip", 528 | "url": "https://api.github.com/repos/yiisoft/yii2-bootstrap/zipball/3fd2b8c950cce79d60e9702d6bcb24eb3c80f6c5", 529 | "reference": "3fd2b8c950cce79d60e9702d6bcb24eb3c80f6c5", 530 | "shasum": "" 531 | }, 532 | "require": { 533 | "bower-asset/bootstrap": "3.3.* | 3.2.* | 3.1.*", 534 | "yiisoft/yii2": ">=2.0.6" 535 | }, 536 | "type": "yii2-extension", 537 | "extra": { 538 | "branch-alias": { 539 | "dev-master": "2.0.x-dev" 540 | }, 541 | "asset-installer-paths": { 542 | "npm-asset-library": "vendor/npm", 543 | "bower-asset-library": "vendor/bower" 544 | } 545 | }, 546 | "autoload": { 547 | "psr-4": { 548 | "yii\\bootstrap\\": "" 549 | } 550 | }, 551 | "notification-url": "https://packagist.org/downloads/", 552 | "license": [ 553 | "BSD-3-Clause" 554 | ], 555 | "authors": [ 556 | { 557 | "name": "Qiang Xue", 558 | "email": "qiang.xue@gmail.com" 559 | } 560 | ], 561 | "description": "The Twitter Bootstrap extension for the Yii framework", 562 | "keywords": [ 563 | "bootstrap", 564 | "yii2" 565 | ], 566 | "time": "2016-03-17T03:29:28+00:00" 567 | }, 568 | { 569 | "name": "yiisoft/yii2-composer", 570 | "version": "2.0.5", 571 | "source": { 572 | "type": "git", 573 | "url": "https://github.com/yiisoft/yii2-composer.git", 574 | "reference": "3f4923c2bde6caf3f5b88cc22fdd5770f52f8df2" 575 | }, 576 | "dist": { 577 | "type": "zip", 578 | "url": "https://api.github.com/repos/yiisoft/yii2-composer/zipball/3f4923c2bde6caf3f5b88cc22fdd5770f52f8df2", 579 | "reference": "3f4923c2bde6caf3f5b88cc22fdd5770f52f8df2", 580 | "shasum": "" 581 | }, 582 | "require": { 583 | "composer-plugin-api": "^1.0" 584 | }, 585 | "require-dev": { 586 | "composer/composer": "^1.0" 587 | }, 588 | "type": "composer-plugin", 589 | "extra": { 590 | "class": "yii\\composer\\Plugin", 591 | "branch-alias": { 592 | "dev-master": "2.0.x-dev" 593 | } 594 | }, 595 | "autoload": { 596 | "psr-4": { 597 | "yii\\composer\\": "" 598 | } 599 | }, 600 | "notification-url": "https://packagist.org/downloads/", 601 | "license": [ 602 | "BSD-3-Clause" 603 | ], 604 | "authors": [ 605 | { 606 | "name": "Qiang Xue", 607 | "email": "qiang.xue@gmail.com" 608 | } 609 | ], 610 | "description": "The composer plugin for Yii extension installer", 611 | "keywords": [ 612 | "composer", 613 | "extension installer", 614 | "yii2" 615 | ], 616 | "time": "2016-12-20T13:26:02+00:00" 617 | }, 618 | { 619 | "name": "yiisoft/yii2-swiftmailer", 620 | "version": "2.0.7", 621 | "source": { 622 | "type": "git", 623 | "url": "https://github.com/yiisoft/yii2-swiftmailer.git", 624 | "reference": "8a03a62cbcb82e7697d3002eb43a8d2637f566ec" 625 | }, 626 | "dist": { 627 | "type": "zip", 628 | "url": "https://api.github.com/repos/yiisoft/yii2-swiftmailer/zipball/8a03a62cbcb82e7697d3002eb43a8d2637f566ec", 629 | "reference": "8a03a62cbcb82e7697d3002eb43a8d2637f566ec", 630 | "shasum": "" 631 | }, 632 | "require": { 633 | "swiftmailer/swiftmailer": "~5.0", 634 | "yiisoft/yii2": "~2.0.4" 635 | }, 636 | "type": "yii2-extension", 637 | "extra": { 638 | "branch-alias": { 639 | "dev-master": "2.0.x-dev" 640 | } 641 | }, 642 | "autoload": { 643 | "psr-4": { 644 | "yii\\swiftmailer\\": "" 645 | } 646 | }, 647 | "notification-url": "https://packagist.org/downloads/", 648 | "license": [ 649 | "BSD-3-Clause" 650 | ], 651 | "authors": [ 652 | { 653 | "name": "Paul Klimov", 654 | "email": "klimov.paul@gmail.com" 655 | } 656 | ], 657 | "description": "The SwiftMailer integration for the Yii framework", 658 | "keywords": [ 659 | "email", 660 | "mail", 661 | "mailer", 662 | "swift", 663 | "swiftmailer", 664 | "yii2" 665 | ], 666 | "time": "2017-05-01T08:29:00+00:00" 667 | } 668 | ], 669 | "packages-dev": [ 670 | { 671 | "name": "behat/gherkin", 672 | "version": "v4.4.5", 673 | "source": { 674 | "type": "git", 675 | "url": "https://github.com/Behat/Gherkin.git", 676 | "reference": "5c14cff4f955b17d20d088dec1bde61c0539ec74" 677 | }, 678 | "dist": { 679 | "type": "zip", 680 | "url": "https://api.github.com/repos/Behat/Gherkin/zipball/5c14cff4f955b17d20d088dec1bde61c0539ec74", 681 | "reference": "5c14cff4f955b17d20d088dec1bde61c0539ec74", 682 | "shasum": "" 683 | }, 684 | "require": { 685 | "php": ">=5.3.1" 686 | }, 687 | "require-dev": { 688 | "phpunit/phpunit": "~4.5|~5", 689 | "symfony/phpunit-bridge": "~2.7|~3", 690 | "symfony/yaml": "~2.3|~3" 691 | }, 692 | "suggest": { 693 | "symfony/yaml": "If you want to parse features, represented in YAML files" 694 | }, 695 | "type": "library", 696 | "extra": { 697 | "branch-alias": { 698 | "dev-master": "4.4-dev" 699 | } 700 | }, 701 | "autoload": { 702 | "psr-0": { 703 | "Behat\\Gherkin": "src/" 704 | } 705 | }, 706 | "notification-url": "https://packagist.org/downloads/", 707 | "license": [ 708 | "MIT" 709 | ], 710 | "authors": [ 711 | { 712 | "name": "Konstantin Kudryashov", 713 | "email": "ever.zet@gmail.com", 714 | "homepage": "http://everzet.com" 715 | } 716 | ], 717 | "description": "Gherkin DSL parser for PHP 5.3", 718 | "homepage": "http://behat.org/", 719 | "keywords": [ 720 | "BDD", 721 | "Behat", 722 | "Cucumber", 723 | "DSL", 724 | "gherkin", 725 | "parser" 726 | ], 727 | "time": "2016-10-30T11:50:56+00:00" 728 | }, 729 | { 730 | "name": "bower-asset/typeahead.js", 731 | "version": "v0.11.1", 732 | "source": { 733 | "type": "git", 734 | "url": "https://github.com/twitter/typeahead.js.git", 735 | "reference": "588440f66559714280628a4f9799f0c4eb880a4a" 736 | }, 737 | "dist": { 738 | "type": "zip", 739 | "url": "https://api.github.com/repos/twitter/typeahead.js/zipball/588440f66559714280628a4f9799f0c4eb880a4a", 740 | "reference": "588440f66559714280628a4f9799f0c4eb880a4a", 741 | "shasum": "" 742 | }, 743 | "require": { 744 | "bower-asset/jquery": ">=1.7" 745 | }, 746 | "require-dev": { 747 | "bower-asset/jasmine-ajax": "~1.3.1", 748 | "bower-asset/jasmine-jquery": "~1.5.2", 749 | "bower-asset/jquery": "~1.7" 750 | }, 751 | "type": "bower-asset-library", 752 | "extra": { 753 | "bower-asset-main": "dist/typeahead.bundle.js" 754 | } 755 | }, 756 | { 757 | "name": "codeception/base", 758 | "version": "2.3.3", 759 | "source": { 760 | "type": "git", 761 | "url": "https://github.com/Codeception/base.git", 762 | "reference": "6724500be5f890b086440a7f40941565b313b3d1" 763 | }, 764 | "dist": { 765 | "type": "zip", 766 | "url": "https://api.github.com/repos/Codeception/base/zipball/6724500be5f890b086440a7f40941565b313b3d1", 767 | "reference": "6724500be5f890b086440a7f40941565b313b3d1", 768 | "shasum": "" 769 | }, 770 | "require": { 771 | "behat/gherkin": "~4.4.0", 772 | "ext-json": "*", 773 | "ext-mbstring": "*", 774 | "guzzlehttp/psr7": "~1.0", 775 | "php": ">=5.4.0 <8.0", 776 | "phpunit/php-code-coverage": ">=2.2.4 <6.0", 777 | "phpunit/phpunit": ">4.8.20 <7.0", 778 | "phpunit/phpunit-mock-objects": ">2.3 <5.0", 779 | "sebastian/comparator": ">1.1 <3.0", 780 | "sebastian/diff": "^1.4", 781 | "stecman/symfony-console-completion": "^0.7.0", 782 | "symfony/browser-kit": ">=2.7 <4.0", 783 | "symfony/console": ">=2.7 <4.0", 784 | "symfony/css-selector": ">=2.7 <4.0", 785 | "symfony/dom-crawler": ">=2.7.5 <4.0", 786 | "symfony/event-dispatcher": ">=2.7 <4.0", 787 | "symfony/finder": ">=2.7 <4.0", 788 | "symfony/yaml": ">=2.7 <4.0" 789 | }, 790 | "require-dev": { 791 | "codeception/specify": "~0.3", 792 | "facebook/graph-sdk": "~5.3", 793 | "flow/jsonpath": "~0.2", 794 | "league/factory-muffin": "^3.0", 795 | "league/factory-muffin-faker": "^1.0", 796 | "mongodb/mongodb": "^1.0", 797 | "monolog/monolog": "~1.8", 798 | "pda/pheanstalk": "~3.0", 799 | "php-amqplib/php-amqplib": "~2.4", 800 | "predis/predis": "^1.0", 801 | "squizlabs/php_codesniffer": "~2.0", 802 | "vlucas/phpdotenv": "^2.4.0" 803 | }, 804 | "suggest": { 805 | "codeception/specify": "BDD-style code blocks", 806 | "codeception/verify": "BDD-style assertions", 807 | "flow/jsonpath": "For using JSONPath in REST module", 808 | "league/factory-muffin": "For DataFactory module", 809 | "league/factory-muffin-faker": "For Faker support in DataFactory module", 810 | "phpseclib/phpseclib": "for SFTP option in FTP Module", 811 | "symfony/phpunit-bridge": "For phpunit-bridge support" 812 | }, 813 | "bin": [ 814 | "codecept" 815 | ], 816 | "type": "library", 817 | "extra": { 818 | "branch-alias": [] 819 | }, 820 | "autoload": { 821 | "psr-4": { 822 | "Codeception\\": "src\\Codeception", 823 | "Codeception\\Extension\\": "ext" 824 | } 825 | }, 826 | "notification-url": "https://packagist.org/downloads/", 827 | "license": [ 828 | "MIT" 829 | ], 830 | "authors": [ 831 | { 832 | "name": "Michael Bodnarchuk", 833 | "email": "davert@mail.ua", 834 | "homepage": "http://codegyre.com" 835 | } 836 | ], 837 | "description": "BDD-style testing framework", 838 | "homepage": "http://codeception.com/", 839 | "keywords": [ 840 | "BDD", 841 | "TDD", 842 | "acceptance testing", 843 | "functional testing", 844 | "unit testing" 845 | ], 846 | "time": "2017-06-02T00:30:24+00:00" 847 | }, 848 | { 849 | "name": "codeception/specify", 850 | "version": "0.4.6", 851 | "source": { 852 | "type": "git", 853 | "url": "https://github.com/Codeception/Specify.git", 854 | "reference": "21b586f503ca444aa519dd9cafb32f113a05f286" 855 | }, 856 | "dist": { 857 | "type": "zip", 858 | "url": "https://api.github.com/repos/Codeception/Specify/zipball/21b586f503ca444aa519dd9cafb32f113a05f286", 859 | "reference": "21b586f503ca444aa519dd9cafb32f113a05f286", 860 | "shasum": "" 861 | }, 862 | "require": { 863 | "myclabs/deep-copy": "~1.1", 864 | "php": ">=5.4.0" 865 | }, 866 | "require-dev": { 867 | "phpunit/phpunit": "~4.0" 868 | }, 869 | "type": "library", 870 | "autoload": { 871 | "psr-0": { 872 | "Codeception\\": "src/" 873 | } 874 | }, 875 | "notification-url": "https://packagist.org/downloads/", 876 | "license": [ 877 | "MIT" 878 | ], 879 | "authors": [ 880 | { 881 | "name": "Michael Bodnarchuk", 882 | "email": "davert.php@mailican.com" 883 | } 884 | ], 885 | "description": "BDD code blocks for PHPUnit and Codeception", 886 | "time": "2016-10-21T09:42:00+00:00" 887 | }, 888 | { 889 | "name": "codeception/verify", 890 | "version": "0.3.3", 891 | "source": { 892 | "type": "git", 893 | "url": "https://github.com/Codeception/Verify.git", 894 | "reference": "5d649dda453cd814dadc4bb053060cd2c6bb4b4c" 895 | }, 896 | "dist": { 897 | "type": "zip", 898 | "url": "https://api.github.com/repos/Codeception/Verify/zipball/5d649dda453cd814dadc4bb053060cd2c6bb4b4c", 899 | "reference": "5d649dda453cd814dadc4bb053060cd2c6bb4b4c", 900 | "shasum": "" 901 | }, 902 | "require-dev": { 903 | "phpunit/phpunit": "~4.0" 904 | }, 905 | "type": "library", 906 | "autoload": { 907 | "files": [ 908 | "src/Codeception/function.php" 909 | ] 910 | }, 911 | "notification-url": "https://packagist.org/downloads/", 912 | "license": [ 913 | "MIT" 914 | ], 915 | "authors": [ 916 | { 917 | "name": "Michael Bodnarchuk", 918 | "email": "davert.php@mailican.com" 919 | } 920 | ], 921 | "description": "BDD assertion library for PHPUnit", 922 | "time": "2017-01-09T10:58:51+00:00" 923 | }, 924 | { 925 | "name": "doctrine/instantiator", 926 | "version": "1.0.5", 927 | "source": { 928 | "type": "git", 929 | "url": "https://github.com/doctrine/instantiator.git", 930 | "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d" 931 | }, 932 | "dist": { 933 | "type": "zip", 934 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d", 935 | "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d", 936 | "shasum": "" 937 | }, 938 | "require": { 939 | "php": ">=5.3,<8.0-DEV" 940 | }, 941 | "require-dev": { 942 | "athletic/athletic": "~0.1.8", 943 | "ext-pdo": "*", 944 | "ext-phar": "*", 945 | "phpunit/phpunit": "~4.0", 946 | "squizlabs/php_codesniffer": "~2.0" 947 | }, 948 | "type": "library", 949 | "extra": { 950 | "branch-alias": { 951 | "dev-master": "1.0.x-dev" 952 | } 953 | }, 954 | "autoload": { 955 | "psr-4": { 956 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" 957 | } 958 | }, 959 | "notification-url": "https://packagist.org/downloads/", 960 | "license": [ 961 | "MIT" 962 | ], 963 | "authors": [ 964 | { 965 | "name": "Marco Pivetta", 966 | "email": "ocramius@gmail.com", 967 | "homepage": "http://ocramius.github.com/" 968 | } 969 | ], 970 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", 971 | "homepage": "https://github.com/doctrine/instantiator", 972 | "keywords": [ 973 | "constructor", 974 | "instantiate" 975 | ], 976 | "time": "2015-06-14T21:17:01+00:00" 977 | }, 978 | { 979 | "name": "fzaninotto/faker", 980 | "version": "v1.6.0", 981 | "source": { 982 | "type": "git", 983 | "url": "https://github.com/fzaninotto/Faker.git", 984 | "reference": "44f9a286a04b80c76a4e5fb7aad8bb539b920123" 985 | }, 986 | "dist": { 987 | "type": "zip", 988 | "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/44f9a286a04b80c76a4e5fb7aad8bb539b920123", 989 | "reference": "44f9a286a04b80c76a4e5fb7aad8bb539b920123", 990 | "shasum": "" 991 | }, 992 | "require": { 993 | "php": "^5.3.3|^7.0" 994 | }, 995 | "require-dev": { 996 | "ext-intl": "*", 997 | "phpunit/phpunit": "~4.0", 998 | "squizlabs/php_codesniffer": "~1.5" 999 | }, 1000 | "type": "library", 1001 | "extra": { 1002 | "branch-alias": [] 1003 | }, 1004 | "autoload": { 1005 | "psr-4": { 1006 | "Faker\\": "src/Faker/" 1007 | } 1008 | }, 1009 | "notification-url": "https://packagist.org/downloads/", 1010 | "license": [ 1011 | "MIT" 1012 | ], 1013 | "authors": [ 1014 | { 1015 | "name": "François Zaninotto" 1016 | } 1017 | ], 1018 | "description": "Faker is a PHP library that generates fake data for you.", 1019 | "keywords": [ 1020 | "data", 1021 | "faker", 1022 | "fixtures" 1023 | ], 1024 | "time": "2016-04-29T12:21:54+00:00" 1025 | }, 1026 | { 1027 | "name": "guzzlehttp/psr7", 1028 | "version": "1.4.2", 1029 | "source": { 1030 | "type": "git", 1031 | "url": "https://github.com/guzzle/psr7.git", 1032 | "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c" 1033 | }, 1034 | "dist": { 1035 | "type": "zip", 1036 | "url": "https://api.github.com/repos/guzzle/psr7/zipball/f5b8a8512e2b58b0071a7280e39f14f72e05d87c", 1037 | "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c", 1038 | "shasum": "" 1039 | }, 1040 | "require": { 1041 | "php": ">=5.4.0", 1042 | "psr/http-message": "~1.0" 1043 | }, 1044 | "provide": { 1045 | "psr/http-message-implementation": "1.0" 1046 | }, 1047 | "require-dev": { 1048 | "phpunit/phpunit": "~4.0" 1049 | }, 1050 | "type": "library", 1051 | "extra": { 1052 | "branch-alias": { 1053 | "dev-master": "1.4-dev" 1054 | } 1055 | }, 1056 | "autoload": { 1057 | "psr-4": { 1058 | "GuzzleHttp\\Psr7\\": "src/" 1059 | }, 1060 | "files": [ 1061 | "src/functions_include.php" 1062 | ] 1063 | }, 1064 | "notification-url": "https://packagist.org/downloads/", 1065 | "license": [ 1066 | "MIT" 1067 | ], 1068 | "authors": [ 1069 | { 1070 | "name": "Michael Dowling", 1071 | "email": "mtdowling@gmail.com", 1072 | "homepage": "https://github.com/mtdowling" 1073 | }, 1074 | { 1075 | "name": "Tobias Schultze", 1076 | "homepage": "https://github.com/Tobion" 1077 | } 1078 | ], 1079 | "description": "PSR-7 message implementation that also provides common utility methods", 1080 | "keywords": [ 1081 | "http", 1082 | "message", 1083 | "request", 1084 | "response", 1085 | "stream", 1086 | "uri", 1087 | "url" 1088 | ], 1089 | "time": "2017-03-20T17:10:46+00:00" 1090 | }, 1091 | { 1092 | "name": "myclabs/deep-copy", 1093 | "version": "1.6.1", 1094 | "source": { 1095 | "type": "git", 1096 | "url": "https://github.com/myclabs/DeepCopy.git", 1097 | "reference": "8e6e04167378abf1ddb4d3522d8755c5fd90d102" 1098 | }, 1099 | "dist": { 1100 | "type": "zip", 1101 | "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/8e6e04167378abf1ddb4d3522d8755c5fd90d102", 1102 | "reference": "8e6e04167378abf1ddb4d3522d8755c5fd90d102", 1103 | "shasum": "" 1104 | }, 1105 | "require": { 1106 | "php": ">=5.4.0" 1107 | }, 1108 | "require-dev": { 1109 | "doctrine/collections": "1.*", 1110 | "phpunit/phpunit": "~4.1" 1111 | }, 1112 | "type": "library", 1113 | "autoload": { 1114 | "psr-4": { 1115 | "DeepCopy\\": "src/DeepCopy/" 1116 | } 1117 | }, 1118 | "notification-url": "https://packagist.org/downloads/", 1119 | "license": [ 1120 | "MIT" 1121 | ], 1122 | "description": "Create deep copies (clones) of your objects", 1123 | "homepage": "https://github.com/myclabs/DeepCopy", 1124 | "keywords": [ 1125 | "clone", 1126 | "copy", 1127 | "duplicate", 1128 | "object", 1129 | "object graph" 1130 | ], 1131 | "time": "2017-04-12T18:52:22+00:00" 1132 | }, 1133 | { 1134 | "name": "phpdocumentor/reflection-common", 1135 | "version": "1.0", 1136 | "source": { 1137 | "type": "git", 1138 | "url": "https://github.com/phpDocumentor/ReflectionCommon.git", 1139 | "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c" 1140 | }, 1141 | "dist": { 1142 | "type": "zip", 1143 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/144c307535e82c8fdcaacbcfc1d6d8eeb896687c", 1144 | "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c", 1145 | "shasum": "" 1146 | }, 1147 | "require": { 1148 | "php": ">=5.5" 1149 | }, 1150 | "require-dev": { 1151 | "phpunit/phpunit": "^4.6" 1152 | }, 1153 | "type": "library", 1154 | "extra": { 1155 | "branch-alias": { 1156 | "dev-master": "1.0.x-dev" 1157 | } 1158 | }, 1159 | "autoload": { 1160 | "psr-4": { 1161 | "phpDocumentor\\Reflection\\": [ 1162 | "src" 1163 | ] 1164 | } 1165 | }, 1166 | "notification-url": "https://packagist.org/downloads/", 1167 | "license": [ 1168 | "MIT" 1169 | ], 1170 | "authors": [ 1171 | { 1172 | "name": "Jaap van Otterdijk", 1173 | "email": "opensource@ijaap.nl" 1174 | } 1175 | ], 1176 | "description": "Common reflection classes used by phpdocumentor to reflect the code structure", 1177 | "homepage": "http://www.phpdoc.org", 1178 | "keywords": [ 1179 | "FQSEN", 1180 | "phpDocumentor", 1181 | "phpdoc", 1182 | "reflection", 1183 | "static analysis" 1184 | ], 1185 | "time": "2015-12-27T11:43:31+00:00" 1186 | }, 1187 | { 1188 | "name": "phpdocumentor/reflection-docblock", 1189 | "version": "3.1.1", 1190 | "source": { 1191 | "type": "git", 1192 | "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", 1193 | "reference": "8331b5efe816ae05461b7ca1e721c01b46bafb3e" 1194 | }, 1195 | "dist": { 1196 | "type": "zip", 1197 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/8331b5efe816ae05461b7ca1e721c01b46bafb3e", 1198 | "reference": "8331b5efe816ae05461b7ca1e721c01b46bafb3e", 1199 | "shasum": "" 1200 | }, 1201 | "require": { 1202 | "php": ">=5.5", 1203 | "phpdocumentor/reflection-common": "^1.0@dev", 1204 | "phpdocumentor/type-resolver": "^0.2.0", 1205 | "webmozart/assert": "^1.0" 1206 | }, 1207 | "require-dev": { 1208 | "mockery/mockery": "^0.9.4", 1209 | "phpunit/phpunit": "^4.4" 1210 | }, 1211 | "type": "library", 1212 | "autoload": { 1213 | "psr-4": { 1214 | "phpDocumentor\\Reflection\\": [ 1215 | "src/" 1216 | ] 1217 | } 1218 | }, 1219 | "notification-url": "https://packagist.org/downloads/", 1220 | "license": [ 1221 | "MIT" 1222 | ], 1223 | "authors": [ 1224 | { 1225 | "name": "Mike van Riel", 1226 | "email": "me@mikevanriel.com" 1227 | } 1228 | ], 1229 | "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", 1230 | "time": "2016-09-30T07:12:33+00:00" 1231 | }, 1232 | { 1233 | "name": "phpdocumentor/type-resolver", 1234 | "version": "0.2.1", 1235 | "source": { 1236 | "type": "git", 1237 | "url": "https://github.com/phpDocumentor/TypeResolver.git", 1238 | "reference": "e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb" 1239 | }, 1240 | "dist": { 1241 | "type": "zip", 1242 | "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb", 1243 | "reference": "e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb", 1244 | "shasum": "" 1245 | }, 1246 | "require": { 1247 | "php": ">=5.5", 1248 | "phpdocumentor/reflection-common": "^1.0" 1249 | }, 1250 | "require-dev": { 1251 | "mockery/mockery": "^0.9.4", 1252 | "phpunit/phpunit": "^5.2||^4.8.24" 1253 | }, 1254 | "type": "library", 1255 | "extra": { 1256 | "branch-alias": { 1257 | "dev-master": "1.0.x-dev" 1258 | } 1259 | }, 1260 | "autoload": { 1261 | "psr-4": { 1262 | "phpDocumentor\\Reflection\\": [ 1263 | "src/" 1264 | ] 1265 | } 1266 | }, 1267 | "notification-url": "https://packagist.org/downloads/", 1268 | "license": [ 1269 | "MIT" 1270 | ], 1271 | "authors": [ 1272 | { 1273 | "name": "Mike van Riel", 1274 | "email": "me@mikevanriel.com" 1275 | } 1276 | ], 1277 | "time": "2016-11-25T06:54:22+00:00" 1278 | }, 1279 | { 1280 | "name": "phpspec/php-diff", 1281 | "version": "v1.1.0", 1282 | "source": { 1283 | "type": "git", 1284 | "url": "https://github.com/phpspec/php-diff.git", 1285 | "reference": "0464787bfa7cd13576c5a1e318709768798bec6a" 1286 | }, 1287 | "dist": { 1288 | "type": "zip", 1289 | "url": "https://api.github.com/repos/phpspec/php-diff/zipball/0464787bfa7cd13576c5a1e318709768798bec6a", 1290 | "reference": "0464787bfa7cd13576c5a1e318709768798bec6a", 1291 | "shasum": "" 1292 | }, 1293 | "type": "library", 1294 | "extra": { 1295 | "branch-alias": { 1296 | "dev-master": "1.0.x-dev" 1297 | } 1298 | }, 1299 | "autoload": { 1300 | "psr-0": { 1301 | "Diff": "lib/" 1302 | } 1303 | }, 1304 | "notification-url": "https://packagist.org/downloads/", 1305 | "license": [ 1306 | "BSD-3-Clause" 1307 | ], 1308 | "authors": [ 1309 | { 1310 | "name": "Chris Boulton", 1311 | "homepage": "http://github.com/chrisboulton" 1312 | } 1313 | ], 1314 | "description": "A comprehensive library for generating differences between two hashable objects (strings or arrays).", 1315 | "time": "2016-04-07T12:29:16+00:00" 1316 | }, 1317 | { 1318 | "name": "phpspec/prophecy", 1319 | "version": "v1.7.0", 1320 | "source": { 1321 | "type": "git", 1322 | "url": "https://github.com/phpspec/prophecy.git", 1323 | "reference": "93d39f1f7f9326d746203c7c056f300f7f126073" 1324 | }, 1325 | "dist": { 1326 | "type": "zip", 1327 | "url": "https://api.github.com/repos/phpspec/prophecy/zipball/93d39f1f7f9326d746203c7c056f300f7f126073", 1328 | "reference": "93d39f1f7f9326d746203c7c056f300f7f126073", 1329 | "shasum": "" 1330 | }, 1331 | "require": { 1332 | "doctrine/instantiator": "^1.0.2", 1333 | "php": "^5.3|^7.0", 1334 | "phpdocumentor/reflection-docblock": "^2.0|^3.0.2", 1335 | "sebastian/comparator": "^1.1|^2.0", 1336 | "sebastian/recursion-context": "^1.0|^2.0|^3.0" 1337 | }, 1338 | "require-dev": { 1339 | "phpspec/phpspec": "^2.5|^3.2", 1340 | "phpunit/phpunit": "^4.8 || ^5.6.5" 1341 | }, 1342 | "type": "library", 1343 | "extra": { 1344 | "branch-alias": { 1345 | "dev-master": "1.6.x-dev" 1346 | } 1347 | }, 1348 | "autoload": { 1349 | "psr-0": { 1350 | "Prophecy\\": "src/" 1351 | } 1352 | }, 1353 | "notification-url": "https://packagist.org/downloads/", 1354 | "license": [ 1355 | "MIT" 1356 | ], 1357 | "authors": [ 1358 | { 1359 | "name": "Konstantin Kudryashov", 1360 | "email": "ever.zet@gmail.com", 1361 | "homepage": "http://everzet.com" 1362 | }, 1363 | { 1364 | "name": "Marcello Duarte", 1365 | "email": "marcello.duarte@gmail.com" 1366 | } 1367 | ], 1368 | "description": "Highly opinionated mocking framework for PHP 5.3+", 1369 | "homepage": "https://github.com/phpspec/prophecy", 1370 | "keywords": [ 1371 | "Double", 1372 | "Dummy", 1373 | "fake", 1374 | "mock", 1375 | "spy", 1376 | "stub" 1377 | ], 1378 | "time": "2017-03-02T20:05:34+00:00" 1379 | }, 1380 | { 1381 | "name": "phpunit/php-code-coverage", 1382 | "version": "4.0.8", 1383 | "source": { 1384 | "type": "git", 1385 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 1386 | "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d" 1387 | }, 1388 | "dist": { 1389 | "type": "zip", 1390 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ef7b2f56815df854e66ceaee8ebe9393ae36a40d", 1391 | "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d", 1392 | "shasum": "" 1393 | }, 1394 | "require": { 1395 | "ext-dom": "*", 1396 | "ext-xmlwriter": "*", 1397 | "php": "^5.6 || ^7.0", 1398 | "phpunit/php-file-iterator": "^1.3", 1399 | "phpunit/php-text-template": "^1.2", 1400 | "phpunit/php-token-stream": "^1.4.2 || ^2.0", 1401 | "sebastian/code-unit-reverse-lookup": "^1.0", 1402 | "sebastian/environment": "^1.3.2 || ^2.0", 1403 | "sebastian/version": "^1.0 || ^2.0" 1404 | }, 1405 | "require-dev": { 1406 | "ext-xdebug": "^2.1.4", 1407 | "phpunit/phpunit": "^5.7" 1408 | }, 1409 | "suggest": { 1410 | "ext-xdebug": "^2.5.1" 1411 | }, 1412 | "type": "library", 1413 | "extra": { 1414 | "branch-alias": { 1415 | "dev-master": "4.0.x-dev" 1416 | } 1417 | }, 1418 | "autoload": { 1419 | "classmap": [ 1420 | "src/" 1421 | ] 1422 | }, 1423 | "notification-url": "https://packagist.org/downloads/", 1424 | "license": [ 1425 | "BSD-3-Clause" 1426 | ], 1427 | "authors": [ 1428 | { 1429 | "name": "Sebastian Bergmann", 1430 | "email": "sb@sebastian-bergmann.de", 1431 | "role": "lead" 1432 | } 1433 | ], 1434 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", 1435 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage", 1436 | "keywords": [ 1437 | "coverage", 1438 | "testing", 1439 | "xunit" 1440 | ], 1441 | "time": "2017-04-02T07:44:40+00:00" 1442 | }, 1443 | { 1444 | "name": "phpunit/php-file-iterator", 1445 | "version": "1.4.2", 1446 | "source": { 1447 | "type": "git", 1448 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git", 1449 | "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5" 1450 | }, 1451 | "dist": { 1452 | "type": "zip", 1453 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/3cc8f69b3028d0f96a9078e6295d86e9bf019be5", 1454 | "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5", 1455 | "shasum": "" 1456 | }, 1457 | "require": { 1458 | "php": ">=5.3.3" 1459 | }, 1460 | "type": "library", 1461 | "extra": { 1462 | "branch-alias": { 1463 | "dev-master": "1.4.x-dev" 1464 | } 1465 | }, 1466 | "autoload": { 1467 | "classmap": [ 1468 | "src/" 1469 | ] 1470 | }, 1471 | "notification-url": "https://packagist.org/downloads/", 1472 | "license": [ 1473 | "BSD-3-Clause" 1474 | ], 1475 | "authors": [ 1476 | { 1477 | "name": "Sebastian Bergmann", 1478 | "email": "sb@sebastian-bergmann.de", 1479 | "role": "lead" 1480 | } 1481 | ], 1482 | "description": "FilterIterator implementation that filters files based on a list of suffixes.", 1483 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", 1484 | "keywords": [ 1485 | "filesystem", 1486 | "iterator" 1487 | ], 1488 | "time": "2016-10-03T07:40:28+00:00" 1489 | }, 1490 | { 1491 | "name": "phpunit/php-text-template", 1492 | "version": "1.2.1", 1493 | "source": { 1494 | "type": "git", 1495 | "url": "https://github.com/sebastianbergmann/php-text-template.git", 1496 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" 1497 | }, 1498 | "dist": { 1499 | "type": "zip", 1500 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 1501 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 1502 | "shasum": "" 1503 | }, 1504 | "require": { 1505 | "php": ">=5.3.3" 1506 | }, 1507 | "type": "library", 1508 | "autoload": { 1509 | "classmap": [ 1510 | "src/" 1511 | ] 1512 | }, 1513 | "notification-url": "https://packagist.org/downloads/", 1514 | "license": [ 1515 | "BSD-3-Clause" 1516 | ], 1517 | "authors": [ 1518 | { 1519 | "name": "Sebastian Bergmann", 1520 | "email": "sebastian@phpunit.de", 1521 | "role": "lead" 1522 | } 1523 | ], 1524 | "description": "Simple template engine.", 1525 | "homepage": "https://github.com/sebastianbergmann/php-text-template/", 1526 | "keywords": [ 1527 | "template" 1528 | ], 1529 | "time": "2015-06-21T13:50:34+00:00" 1530 | }, 1531 | { 1532 | "name": "phpunit/php-timer", 1533 | "version": "1.0.9", 1534 | "source": { 1535 | "type": "git", 1536 | "url": "https://github.com/sebastianbergmann/php-timer.git", 1537 | "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f" 1538 | }, 1539 | "dist": { 1540 | "type": "zip", 1541 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", 1542 | "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", 1543 | "shasum": "" 1544 | }, 1545 | "require": { 1546 | "php": "^5.3.3 || ^7.0" 1547 | }, 1548 | "require-dev": { 1549 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" 1550 | }, 1551 | "type": "library", 1552 | "extra": { 1553 | "branch-alias": { 1554 | "dev-master": "1.0-dev" 1555 | } 1556 | }, 1557 | "autoload": { 1558 | "classmap": [ 1559 | "src/" 1560 | ] 1561 | }, 1562 | "notification-url": "https://packagist.org/downloads/", 1563 | "license": [ 1564 | "BSD-3-Clause" 1565 | ], 1566 | "authors": [ 1567 | { 1568 | "name": "Sebastian Bergmann", 1569 | "email": "sb@sebastian-bergmann.de", 1570 | "role": "lead" 1571 | } 1572 | ], 1573 | "description": "Utility class for timing", 1574 | "homepage": "https://github.com/sebastianbergmann/php-timer/", 1575 | "keywords": [ 1576 | "timer" 1577 | ], 1578 | "time": "2017-02-26T11:10:40+00:00" 1579 | }, 1580 | { 1581 | "name": "phpunit/php-token-stream", 1582 | "version": "1.4.11", 1583 | "source": { 1584 | "type": "git", 1585 | "url": "https://github.com/sebastianbergmann/php-token-stream.git", 1586 | "reference": "e03f8f67534427a787e21a385a67ec3ca6978ea7" 1587 | }, 1588 | "dist": { 1589 | "type": "zip", 1590 | "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/e03f8f67534427a787e21a385a67ec3ca6978ea7", 1591 | "reference": "e03f8f67534427a787e21a385a67ec3ca6978ea7", 1592 | "shasum": "" 1593 | }, 1594 | "require": { 1595 | "ext-tokenizer": "*", 1596 | "php": ">=5.3.3" 1597 | }, 1598 | "require-dev": { 1599 | "phpunit/phpunit": "~4.2" 1600 | }, 1601 | "type": "library", 1602 | "extra": { 1603 | "branch-alias": { 1604 | "dev-master": "1.4-dev" 1605 | } 1606 | }, 1607 | "autoload": { 1608 | "classmap": [ 1609 | "src/" 1610 | ] 1611 | }, 1612 | "notification-url": "https://packagist.org/downloads/", 1613 | "license": [ 1614 | "BSD-3-Clause" 1615 | ], 1616 | "authors": [ 1617 | { 1618 | "name": "Sebastian Bergmann", 1619 | "email": "sebastian@phpunit.de" 1620 | } 1621 | ], 1622 | "description": "Wrapper around PHP's tokenizer extension.", 1623 | "homepage": "https://github.com/sebastianbergmann/php-token-stream/", 1624 | "keywords": [ 1625 | "tokenizer" 1626 | ], 1627 | "time": "2017-02-27T10:12:30+00:00" 1628 | }, 1629 | { 1630 | "name": "phpunit/phpunit", 1631 | "version": "5.7.20", 1632 | "source": { 1633 | "type": "git", 1634 | "url": "https://github.com/sebastianbergmann/phpunit.git", 1635 | "reference": "3cb94a5f8c07a03c8b7527ed7468a2926203f58b" 1636 | }, 1637 | "dist": { 1638 | "type": "zip", 1639 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3cb94a5f8c07a03c8b7527ed7468a2926203f58b", 1640 | "reference": "3cb94a5f8c07a03c8b7527ed7468a2926203f58b", 1641 | "shasum": "" 1642 | }, 1643 | "require": { 1644 | "ext-dom": "*", 1645 | "ext-json": "*", 1646 | "ext-libxml": "*", 1647 | "ext-mbstring": "*", 1648 | "ext-xml": "*", 1649 | "myclabs/deep-copy": "~1.3", 1650 | "php": "^5.6 || ^7.0", 1651 | "phpspec/prophecy": "^1.6.2", 1652 | "phpunit/php-code-coverage": "^4.0.4", 1653 | "phpunit/php-file-iterator": "~1.4", 1654 | "phpunit/php-text-template": "~1.2", 1655 | "phpunit/php-timer": "^1.0.6", 1656 | "phpunit/phpunit-mock-objects": "^3.2", 1657 | "sebastian/comparator": "^1.2.4", 1658 | "sebastian/diff": "^1.4.3", 1659 | "sebastian/environment": "^1.3.4 || ^2.0", 1660 | "sebastian/exporter": "~2.0", 1661 | "sebastian/global-state": "^1.1", 1662 | "sebastian/object-enumerator": "~2.0", 1663 | "sebastian/resource-operations": "~1.0", 1664 | "sebastian/version": "~1.0.3|~2.0", 1665 | "symfony/yaml": "~2.1|~3.0" 1666 | }, 1667 | "conflict": { 1668 | "phpdocumentor/reflection-docblock": "3.0.2" 1669 | }, 1670 | "require-dev": { 1671 | "ext-pdo": "*" 1672 | }, 1673 | "suggest": { 1674 | "ext-xdebug": "*", 1675 | "phpunit/php-invoker": "~1.1" 1676 | }, 1677 | "bin": [ 1678 | "phpunit" 1679 | ], 1680 | "type": "library", 1681 | "extra": { 1682 | "branch-alias": { 1683 | "dev-master": "5.7.x-dev" 1684 | } 1685 | }, 1686 | "autoload": { 1687 | "classmap": [ 1688 | "src/" 1689 | ] 1690 | }, 1691 | "notification-url": "https://packagist.org/downloads/", 1692 | "license": [ 1693 | "BSD-3-Clause" 1694 | ], 1695 | "authors": [ 1696 | { 1697 | "name": "Sebastian Bergmann", 1698 | "email": "sebastian@phpunit.de", 1699 | "role": "lead" 1700 | } 1701 | ], 1702 | "description": "The PHP Unit Testing framework.", 1703 | "homepage": "https://phpunit.de/", 1704 | "keywords": [ 1705 | "phpunit", 1706 | "testing", 1707 | "xunit" 1708 | ], 1709 | "time": "2017-05-22T07:42:55+00:00" 1710 | }, 1711 | { 1712 | "name": "phpunit/phpunit-mock-objects", 1713 | "version": "3.4.3", 1714 | "source": { 1715 | "type": "git", 1716 | "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", 1717 | "reference": "3ab72b65b39b491e0c011e2e09bb2206c2aa8e24" 1718 | }, 1719 | "dist": { 1720 | "type": "zip", 1721 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/3ab72b65b39b491e0c011e2e09bb2206c2aa8e24", 1722 | "reference": "3ab72b65b39b491e0c011e2e09bb2206c2aa8e24", 1723 | "shasum": "" 1724 | }, 1725 | "require": { 1726 | "doctrine/instantiator": "^1.0.2", 1727 | "php": "^5.6 || ^7.0", 1728 | "phpunit/php-text-template": "^1.2", 1729 | "sebastian/exporter": "^1.2 || ^2.0" 1730 | }, 1731 | "conflict": { 1732 | "phpunit/phpunit": "<5.4.0" 1733 | }, 1734 | "require-dev": { 1735 | "phpunit/phpunit": "^5.4" 1736 | }, 1737 | "suggest": { 1738 | "ext-soap": "*" 1739 | }, 1740 | "type": "library", 1741 | "extra": { 1742 | "branch-alias": { 1743 | "dev-master": "3.2.x-dev" 1744 | } 1745 | }, 1746 | "autoload": { 1747 | "classmap": [ 1748 | "src/" 1749 | ] 1750 | }, 1751 | "notification-url": "https://packagist.org/downloads/", 1752 | "license": [ 1753 | "BSD-3-Clause" 1754 | ], 1755 | "authors": [ 1756 | { 1757 | "name": "Sebastian Bergmann", 1758 | "email": "sb@sebastian-bergmann.de", 1759 | "role": "lead" 1760 | } 1761 | ], 1762 | "description": "Mock Object library for PHPUnit", 1763 | "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", 1764 | "keywords": [ 1765 | "mock", 1766 | "xunit" 1767 | ], 1768 | "time": "2016-12-08T20:27:08+00:00" 1769 | }, 1770 | { 1771 | "name": "psr/http-message", 1772 | "version": "1.0.1", 1773 | "source": { 1774 | "type": "git", 1775 | "url": "https://github.com/php-fig/http-message.git", 1776 | "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" 1777 | }, 1778 | "dist": { 1779 | "type": "zip", 1780 | "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", 1781 | "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", 1782 | "shasum": "" 1783 | }, 1784 | "require": { 1785 | "php": ">=5.3.0" 1786 | }, 1787 | "type": "library", 1788 | "extra": { 1789 | "branch-alias": { 1790 | "dev-master": "1.0.x-dev" 1791 | } 1792 | }, 1793 | "autoload": { 1794 | "psr-4": { 1795 | "Psr\\Http\\Message\\": "src/" 1796 | } 1797 | }, 1798 | "notification-url": "https://packagist.org/downloads/", 1799 | "license": [ 1800 | "MIT" 1801 | ], 1802 | "authors": [ 1803 | { 1804 | "name": "PHP-FIG", 1805 | "homepage": "http://www.php-fig.org/" 1806 | } 1807 | ], 1808 | "description": "Common interface for HTTP messages", 1809 | "homepage": "https://github.com/php-fig/http-message", 1810 | "keywords": [ 1811 | "http", 1812 | "http-message", 1813 | "psr", 1814 | "psr-7", 1815 | "request", 1816 | "response" 1817 | ], 1818 | "time": "2016-08-06T14:39:51+00:00" 1819 | }, 1820 | { 1821 | "name": "psr/log", 1822 | "version": "1.0.2", 1823 | "source": { 1824 | "type": "git", 1825 | "url": "https://github.com/php-fig/log.git", 1826 | "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d" 1827 | }, 1828 | "dist": { 1829 | "type": "zip", 1830 | "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", 1831 | "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", 1832 | "shasum": "" 1833 | }, 1834 | "require": { 1835 | "php": ">=5.3.0" 1836 | }, 1837 | "type": "library", 1838 | "extra": { 1839 | "branch-alias": { 1840 | "dev-master": "1.0.x-dev" 1841 | } 1842 | }, 1843 | "autoload": { 1844 | "psr-4": { 1845 | "Psr\\Log\\": "Psr/Log/" 1846 | } 1847 | }, 1848 | "notification-url": "https://packagist.org/downloads/", 1849 | "license": [ 1850 | "MIT" 1851 | ], 1852 | "authors": [ 1853 | { 1854 | "name": "PHP-FIG", 1855 | "homepage": "http://www.php-fig.org/" 1856 | } 1857 | ], 1858 | "description": "Common interface for logging libraries", 1859 | "homepage": "https://github.com/php-fig/log", 1860 | "keywords": [ 1861 | "log", 1862 | "psr", 1863 | "psr-3" 1864 | ], 1865 | "time": "2016-10-10T12:19:37+00:00" 1866 | }, 1867 | { 1868 | "name": "sebastian/code-unit-reverse-lookup", 1869 | "version": "1.0.1", 1870 | "source": { 1871 | "type": "git", 1872 | "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", 1873 | "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" 1874 | }, 1875 | "dist": { 1876 | "type": "zip", 1877 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", 1878 | "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", 1879 | "shasum": "" 1880 | }, 1881 | "require": { 1882 | "php": "^5.6 || ^7.0" 1883 | }, 1884 | "require-dev": { 1885 | "phpunit/phpunit": "^5.7 || ^6.0" 1886 | }, 1887 | "type": "library", 1888 | "extra": { 1889 | "branch-alias": { 1890 | "dev-master": "1.0.x-dev" 1891 | } 1892 | }, 1893 | "autoload": { 1894 | "classmap": [ 1895 | "src/" 1896 | ] 1897 | }, 1898 | "notification-url": "https://packagist.org/downloads/", 1899 | "license": [ 1900 | "BSD-3-Clause" 1901 | ], 1902 | "authors": [ 1903 | { 1904 | "name": "Sebastian Bergmann", 1905 | "email": "sebastian@phpunit.de" 1906 | } 1907 | ], 1908 | "description": "Looks up which function or method a line of code belongs to", 1909 | "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", 1910 | "time": "2017-03-04T06:30:41+00:00" 1911 | }, 1912 | { 1913 | "name": "sebastian/comparator", 1914 | "version": "1.2.4", 1915 | "source": { 1916 | "type": "git", 1917 | "url": "https://github.com/sebastianbergmann/comparator.git", 1918 | "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be" 1919 | }, 1920 | "dist": { 1921 | "type": "zip", 1922 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2b7424b55f5047b47ac6e5ccb20b2aea4011d9be", 1923 | "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be", 1924 | "shasum": "" 1925 | }, 1926 | "require": { 1927 | "php": ">=5.3.3", 1928 | "sebastian/diff": "~1.2", 1929 | "sebastian/exporter": "~1.2 || ~2.0" 1930 | }, 1931 | "require-dev": { 1932 | "phpunit/phpunit": "~4.4" 1933 | }, 1934 | "type": "library", 1935 | "extra": { 1936 | "branch-alias": { 1937 | "dev-master": "1.2.x-dev" 1938 | } 1939 | }, 1940 | "autoload": { 1941 | "classmap": [ 1942 | "src/" 1943 | ] 1944 | }, 1945 | "notification-url": "https://packagist.org/downloads/", 1946 | "license": [ 1947 | "BSD-3-Clause" 1948 | ], 1949 | "authors": [ 1950 | { 1951 | "name": "Jeff Welch", 1952 | "email": "whatthejeff@gmail.com" 1953 | }, 1954 | { 1955 | "name": "Volker Dusch", 1956 | "email": "github@wallbash.com" 1957 | }, 1958 | { 1959 | "name": "Bernhard Schussek", 1960 | "email": "bschussek@2bepublished.at" 1961 | }, 1962 | { 1963 | "name": "Sebastian Bergmann", 1964 | "email": "sebastian@phpunit.de" 1965 | } 1966 | ], 1967 | "description": "Provides the functionality to compare PHP values for equality", 1968 | "homepage": "http://www.github.com/sebastianbergmann/comparator", 1969 | "keywords": [ 1970 | "comparator", 1971 | "compare", 1972 | "equality" 1973 | ], 1974 | "time": "2017-01-29T09:50:25+00:00" 1975 | }, 1976 | { 1977 | "name": "sebastian/diff", 1978 | "version": "1.4.3", 1979 | "source": { 1980 | "type": "git", 1981 | "url": "https://github.com/sebastianbergmann/diff.git", 1982 | "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4" 1983 | }, 1984 | "dist": { 1985 | "type": "zip", 1986 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7f066a26a962dbe58ddea9f72a4e82874a3975a4", 1987 | "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4", 1988 | "shasum": "" 1989 | }, 1990 | "require": { 1991 | "php": "^5.3.3 || ^7.0" 1992 | }, 1993 | "require-dev": { 1994 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" 1995 | }, 1996 | "type": "library", 1997 | "extra": { 1998 | "branch-alias": { 1999 | "dev-master": "1.4-dev" 2000 | } 2001 | }, 2002 | "autoload": { 2003 | "classmap": [ 2004 | "src/" 2005 | ] 2006 | }, 2007 | "notification-url": "https://packagist.org/downloads/", 2008 | "license": [ 2009 | "BSD-3-Clause" 2010 | ], 2011 | "authors": [ 2012 | { 2013 | "name": "Kore Nordmann", 2014 | "email": "mail@kore-nordmann.de" 2015 | }, 2016 | { 2017 | "name": "Sebastian Bergmann", 2018 | "email": "sebastian@phpunit.de" 2019 | } 2020 | ], 2021 | "description": "Diff implementation", 2022 | "homepage": "https://github.com/sebastianbergmann/diff", 2023 | "keywords": [ 2024 | "diff" 2025 | ], 2026 | "time": "2017-05-22T07:24:03+00:00" 2027 | }, 2028 | { 2029 | "name": "sebastian/environment", 2030 | "version": "2.0.0", 2031 | "source": { 2032 | "type": "git", 2033 | "url": "https://github.com/sebastianbergmann/environment.git", 2034 | "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac" 2035 | }, 2036 | "dist": { 2037 | "type": "zip", 2038 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/5795ffe5dc5b02460c3e34222fee8cbe245d8fac", 2039 | "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac", 2040 | "shasum": "" 2041 | }, 2042 | "require": { 2043 | "php": "^5.6 || ^7.0" 2044 | }, 2045 | "require-dev": { 2046 | "phpunit/phpunit": "^5.0" 2047 | }, 2048 | "type": "library", 2049 | "extra": { 2050 | "branch-alias": { 2051 | "dev-master": "2.0.x-dev" 2052 | } 2053 | }, 2054 | "autoload": { 2055 | "classmap": [ 2056 | "src/" 2057 | ] 2058 | }, 2059 | "notification-url": "https://packagist.org/downloads/", 2060 | "license": [ 2061 | "BSD-3-Clause" 2062 | ], 2063 | "authors": [ 2064 | { 2065 | "name": "Sebastian Bergmann", 2066 | "email": "sebastian@phpunit.de" 2067 | } 2068 | ], 2069 | "description": "Provides functionality to handle HHVM/PHP environments", 2070 | "homepage": "http://www.github.com/sebastianbergmann/environment", 2071 | "keywords": [ 2072 | "Xdebug", 2073 | "environment", 2074 | "hhvm" 2075 | ], 2076 | "time": "2016-11-26T07:53:53+00:00" 2077 | }, 2078 | { 2079 | "name": "sebastian/exporter", 2080 | "version": "2.0.0", 2081 | "source": { 2082 | "type": "git", 2083 | "url": "https://github.com/sebastianbergmann/exporter.git", 2084 | "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4" 2085 | }, 2086 | "dist": { 2087 | "type": "zip", 2088 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4", 2089 | "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4", 2090 | "shasum": "" 2091 | }, 2092 | "require": { 2093 | "php": ">=5.3.3", 2094 | "sebastian/recursion-context": "~2.0" 2095 | }, 2096 | "require-dev": { 2097 | "ext-mbstring": "*", 2098 | "phpunit/phpunit": "~4.4" 2099 | }, 2100 | "type": "library", 2101 | "extra": { 2102 | "branch-alias": { 2103 | "dev-master": "2.0.x-dev" 2104 | } 2105 | }, 2106 | "autoload": { 2107 | "classmap": [ 2108 | "src/" 2109 | ] 2110 | }, 2111 | "notification-url": "https://packagist.org/downloads/", 2112 | "license": [ 2113 | "BSD-3-Clause" 2114 | ], 2115 | "authors": [ 2116 | { 2117 | "name": "Jeff Welch", 2118 | "email": "whatthejeff@gmail.com" 2119 | }, 2120 | { 2121 | "name": "Volker Dusch", 2122 | "email": "github@wallbash.com" 2123 | }, 2124 | { 2125 | "name": "Bernhard Schussek", 2126 | "email": "bschussek@2bepublished.at" 2127 | }, 2128 | { 2129 | "name": "Sebastian Bergmann", 2130 | "email": "sebastian@phpunit.de" 2131 | }, 2132 | { 2133 | "name": "Adam Harvey", 2134 | "email": "aharvey@php.net" 2135 | } 2136 | ], 2137 | "description": "Provides the functionality to export PHP variables for visualization", 2138 | "homepage": "http://www.github.com/sebastianbergmann/exporter", 2139 | "keywords": [ 2140 | "export", 2141 | "exporter" 2142 | ], 2143 | "time": "2016-11-19T08:54:04+00:00" 2144 | }, 2145 | { 2146 | "name": "sebastian/global-state", 2147 | "version": "1.1.1", 2148 | "source": { 2149 | "type": "git", 2150 | "url": "https://github.com/sebastianbergmann/global-state.git", 2151 | "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4" 2152 | }, 2153 | "dist": { 2154 | "type": "zip", 2155 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4", 2156 | "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4", 2157 | "shasum": "" 2158 | }, 2159 | "require": { 2160 | "php": ">=5.3.3" 2161 | }, 2162 | "require-dev": { 2163 | "phpunit/phpunit": "~4.2" 2164 | }, 2165 | "suggest": { 2166 | "ext-uopz": "*" 2167 | }, 2168 | "type": "library", 2169 | "extra": { 2170 | "branch-alias": { 2171 | "dev-master": "1.0-dev" 2172 | } 2173 | }, 2174 | "autoload": { 2175 | "classmap": [ 2176 | "src/" 2177 | ] 2178 | }, 2179 | "notification-url": "https://packagist.org/downloads/", 2180 | "license": [ 2181 | "BSD-3-Clause" 2182 | ], 2183 | "authors": [ 2184 | { 2185 | "name": "Sebastian Bergmann", 2186 | "email": "sebastian@phpunit.de" 2187 | } 2188 | ], 2189 | "description": "Snapshotting of global state", 2190 | "homepage": "http://www.github.com/sebastianbergmann/global-state", 2191 | "keywords": [ 2192 | "global state" 2193 | ], 2194 | "time": "2015-10-12T03:26:01+00:00" 2195 | }, 2196 | { 2197 | "name": "sebastian/object-enumerator", 2198 | "version": "2.0.1", 2199 | "source": { 2200 | "type": "git", 2201 | "url": "https://github.com/sebastianbergmann/object-enumerator.git", 2202 | "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7" 2203 | }, 2204 | "dist": { 2205 | "type": "zip", 2206 | "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1311872ac850040a79c3c058bea3e22d0f09cbb7", 2207 | "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7", 2208 | "shasum": "" 2209 | }, 2210 | "require": { 2211 | "php": ">=5.6", 2212 | "sebastian/recursion-context": "~2.0" 2213 | }, 2214 | "require-dev": { 2215 | "phpunit/phpunit": "~5" 2216 | }, 2217 | "type": "library", 2218 | "extra": { 2219 | "branch-alias": { 2220 | "dev-master": "2.0.x-dev" 2221 | } 2222 | }, 2223 | "autoload": { 2224 | "classmap": [ 2225 | "src/" 2226 | ] 2227 | }, 2228 | "notification-url": "https://packagist.org/downloads/", 2229 | "license": [ 2230 | "BSD-3-Clause" 2231 | ], 2232 | "authors": [ 2233 | { 2234 | "name": "Sebastian Bergmann", 2235 | "email": "sebastian@phpunit.de" 2236 | } 2237 | ], 2238 | "description": "Traverses array structures and object graphs to enumerate all referenced objects", 2239 | "homepage": "https://github.com/sebastianbergmann/object-enumerator/", 2240 | "time": "2017-02-18T15:18:39+00:00" 2241 | }, 2242 | { 2243 | "name": "sebastian/recursion-context", 2244 | "version": "2.0.0", 2245 | "source": { 2246 | "type": "git", 2247 | "url": "https://github.com/sebastianbergmann/recursion-context.git", 2248 | "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a" 2249 | }, 2250 | "dist": { 2251 | "type": "zip", 2252 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/2c3ba150cbec723aa057506e73a8d33bdb286c9a", 2253 | "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a", 2254 | "shasum": "" 2255 | }, 2256 | "require": { 2257 | "php": ">=5.3.3" 2258 | }, 2259 | "require-dev": { 2260 | "phpunit/phpunit": "~4.4" 2261 | }, 2262 | "type": "library", 2263 | "extra": { 2264 | "branch-alias": { 2265 | "dev-master": "2.0.x-dev" 2266 | } 2267 | }, 2268 | "autoload": { 2269 | "classmap": [ 2270 | "src/" 2271 | ] 2272 | }, 2273 | "notification-url": "https://packagist.org/downloads/", 2274 | "license": [ 2275 | "BSD-3-Clause" 2276 | ], 2277 | "authors": [ 2278 | { 2279 | "name": "Jeff Welch", 2280 | "email": "whatthejeff@gmail.com" 2281 | }, 2282 | { 2283 | "name": "Sebastian Bergmann", 2284 | "email": "sebastian@phpunit.de" 2285 | }, 2286 | { 2287 | "name": "Adam Harvey", 2288 | "email": "aharvey@php.net" 2289 | } 2290 | ], 2291 | "description": "Provides functionality to recursively process PHP variables", 2292 | "homepage": "http://www.github.com/sebastianbergmann/recursion-context", 2293 | "time": "2016-11-19T07:33:16+00:00" 2294 | }, 2295 | { 2296 | "name": "sebastian/resource-operations", 2297 | "version": "1.0.0", 2298 | "source": { 2299 | "type": "git", 2300 | "url": "https://github.com/sebastianbergmann/resource-operations.git", 2301 | "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52" 2302 | }, 2303 | "dist": { 2304 | "type": "zip", 2305 | "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", 2306 | "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", 2307 | "shasum": "" 2308 | }, 2309 | "require": { 2310 | "php": ">=5.6.0" 2311 | }, 2312 | "type": "library", 2313 | "extra": { 2314 | "branch-alias": { 2315 | "dev-master": "1.0.x-dev" 2316 | } 2317 | }, 2318 | "autoload": { 2319 | "classmap": [ 2320 | "src/" 2321 | ] 2322 | }, 2323 | "notification-url": "https://packagist.org/downloads/", 2324 | "license": [ 2325 | "BSD-3-Clause" 2326 | ], 2327 | "authors": [ 2328 | { 2329 | "name": "Sebastian Bergmann", 2330 | "email": "sebastian@phpunit.de" 2331 | } 2332 | ], 2333 | "description": "Provides a list of PHP built-in functions that operate on resources", 2334 | "homepage": "https://www.github.com/sebastianbergmann/resource-operations", 2335 | "time": "2015-07-28T20:34:47+00:00" 2336 | }, 2337 | { 2338 | "name": "sebastian/version", 2339 | "version": "2.0.1", 2340 | "source": { 2341 | "type": "git", 2342 | "url": "https://github.com/sebastianbergmann/version.git", 2343 | "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" 2344 | }, 2345 | "dist": { 2346 | "type": "zip", 2347 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", 2348 | "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", 2349 | "shasum": "" 2350 | }, 2351 | "require": { 2352 | "php": ">=5.6" 2353 | }, 2354 | "type": "library", 2355 | "extra": { 2356 | "branch-alias": { 2357 | "dev-master": "2.0.x-dev" 2358 | } 2359 | }, 2360 | "autoload": { 2361 | "classmap": [ 2362 | "src/" 2363 | ] 2364 | }, 2365 | "notification-url": "https://packagist.org/downloads/", 2366 | "license": [ 2367 | "BSD-3-Clause" 2368 | ], 2369 | "authors": [ 2370 | { 2371 | "name": "Sebastian Bergmann", 2372 | "email": "sebastian@phpunit.de", 2373 | "role": "lead" 2374 | } 2375 | ], 2376 | "description": "Library that helps with managing the version number of Git-hosted PHP projects", 2377 | "homepage": "https://github.com/sebastianbergmann/version", 2378 | "time": "2016-10-03T07:35:21+00:00" 2379 | }, 2380 | { 2381 | "name": "stecman/symfony-console-completion", 2382 | "version": "0.7.0", 2383 | "source": { 2384 | "type": "git", 2385 | "url": "https://github.com/stecman/symfony-console-completion.git", 2386 | "reference": "5461d43e53092b3d3b9dbd9d999f2054730f4bbb" 2387 | }, 2388 | "dist": { 2389 | "type": "zip", 2390 | "url": "https://api.github.com/repos/stecman/symfony-console-completion/zipball/5461d43e53092b3d3b9dbd9d999f2054730f4bbb", 2391 | "reference": "5461d43e53092b3d3b9dbd9d999f2054730f4bbb", 2392 | "shasum": "" 2393 | }, 2394 | "require": { 2395 | "php": ">=5.3.2", 2396 | "symfony/console": "~2.3 || ~3.0" 2397 | }, 2398 | "require-dev": { 2399 | "phpunit/phpunit": "~4.4" 2400 | }, 2401 | "type": "library", 2402 | "extra": { 2403 | "branch-alias": { 2404 | "dev-master": "0.6.x-dev" 2405 | } 2406 | }, 2407 | "autoload": { 2408 | "psr-4": { 2409 | "Stecman\\Component\\Symfony\\Console\\BashCompletion\\": "src/" 2410 | } 2411 | }, 2412 | "notification-url": "https://packagist.org/downloads/", 2413 | "license": [ 2414 | "MIT" 2415 | ], 2416 | "authors": [ 2417 | { 2418 | "name": "Stephen Holdaway", 2419 | "email": "stephen@stecman.co.nz" 2420 | } 2421 | ], 2422 | "description": "Automatic BASH completion for Symfony Console Component based applications.", 2423 | "time": "2016-02-24T05:08:54+00:00" 2424 | }, 2425 | { 2426 | "name": "symfony/browser-kit", 2427 | "version": "v3.3.1", 2428 | "source": { 2429 | "type": "git", 2430 | "url": "https://github.com/symfony/browser-kit.git", 2431 | "reference": "c2c8ceb1aa9dab9eae54e9150e6a588ce3e53be1" 2432 | }, 2433 | "dist": { 2434 | "type": "zip", 2435 | "url": "https://api.github.com/repos/symfony/browser-kit/zipball/c2c8ceb1aa9dab9eae54e9150e6a588ce3e53be1", 2436 | "reference": "c2c8ceb1aa9dab9eae54e9150e6a588ce3e53be1", 2437 | "shasum": "" 2438 | }, 2439 | "require": { 2440 | "php": ">=5.5.9", 2441 | "symfony/dom-crawler": "~2.8|~3.0" 2442 | }, 2443 | "require-dev": { 2444 | "symfony/css-selector": "~2.8|~3.0", 2445 | "symfony/process": "~2.8|~3.0" 2446 | }, 2447 | "suggest": { 2448 | "symfony/process": "" 2449 | }, 2450 | "type": "library", 2451 | "extra": { 2452 | "branch-alias": { 2453 | "dev-master": "3.3-dev" 2454 | } 2455 | }, 2456 | "autoload": { 2457 | "psr-4": { 2458 | "Symfony\\Component\\BrowserKit\\": "" 2459 | }, 2460 | "exclude-from-classmap": [ 2461 | "/Tests/" 2462 | ] 2463 | }, 2464 | "notification-url": "https://packagist.org/downloads/", 2465 | "license": [ 2466 | "MIT" 2467 | ], 2468 | "authors": [ 2469 | { 2470 | "name": "Fabien Potencier", 2471 | "email": "fabien@symfony.com" 2472 | }, 2473 | { 2474 | "name": "Symfony Community", 2475 | "homepage": "https://symfony.com/contributors" 2476 | } 2477 | ], 2478 | "description": "Symfony BrowserKit Component", 2479 | "homepage": "https://symfony.com", 2480 | "time": "2017-04-12T14:14:56+00:00" 2481 | }, 2482 | { 2483 | "name": "symfony/console", 2484 | "version": "v3.3.1", 2485 | "source": { 2486 | "type": "git", 2487 | "url": "https://github.com/symfony/console.git", 2488 | "reference": "70d2a29b2911cbdc91a7e268046c395278238b2e" 2489 | }, 2490 | "dist": { 2491 | "type": "zip", 2492 | "url": "https://api.github.com/repos/symfony/console/zipball/70d2a29b2911cbdc91a7e268046c395278238b2e", 2493 | "reference": "70d2a29b2911cbdc91a7e268046c395278238b2e", 2494 | "shasum": "" 2495 | }, 2496 | "require": { 2497 | "php": ">=5.5.9", 2498 | "symfony/debug": "~2.8|~3.0", 2499 | "symfony/polyfill-mbstring": "~1.0" 2500 | }, 2501 | "conflict": { 2502 | "symfony/dependency-injection": "<3.3" 2503 | }, 2504 | "require-dev": { 2505 | "psr/log": "~1.0", 2506 | "symfony/config": "~3.3", 2507 | "symfony/dependency-injection": "~3.3", 2508 | "symfony/event-dispatcher": "~2.8|~3.0", 2509 | "symfony/filesystem": "~2.8|~3.0", 2510 | "symfony/http-kernel": "~2.8|~3.0", 2511 | "symfony/process": "~2.8|~3.0" 2512 | }, 2513 | "suggest": { 2514 | "psr/log": "For using the console logger", 2515 | "symfony/event-dispatcher": "", 2516 | "symfony/filesystem": "", 2517 | "symfony/process": "" 2518 | }, 2519 | "type": "library", 2520 | "extra": { 2521 | "branch-alias": { 2522 | "dev-master": "3.3-dev" 2523 | } 2524 | }, 2525 | "autoload": { 2526 | "psr-4": { 2527 | "Symfony\\Component\\Console\\": "" 2528 | }, 2529 | "exclude-from-classmap": [ 2530 | "/Tests/" 2531 | ] 2532 | }, 2533 | "notification-url": "https://packagist.org/downloads/", 2534 | "license": [ 2535 | "MIT" 2536 | ], 2537 | "authors": [ 2538 | { 2539 | "name": "Fabien Potencier", 2540 | "email": "fabien@symfony.com" 2541 | }, 2542 | { 2543 | "name": "Symfony Community", 2544 | "homepage": "https://symfony.com/contributors" 2545 | } 2546 | ], 2547 | "description": "Symfony Console Component", 2548 | "homepage": "https://symfony.com", 2549 | "time": "2017-06-02T19:24:58+00:00" 2550 | }, 2551 | { 2552 | "name": "symfony/css-selector", 2553 | "version": "v3.3.1", 2554 | "source": { 2555 | "type": "git", 2556 | "url": "https://github.com/symfony/css-selector.git", 2557 | "reference": "4d882dced7b995d5274293039370148e291808f2" 2558 | }, 2559 | "dist": { 2560 | "type": "zip", 2561 | "url": "https://api.github.com/repos/symfony/css-selector/zipball/4d882dced7b995d5274293039370148e291808f2", 2562 | "reference": "4d882dced7b995d5274293039370148e291808f2", 2563 | "shasum": "" 2564 | }, 2565 | "require": { 2566 | "php": ">=5.5.9" 2567 | }, 2568 | "type": "library", 2569 | "extra": { 2570 | "branch-alias": { 2571 | "dev-master": "3.3-dev" 2572 | } 2573 | }, 2574 | "autoload": { 2575 | "psr-4": { 2576 | "Symfony\\Component\\CssSelector\\": "" 2577 | }, 2578 | "exclude-from-classmap": [ 2579 | "/Tests/" 2580 | ] 2581 | }, 2582 | "notification-url": "https://packagist.org/downloads/", 2583 | "license": [ 2584 | "MIT" 2585 | ], 2586 | "authors": [ 2587 | { 2588 | "name": "Jean-François Simon", 2589 | "email": "jeanfrancois.simon@sensiolabs.com" 2590 | }, 2591 | { 2592 | "name": "Fabien Potencier", 2593 | "email": "fabien@symfony.com" 2594 | }, 2595 | { 2596 | "name": "Symfony Community", 2597 | "homepage": "https://symfony.com/contributors" 2598 | } 2599 | ], 2600 | "description": "Symfony CssSelector Component", 2601 | "homepage": "https://symfony.com", 2602 | "time": "2017-05-01T15:01:29+00:00" 2603 | }, 2604 | { 2605 | "name": "symfony/debug", 2606 | "version": "v3.3.1", 2607 | "source": { 2608 | "type": "git", 2609 | "url": "https://github.com/symfony/debug.git", 2610 | "reference": "e9c50482841ef696e8fa1470d950a79c8921f45d" 2611 | }, 2612 | "dist": { 2613 | "type": "zip", 2614 | "url": "https://api.github.com/repos/symfony/debug/zipball/e9c50482841ef696e8fa1470d950a79c8921f45d", 2615 | "reference": "e9c50482841ef696e8fa1470d950a79c8921f45d", 2616 | "shasum": "" 2617 | }, 2618 | "require": { 2619 | "php": ">=5.5.9", 2620 | "psr/log": "~1.0" 2621 | }, 2622 | "conflict": { 2623 | "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2" 2624 | }, 2625 | "require-dev": { 2626 | "symfony/http-kernel": "~2.8|~3.0" 2627 | }, 2628 | "type": "library", 2629 | "extra": { 2630 | "branch-alias": { 2631 | "dev-master": "3.3-dev" 2632 | } 2633 | }, 2634 | "autoload": { 2635 | "psr-4": { 2636 | "Symfony\\Component\\Debug\\": "" 2637 | }, 2638 | "exclude-from-classmap": [ 2639 | "/Tests/" 2640 | ] 2641 | }, 2642 | "notification-url": "https://packagist.org/downloads/", 2643 | "license": [ 2644 | "MIT" 2645 | ], 2646 | "authors": [ 2647 | { 2648 | "name": "Fabien Potencier", 2649 | "email": "fabien@symfony.com" 2650 | }, 2651 | { 2652 | "name": "Symfony Community", 2653 | "homepage": "https://symfony.com/contributors" 2654 | } 2655 | ], 2656 | "description": "Symfony Debug Component", 2657 | "homepage": "https://symfony.com", 2658 | "time": "2017-06-01T21:01:25+00:00" 2659 | }, 2660 | { 2661 | "name": "symfony/dom-crawler", 2662 | "version": "v3.3.1", 2663 | "source": { 2664 | "type": "git", 2665 | "url": "https://github.com/symfony/dom-crawler.git", 2666 | "reference": "fc2c588ce376e9fe04a7b8c79e3ec62fe32d95b1" 2667 | }, 2668 | "dist": { 2669 | "type": "zip", 2670 | "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/fc2c588ce376e9fe04a7b8c79e3ec62fe32d95b1", 2671 | "reference": "fc2c588ce376e9fe04a7b8c79e3ec62fe32d95b1", 2672 | "shasum": "" 2673 | }, 2674 | "require": { 2675 | "php": ">=5.5.9", 2676 | "symfony/polyfill-mbstring": "~1.0" 2677 | }, 2678 | "require-dev": { 2679 | "symfony/css-selector": "~2.8|~3.0" 2680 | }, 2681 | "suggest": { 2682 | "symfony/css-selector": "" 2683 | }, 2684 | "type": "library", 2685 | "extra": { 2686 | "branch-alias": { 2687 | "dev-master": "3.3-dev" 2688 | } 2689 | }, 2690 | "autoload": { 2691 | "psr-4": { 2692 | "Symfony\\Component\\DomCrawler\\": "" 2693 | }, 2694 | "exclude-from-classmap": [ 2695 | "/Tests/" 2696 | ] 2697 | }, 2698 | "notification-url": "https://packagist.org/downloads/", 2699 | "license": [ 2700 | "MIT" 2701 | ], 2702 | "authors": [ 2703 | { 2704 | "name": "Fabien Potencier", 2705 | "email": "fabien@symfony.com" 2706 | }, 2707 | { 2708 | "name": "Symfony Community", 2709 | "homepage": "https://symfony.com/contributors" 2710 | } 2711 | ], 2712 | "description": "Symfony DomCrawler Component", 2713 | "homepage": "https://symfony.com", 2714 | "time": "2017-05-25T23:10:31+00:00" 2715 | }, 2716 | { 2717 | "name": "symfony/event-dispatcher", 2718 | "version": "v3.3.1", 2719 | "source": { 2720 | "type": "git", 2721 | "url": "https://github.com/symfony/event-dispatcher.git", 2722 | "reference": "4054a102470665451108f9b59305c79176ef98f0" 2723 | }, 2724 | "dist": { 2725 | "type": "zip", 2726 | "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/4054a102470665451108f9b59305c79176ef98f0", 2727 | "reference": "4054a102470665451108f9b59305c79176ef98f0", 2728 | "shasum": "" 2729 | }, 2730 | "require": { 2731 | "php": ">=5.5.9" 2732 | }, 2733 | "conflict": { 2734 | "symfony/dependency-injection": "<3.3" 2735 | }, 2736 | "require-dev": { 2737 | "psr/log": "~1.0", 2738 | "symfony/config": "~2.8|~3.0", 2739 | "symfony/dependency-injection": "~3.3", 2740 | "symfony/expression-language": "~2.8|~3.0", 2741 | "symfony/stopwatch": "~2.8|~3.0" 2742 | }, 2743 | "suggest": { 2744 | "symfony/dependency-injection": "", 2745 | "symfony/http-kernel": "" 2746 | }, 2747 | "type": "library", 2748 | "extra": { 2749 | "branch-alias": { 2750 | "dev-master": "3.3-dev" 2751 | } 2752 | }, 2753 | "autoload": { 2754 | "psr-4": { 2755 | "Symfony\\Component\\EventDispatcher\\": "" 2756 | }, 2757 | "exclude-from-classmap": [ 2758 | "/Tests/" 2759 | ] 2760 | }, 2761 | "notification-url": "https://packagist.org/downloads/", 2762 | "license": [ 2763 | "MIT" 2764 | ], 2765 | "authors": [ 2766 | { 2767 | "name": "Fabien Potencier", 2768 | "email": "fabien@symfony.com" 2769 | }, 2770 | { 2771 | "name": "Symfony Community", 2772 | "homepage": "https://symfony.com/contributors" 2773 | } 2774 | ], 2775 | "description": "Symfony EventDispatcher Component", 2776 | "homepage": "https://symfony.com", 2777 | "time": "2017-06-04T18:15:29+00:00" 2778 | }, 2779 | { 2780 | "name": "symfony/finder", 2781 | "version": "v3.3.1", 2782 | "source": { 2783 | "type": "git", 2784 | "url": "https://github.com/symfony/finder.git", 2785 | "reference": "baea7f66d30854ad32988c11a09d7ffd485810c4" 2786 | }, 2787 | "dist": { 2788 | "type": "zip", 2789 | "url": "https://api.github.com/repos/symfony/finder/zipball/baea7f66d30854ad32988c11a09d7ffd485810c4", 2790 | "reference": "baea7f66d30854ad32988c11a09d7ffd485810c4", 2791 | "shasum": "" 2792 | }, 2793 | "require": { 2794 | "php": ">=5.5.9" 2795 | }, 2796 | "type": "library", 2797 | "extra": { 2798 | "branch-alias": { 2799 | "dev-master": "3.3-dev" 2800 | } 2801 | }, 2802 | "autoload": { 2803 | "psr-4": { 2804 | "Symfony\\Component\\Finder\\": "" 2805 | }, 2806 | "exclude-from-classmap": [ 2807 | "/Tests/" 2808 | ] 2809 | }, 2810 | "notification-url": "https://packagist.org/downloads/", 2811 | "license": [ 2812 | "MIT" 2813 | ], 2814 | "authors": [ 2815 | { 2816 | "name": "Fabien Potencier", 2817 | "email": "fabien@symfony.com" 2818 | }, 2819 | { 2820 | "name": "Symfony Community", 2821 | "homepage": "https://symfony.com/contributors" 2822 | } 2823 | ], 2824 | "description": "Symfony Finder Component", 2825 | "homepage": "https://symfony.com", 2826 | "time": "2017-06-01T21:01:25+00:00" 2827 | }, 2828 | { 2829 | "name": "symfony/polyfill-mbstring", 2830 | "version": "v1.3.0", 2831 | "source": { 2832 | "type": "git", 2833 | "url": "https://github.com/symfony/polyfill-mbstring.git", 2834 | "reference": "e79d363049d1c2128f133a2667e4f4190904f7f4" 2835 | }, 2836 | "dist": { 2837 | "type": "zip", 2838 | "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/e79d363049d1c2128f133a2667e4f4190904f7f4", 2839 | "reference": "e79d363049d1c2128f133a2667e4f4190904f7f4", 2840 | "shasum": "" 2841 | }, 2842 | "require": { 2843 | "php": ">=5.3.3" 2844 | }, 2845 | "suggest": { 2846 | "ext-mbstring": "For best performance" 2847 | }, 2848 | "type": "library", 2849 | "extra": { 2850 | "branch-alias": { 2851 | "dev-master": "1.3-dev" 2852 | } 2853 | }, 2854 | "autoload": { 2855 | "psr-4": { 2856 | "Symfony\\Polyfill\\Mbstring\\": "" 2857 | }, 2858 | "files": [ 2859 | "bootstrap.php" 2860 | ] 2861 | }, 2862 | "notification-url": "https://packagist.org/downloads/", 2863 | "license": [ 2864 | "MIT" 2865 | ], 2866 | "authors": [ 2867 | { 2868 | "name": "Nicolas Grekas", 2869 | "email": "p@tchwork.com" 2870 | }, 2871 | { 2872 | "name": "Symfony Community", 2873 | "homepage": "https://symfony.com/contributors" 2874 | } 2875 | ], 2876 | "description": "Symfony polyfill for the Mbstring extension", 2877 | "homepage": "https://symfony.com", 2878 | "keywords": [ 2879 | "compatibility", 2880 | "mbstring", 2881 | "polyfill", 2882 | "portable", 2883 | "shim" 2884 | ], 2885 | "time": "2016-11-14T01:06:16+00:00" 2886 | }, 2887 | { 2888 | "name": "symfony/yaml", 2889 | "version": "v3.3.1", 2890 | "source": { 2891 | "type": "git", 2892 | "url": "https://github.com/symfony/yaml.git", 2893 | "reference": "9752a30000a8ca9f4b34b5227d15d0101b96b063" 2894 | }, 2895 | "dist": { 2896 | "type": "zip", 2897 | "url": "https://api.github.com/repos/symfony/yaml/zipball/9752a30000a8ca9f4b34b5227d15d0101b96b063", 2898 | "reference": "9752a30000a8ca9f4b34b5227d15d0101b96b063", 2899 | "shasum": "" 2900 | }, 2901 | "require": { 2902 | "php": ">=5.5.9" 2903 | }, 2904 | "require-dev": { 2905 | "symfony/console": "~2.8|~3.0" 2906 | }, 2907 | "suggest": { 2908 | "symfony/console": "For validating YAML files using the lint command" 2909 | }, 2910 | "type": "library", 2911 | "extra": { 2912 | "branch-alias": { 2913 | "dev-master": "3.3-dev" 2914 | } 2915 | }, 2916 | "autoload": { 2917 | "psr-4": { 2918 | "Symfony\\Component\\Yaml\\": "" 2919 | }, 2920 | "exclude-from-classmap": [ 2921 | "/Tests/" 2922 | ] 2923 | }, 2924 | "notification-url": "https://packagist.org/downloads/", 2925 | "license": [ 2926 | "MIT" 2927 | ], 2928 | "authors": [ 2929 | { 2930 | "name": "Fabien Potencier", 2931 | "email": "fabien@symfony.com" 2932 | }, 2933 | { 2934 | "name": "Symfony Community", 2935 | "homepage": "https://symfony.com/contributors" 2936 | } 2937 | ], 2938 | "description": "Symfony Yaml Component", 2939 | "homepage": "https://symfony.com", 2940 | "time": "2017-06-02T22:05:06+00:00" 2941 | }, 2942 | { 2943 | "name": "webmozart/assert", 2944 | "version": "1.2.0", 2945 | "source": { 2946 | "type": "git", 2947 | "url": "https://github.com/webmozart/assert.git", 2948 | "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f" 2949 | }, 2950 | "dist": { 2951 | "type": "zip", 2952 | "url": "https://api.github.com/repos/webmozart/assert/zipball/2db61e59ff05fe5126d152bd0655c9ea113e550f", 2953 | "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f", 2954 | "shasum": "" 2955 | }, 2956 | "require": { 2957 | "php": "^5.3.3 || ^7.0" 2958 | }, 2959 | "require-dev": { 2960 | "phpunit/phpunit": "^4.6", 2961 | "sebastian/version": "^1.0.1" 2962 | }, 2963 | "type": "library", 2964 | "extra": { 2965 | "branch-alias": { 2966 | "dev-master": "1.3-dev" 2967 | } 2968 | }, 2969 | "autoload": { 2970 | "psr-4": { 2971 | "Webmozart\\Assert\\": "src/" 2972 | } 2973 | }, 2974 | "notification-url": "https://packagist.org/downloads/", 2975 | "license": [ 2976 | "MIT" 2977 | ], 2978 | "authors": [ 2979 | { 2980 | "name": "Bernhard Schussek", 2981 | "email": "bschussek@gmail.com" 2982 | } 2983 | ], 2984 | "description": "Assertions to validate method input/output with nice error messages.", 2985 | "keywords": [ 2986 | "assert", 2987 | "check", 2988 | "validate" 2989 | ], 2990 | "time": "2016-11-23T20:04:58+00:00" 2991 | }, 2992 | { 2993 | "name": "yiisoft/yii2-debug", 2994 | "version": "2.0.9", 2995 | "source": { 2996 | "type": "git", 2997 | "url": "https://github.com/yiisoft/yii2-debug.git", 2998 | "reference": "647be6c9d48dc2f3c2e2f33b9eba0a4ca78abde9" 2999 | }, 3000 | "dist": { 3001 | "type": "zip", 3002 | "url": "https://api.github.com/repos/yiisoft/yii2-debug/zipball/647be6c9d48dc2f3c2e2f33b9eba0a4ca78abde9", 3003 | "reference": "647be6c9d48dc2f3c2e2f33b9eba0a4ca78abde9", 3004 | "shasum": "" 3005 | }, 3006 | "require": { 3007 | "yiisoft/yii2": "~2.0.11", 3008 | "yiisoft/yii2-bootstrap": "~2.0.0" 3009 | }, 3010 | "type": "yii2-extension", 3011 | "extra": { 3012 | "branch-alias": { 3013 | "dev-master": "2.0.x-dev" 3014 | } 3015 | }, 3016 | "autoload": { 3017 | "psr-4": { 3018 | "yii\\debug\\": "" 3019 | } 3020 | }, 3021 | "notification-url": "https://packagist.org/downloads/", 3022 | "license": [ 3023 | "BSD-3-Clause" 3024 | ], 3025 | "authors": [ 3026 | { 3027 | "name": "Qiang Xue", 3028 | "email": "qiang.xue@gmail.com" 3029 | } 3030 | ], 3031 | "description": "The debugger extension for the Yii framework", 3032 | "keywords": [ 3033 | "debug", 3034 | "debugger", 3035 | "yii2" 3036 | ], 3037 | "time": "2017-02-21T10:30:50+00:00" 3038 | }, 3039 | { 3040 | "name": "yiisoft/yii2-faker", 3041 | "version": "2.0.3", 3042 | "source": { 3043 | "type": "git", 3044 | "url": "https://github.com/yiisoft/yii2-faker.git", 3045 | "reference": "b88ca69ee226a3610b2c26c026c3203d7ac50f6c" 3046 | }, 3047 | "dist": { 3048 | "type": "zip", 3049 | "url": "https://api.github.com/repos/yiisoft/yii2-faker/zipball/b88ca69ee226a3610b2c26c026c3203d7ac50f6c", 3050 | "reference": "b88ca69ee226a3610b2c26c026c3203d7ac50f6c", 3051 | "shasum": "" 3052 | }, 3053 | "require": { 3054 | "fzaninotto/faker": "*", 3055 | "yiisoft/yii2": "*" 3056 | }, 3057 | "type": "yii2-extension", 3058 | "extra": { 3059 | "branch-alias": { 3060 | "dev-master": "2.0.x-dev" 3061 | } 3062 | }, 3063 | "autoload": { 3064 | "psr-4": { 3065 | "yii\\faker\\": "" 3066 | } 3067 | }, 3068 | "notification-url": "https://packagist.org/downloads/", 3069 | "license": [ 3070 | "BSD-3-Clause" 3071 | ], 3072 | "authors": [ 3073 | { 3074 | "name": "Mark Jebri", 3075 | "email": "mark.github@yandex.ru" 3076 | } 3077 | ], 3078 | "description": "Fixture generator. The Faker integration for the Yii framework.", 3079 | "keywords": [ 3080 | "Fixture", 3081 | "faker", 3082 | "yii2" 3083 | ], 3084 | "time": "2015-03-01T06:22:44+00:00" 3085 | }, 3086 | { 3087 | "name": "yiisoft/yii2-gii", 3088 | "version": "2.0.5", 3089 | "source": { 3090 | "type": "git", 3091 | "url": "https://github.com/yiisoft/yii2-gii.git", 3092 | "reference": "1bd6df6804ca077ec022587905a0d43eb286f507" 3093 | }, 3094 | "dist": { 3095 | "type": "zip", 3096 | "url": "https://api.github.com/repos/yiisoft/yii2-gii/zipball/1bd6df6804ca077ec022587905a0d43eb286f507", 3097 | "reference": "1bd6df6804ca077ec022587905a0d43eb286f507", 3098 | "shasum": "" 3099 | }, 3100 | "require": { 3101 | "bower-asset/typeahead.js": "0.10.* | ~0.11.0", 3102 | "phpspec/php-diff": ">=1.0.2", 3103 | "yiisoft/yii2": ">=2.0.4", 3104 | "yiisoft/yii2-bootstrap": "~2.0" 3105 | }, 3106 | "type": "yii2-extension", 3107 | "extra": { 3108 | "branch-alias": { 3109 | "dev-master": "2.0.x-dev" 3110 | }, 3111 | "asset-installer-paths": { 3112 | "npm-asset-library": "vendor/npm", 3113 | "bower-asset-library": "vendor/bower" 3114 | } 3115 | }, 3116 | "autoload": { 3117 | "psr-4": { 3118 | "yii\\gii\\": "" 3119 | } 3120 | }, 3121 | "notification-url": "https://packagist.org/downloads/", 3122 | "license": [ 3123 | "BSD-3-Clause" 3124 | ], 3125 | "authors": [ 3126 | { 3127 | "name": "Qiang Xue", 3128 | "email": "qiang.xue@gmail.com" 3129 | } 3130 | ], 3131 | "description": "The Gii extension for the Yii framework", 3132 | "keywords": [ 3133 | "code generator", 3134 | "gii", 3135 | "yii2" 3136 | ], 3137 | "time": "2016-03-18T14:09:46+00:00" 3138 | } 3139 | ], 3140 | "aliases": [], 3141 | "minimum-stability": "stable", 3142 | "stability-flags": [], 3143 | "prefer-stable": false, 3144 | "prefer-lowest": false, 3145 | "platform": { 3146 | "php": ">=5.4.0" 3147 | }, 3148 | "platform-dev": [] 3149 | } 3150 | -------------------------------------------------------------------------------- /config/console.php: -------------------------------------------------------------------------------- 1 | 'basic-console', 8 | 'basePath' => dirname(__DIR__), 9 | 'bootstrap' => ['log'], 10 | 'controllerNamespace' => 'app\commands', 11 | 'components' => [ 12 | 'cache' => [ 13 | 'class' => 'yii\caching\FileCache', 14 | ], 15 | 'log' => [ 16 | 'targets' => [ 17 | [ 18 | 'class' => 'yii\log\FileTarget', 19 | 'levels' => ['error', 'warning'], 20 | ], 21 | ], 22 | ], 23 | 'db' => $db, 24 | ], 25 | 'params' => $params, 26 | /* 27 | 'controllerMap' => [ 28 | 'fixture' => [ // Fixture generation command line. 29 | 'class' => 'yii\faker\FixtureController', 30 | ], 31 | ], 32 | */ 33 | ]; 34 | 35 | if (YII_ENV_DEV) { 36 | // configuration adjustments for 'dev' environment 37 | $config['bootstrap'][] = 'gii'; 38 | $config['modules']['gii'] = [ 39 | 'class' => 'yii\gii\Module', 40 | ]; 41 | } 42 | 43 | return $config; 44 | -------------------------------------------------------------------------------- /config/db.php: -------------------------------------------------------------------------------- 1 | 'yii\db\Connection', 5 | 'dsn' => 'mysql:host=localhost;dbname=graphql_demo', 6 | 'username' => 'root', 7 | 'password' => '', 8 | 'charset' => 'utf8', 9 | ]; 10 | -------------------------------------------------------------------------------- /config/params.php: -------------------------------------------------------------------------------- 1 | 'admin@example.com', 5 | ]; 6 | -------------------------------------------------------------------------------- /config/test.php: -------------------------------------------------------------------------------- 1 | 'basic-tests', 10 | 'basePath' => dirname(__DIR__), 11 | 'language' => 'en-US', 12 | 'components' => [ 13 | 'db' => $db, 14 | 'mailer' => [ 15 | 'useFileTransport' => true, 16 | ], 17 | 'assetManager' => [ 18 | 'basePath' => __DIR__ . '/../web/assets', 19 | ], 20 | 'urlManager' => [ 21 | 'showScriptName' => true, 22 | ], 23 | 'user' => [ 24 | 'identityClass' => 'app\models\User', 25 | ], 26 | 'request' => [ 27 | 'cookieValidationKey' => 'test', 28 | 'enableCsrfValidation' => false, 29 | // but if you absolutely need it set cookie domain to localhost 30 | /* 31 | 'csrfCookie' => [ 32 | 'domain' => 'localhost', 33 | ], 34 | */ 35 | ], 36 | ], 37 | 'params' => $params, 38 | ]; 39 | -------------------------------------------------------------------------------- /config/test_db.php: -------------------------------------------------------------------------------- 1 | 'basic', 8 | 'basePath' => dirname(__DIR__), 9 | 'bootstrap' => ['log'], 10 | 'components' => [ 11 | 'request' => [ 12 | // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation 13 | 'cookieValidationKey' => 'graphql', 14 | 'parsers' => [ 15 | 'application/json' => 'yii\web\JsonParser', 16 | ], 17 | ], 18 | 'cache' => [ 19 | 'class' => 'yii\caching\FileCache', 20 | ], 21 | 'user' => [ 22 | 'identityClass' => 'app\models\User', 23 | 'enableAutoLogin' => true, 24 | ], 25 | 'errorHandler' => [ 26 | 'errorAction' => 'site/error', 27 | ], 28 | 'mailer' => [ 29 | 'class' => 'yii\swiftmailer\Mailer', 30 | // send all mails to a file by default. You have to set 31 | // 'useFileTransport' to false and configure a transport 32 | // for the mailer to send real emails. 33 | 'useFileTransport' => true, 34 | ], 35 | 'log' => [ 36 | 'traceLevel' => YII_DEBUG ? 3 : 0, 37 | 'targets' => [ 38 | [ 39 | 'class' => 'yii\log\FileTarget', 40 | 'levels' => ['error', 'warning'], 41 | ], 42 | ], 43 | ], 44 | 'db' => $db, 45 | 'urlManager' => [ 46 | 'class' => 'yii\web\UrlManager', 47 | 'showScriptName' => false, 48 | 'enablePrettyUrl' => true, 49 | 'rules' => [ 50 | ], 51 | ], 52 | ], 53 | 'params' => $params, 54 | ]; 55 | 56 | if (YII_ENV_DEV) { 57 | // configuration adjustments for 'dev' environment 58 | $config['bootstrap'][] = 'debug'; 59 | $config['modules']['debug'] = [ 60 | 'class' => 'yii\debug\Module', 61 | // uncomment the following to add your IP if you are not connecting from localhost. 62 | 'allowedIPs' => ['127.0.0.1', '::1'], 63 | ]; 64 | 65 | $config['bootstrap'][] = 'gii'; 66 | $config['modules']['gii'] = [ 67 | 'class' => 'yii\gii\Module', 68 | // uncomment the following to add your IP if you are not connecting from localhost. 69 | 'allowedIPs' => ['127.0.0.1', '::1'], 70 | ]; 71 | } 72 | 73 | return $config; 74 | -------------------------------------------------------------------------------- /controllers/SiteController.php: -------------------------------------------------------------------------------- 1 | [ 22 | 'class' => AccessControl::className(), 23 | 'only' => ['logout'], 24 | 'rules' => [ 25 | [ 26 | 'actions' => ['logout'], 27 | 'allow' => true, 28 | 'roles' => ['@'], 29 | ], 30 | ], 31 | ], 32 | 'verbs' => [ 33 | 'class' => VerbFilter::className(), 34 | 'actions' => [ 35 | 'logout' => ['post'], 36 | ], 37 | ], 38 | ]; 39 | } 40 | 41 | /** 42 | * @inheritdoc 43 | */ 44 | public function actions() 45 | { 46 | return [ 47 | 'error' => [ 48 | 'class' => 'yii\web\ErrorAction', 49 | ], 50 | 'captcha' => [ 51 | 'class' => 'yii\captcha\CaptchaAction', 52 | 'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null, 53 | ], 54 | ]; 55 | } 56 | 57 | /** 58 | * Displays homepage. 59 | * 60 | * @return string 61 | */ 62 | public function actionIndex() 63 | { 64 | return $this->render('index'); 65 | } 66 | 67 | /** 68 | * Login action. 69 | * 70 | * @return Response|string 71 | */ 72 | public function actionLogin() 73 | { 74 | if (!Yii::$app->user->isGuest) { 75 | return $this->goHome(); 76 | } 77 | 78 | $model = new LoginForm(); 79 | if ($model->load(Yii::$app->request->post()) && $model->login()) { 80 | return $this->goBack(); 81 | } 82 | return $this->render('login', [ 83 | 'model' => $model, 84 | ]); 85 | } 86 | 87 | /** 88 | * Logout action. 89 | * 90 | * @return Response 91 | */ 92 | public function actionLogout() 93 | { 94 | Yii::$app->user->logout(); 95 | 96 | return $this->goHome(); 97 | } 98 | 99 | /** 100 | * Displays contact page. 101 | * 102 | * @return Response|string 103 | */ 104 | public function actionContact() 105 | { 106 | $model = new ContactForm(); 107 | if ($model->load(Yii::$app->request->post()) && $model->contact(Yii::$app->params['adminEmail'])) { 108 | Yii::$app->session->setFlash('contactFormSubmitted'); 109 | 110 | return $this->refresh(); 111 | } 112 | return $this->render('contact', [ 113 | 'model' => $model, 114 | ]); 115 | } 116 | 117 | /** 118 | * Displays about page. 119 | * 120 | * @return string 121 | */ 122 | public function actionAbout() 123 | { 124 | return $this->render('about'); 125 | } 126 | } 127 | -------------------------------------------------------------------------------- /controllers/api/GraphqlController.php: -------------------------------------------------------------------------------- 1 | ['POST', 'OPTIONS'], 24 | ]; 25 | } 26 | 27 | public function actions() 28 | { 29 | return []; 30 | } 31 | 32 | public function actionIndex() 33 | { 34 | // сразу заложим возможность принимать параметры 35 | // как через MULTIPART, так и через POST/GET 36 | 37 | $query = \Yii::$app->request->get('query', \Yii::$app->request->post('query')); 38 | $variables = \Yii::$app->request->get('variables', \Yii::$app->request->post('variables')); 39 | $operation = \Yii::$app->request->get('operation', \Yii::$app->request->post('operation', null)); 40 | 41 | if (empty($query)) { 42 | $rawInput = file_get_contents('php://input'); 43 | $input = json_decode($rawInput, true); 44 | $query = $input['query']; 45 | $variables = isset($input['variables']) ? $input['variables'] : []; 46 | $operation = isset($input['operation']) ? $input['operation'] : null; 47 | } 48 | 49 | // библиотека принимает в variables либо null, либо ассоциативный массив 50 | // на строку будет ругаться 51 | 52 | if (!empty($variables) && !is_array($variables)) { 53 | try { 54 | $variables = Json::decode($variables); 55 | } catch (InvalidParamException $e) { 56 | $variables = null; 57 | } 58 | } 59 | 60 | // создаем схему и подключаем к ней наши корневые типы 61 | 62 | $schema = new Schema([ 63 | 'query' => Types::query(), 64 | 'mutation' => Types::mutation(), 65 | ]); 66 | 67 | // огонь! 68 | 69 | $result = GraphQL::executeQuery( 70 | $schema, 71 | $query, 72 | null, 73 | null, 74 | empty($variables) ? null : $variables, 75 | empty($operation) ? null : $operation 76 | )->toArray(Debug::INCLUDE_DEBUG_MESSAGE | Debug::INCLUDE_TRACE); 77 | 78 | return $result; 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /mail/layouts/html.php: -------------------------------------------------------------------------------- 1 | 8 | beginPage() ?> 9 | 10 | 11 | 12 | 13 | <?= Html::encode($this->title) ?> 14 | head() ?> 15 | 16 | 17 | beginBody() ?> 18 | 19 | endBody() ?> 20 | 21 | 22 | endPage() ?> 23 | -------------------------------------------------------------------------------- /migrations/m170828_175739_init.php: -------------------------------------------------------------------------------- 1 | execute("CREATE TABLE IF NOT EXISTS `user` ( 10 | `id` INT NOT NULL, 11 | `firstname` VARCHAR(45) NULL, 12 | `lastname` VARCHAR(45) NULL, 13 | `createDate` DATETIME NULL, 14 | `modityDate` DATETIME NULL, 15 | `lastVisitDate` DATETIME NULL, 16 | `status` INT NULL, 17 | PRIMARY KEY (`id`)) 18 | ENGINE = InnoDB;"); 19 | 20 | $this->execute("CREATE TABLE IF NOT EXISTS `city` ( 21 | `id` INT NOT NULL, 22 | `name` VARCHAR(45) NULL, 23 | PRIMARY KEY (`id`)) 24 | ENGINE = InnoDB;"); 25 | 26 | $this->execute("CREATE TABLE IF NOT EXISTS `address` ( 27 | `id` INT NOT NULL, 28 | `street` VARCHAR(45) NULL, 29 | `zip` VARCHAR(45) NULL, 30 | `createDate` DATETIME NULL, 31 | `modifyDate` DATETIME NULL, 32 | `status` INT NULL, 33 | `userId` INT NOT NULL, 34 | `cityId` INT NOT NULL, 35 | PRIMARY KEY (`id`), 36 | INDEX `fk_address_user_idx` (`userId` ASC), 37 | INDEX `fk_address_city1_idx` (`cityId` ASC), 38 | CONSTRAINT `fk_address_user` 39 | FOREIGN KEY (`userId`) 40 | REFERENCES `user` (`id`) 41 | ON DELETE NO ACTION 42 | ON UPDATE NO ACTION, 43 | CONSTRAINT `fk_address_city1` 44 | FOREIGN KEY (`cityId`) 45 | REFERENCES `city` (`id`) 46 | ON DELETE NO ACTION 47 | ON UPDATE NO ACTION) 48 | ENGINE = InnoDB;"); 49 | } 50 | 51 | public function safeDown() 52 | { 53 | echo "m170828_175739_init cannot be reverted.\n"; 54 | 55 | return false; 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /migrations/m170828_190719_insert_demo_data.php: -------------------------------------------------------------------------------- 1 | execute(" 10 | INSERT INTO `city` (`id`, `name`) VALUES ('1', 'New York'); 11 | INSERT INTO `city` (`id`, `name`) VALUES ('2', 'Washington'); 12 | INSERT INTO `city` (`id`, `name`) VALUES ('3', 'Chicago'); 13 | "); 14 | 15 | $this->execute(" 16 | INSERT INTO `user` VALUES ('1', 'John', 'Doe', '2017-09-01 16:14:21', '2017-09-04 08:04:32', '2017-09-04 07:34:56', '1'); 17 | INSERT INTO `user` VALUES ('2', 'Vasia', 'Pupkin', '2017-09-02 15:14:34', '2017-09-05 08:04:32', '2017-09-05 07:34:56', '1'); 18 | INSERT INTO `user` VALUES ('3', 'Stan', 'Smith', '2017-09-02 06:12:21', '2017-09-04 08:15:32', '2017-09-04 10:58:21', '1'); 19 | "); 20 | 21 | $this->execute(" 22 | INSERT INTO `address` VALUES ('1', 'Grand St.', '55901', '2017-10-25 08:04:45', '2017-10-25 08:04:45', '1', '1', '2'); 23 | INSERT INTO `address`VALUES ('2', 'Montgomery St.', '34512', '2017-10-25 08:04:45', '2017-10-25 08:04:45', '1', '2', '3'); 24 | INSERT INTO `address` VALUES ('3', 'Claremont Ave.', '56324', '2017-10-25 08:04:45', '2017-10-25 08:04:45', '1', '1', '3'); 25 | "); 26 | } 27 | 28 | public function safeDown() 29 | { 30 | echo "m170828_190719_insert_demo_data cannot be reverted.\n"; 31 | 32 | return false; 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /migrations/m170905_192740_add_email_to_user.php: -------------------------------------------------------------------------------- 1 | addColumn('user', 'email', $this->string()); 10 | } 11 | 12 | public function safeDown() 13 | { 14 | echo "m170905_192740_add_email_to_user cannot be reverted.\n"; 15 | 16 | return false; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /models/Address.php: -------------------------------------------------------------------------------- 1 | 45], 42 | [['cityId'], 'exist', 'skipOnError' => true, 'targetClass' => City::className(), 'targetAttribute' => ['cityId' => 'id']], 43 | [['userId'], 'exist', 'skipOnError' => true, 'targetClass' => User::className(), 'targetAttribute' => ['userId' => 'id']], 44 | ]; 45 | } 46 | 47 | /** 48 | * @inheritdoc 49 | */ 50 | public function attributeLabels() 51 | { 52 | return [ 53 | 'id' => 'ID', 54 | 'street' => 'Street', 55 | 'zip' => 'Zip', 56 | 'createDate' => 'Create Date', 57 | 'modifyDate' => 'Modify Date', 58 | 'status' => 'Status', 59 | 'userId' => 'User ID', 60 | 'cityId' => 'City ID', 61 | ]; 62 | } 63 | 64 | /** 65 | * @return \yii\db\ActiveQuery 66 | */ 67 | public function getCity() 68 | { 69 | return $this->hasOne(City::className(), ['id' => 'cityId']); 70 | } 71 | 72 | /** 73 | * @return \yii\db\ActiveQuery 74 | */ 75 | public function getUser() 76 | { 77 | return $this->hasOne(User::className(), ['id' => 'userId']); 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /models/City.php: -------------------------------------------------------------------------------- 1 | 45], 34 | ]; 35 | } 36 | 37 | /** 38 | * @inheritdoc 39 | */ 40 | public function attributeLabels() 41 | { 42 | return [ 43 | 'id' => 'ID', 44 | 'name' => 'Name', 45 | ]; 46 | } 47 | 48 | /** 49 | * @return \yii\db\ActiveQuery 50 | */ 51 | public function getAddresses() 52 | { 53 | return $this->hasMany(Address::className(), ['cityId' => 'id']); 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /models/ContactForm.php: -------------------------------------------------------------------------------- 1 | 'Verification Code', 42 | ]; 43 | } 44 | 45 | /** 46 | * Sends an email to the specified email address using the information collected by this model. 47 | * @param string $email the target email address 48 | * @return bool whether the model passes validation 49 | */ 50 | public function contact($email) 51 | { 52 | if ($this->validate()) { 53 | Yii::$app->mailer->compose() 54 | ->setTo($email) 55 | ->setFrom([$this->email => $this->name]) 56 | ->setSubject($this->subject) 57 | ->setTextBody($this->body) 58 | ->send(); 59 | 60 | return true; 61 | } 62 | return false; 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /models/LoginForm.php: -------------------------------------------------------------------------------- 1 | hasErrors()) { 48 | $user = $this->getUser(); 49 | 50 | if (!$user || !$user->validatePassword($this->password)) { 51 | $this->addError($attribute, 'Incorrect username or password.'); 52 | } 53 | } 54 | } 55 | 56 | /** 57 | * Logs in a user using the provided username and password. 58 | * @return bool whether the user is logged in successfully 59 | */ 60 | public function login() 61 | { 62 | if ($this->validate()) { 63 | return Yii::$app->user->login($this->getUser(), $this->rememberMe ? 3600*24*30 : 0); 64 | } 65 | return false; 66 | } 67 | 68 | /** 69 | * Finds user by [[username]] 70 | * 71 | * @return User|null 72 | */ 73 | public function getUser() 74 | { 75 | if ($this->_user === false) { 76 | $this->_user = User::findByUsername($this->username); 77 | } 78 | 79 | return $this->_user; 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /models/User.php: -------------------------------------------------------------------------------- 1 | 45], 41 | ['email', 'email'], 42 | ]; 43 | } 44 | 45 | /** 46 | * @inheritdoc 47 | */ 48 | public function attributeLabels() 49 | { 50 | return [ 51 | 'id' => 'ID', 52 | 'firstname' => 'Firstname', 53 | 'lastname' => 'Lastname', 54 | 'createDate' => 'Create Date', 55 | 'modityDate' => 'Modity Date', 56 | 'lastVisitDate' => 'Last Visit Date', 57 | 'status' => 'Status', 58 | ]; 59 | } 60 | 61 | /** 62 | * @return \yii\db\ActiveQuery 63 | */ 64 | public function getAddresses() 65 | { 66 | return $this->hasMany(Address::className(), ['userId' => 'id']); 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /requirements.php: -------------------------------------------------------------------------------- 1 | Error'; 18 | echo '

The path to yii framework seems to be incorrect.

'; 19 | echo '

You need to install Yii framework via composer or adjust the framework path in file ' . basename(__FILE__) . '.

'; 20 | echo '

Please refer to the README on how to install Yii.

'; 21 | } 22 | 23 | require_once($frameworkPath . '/requirements/YiiRequirementChecker.php'); 24 | $requirementsChecker = new YiiRequirementChecker(); 25 | 26 | $gdMemo = $imagickMemo = 'Either GD PHP extension with FreeType support or ImageMagick PHP extension with PNG support is required for image CAPTCHA.'; 27 | $gdOK = $imagickOK = false; 28 | 29 | if (extension_loaded('imagick')) { 30 | $imagick = new Imagick(); 31 | $imagickFormats = $imagick->queryFormats('PNG'); 32 | if (in_array('PNG', $imagickFormats)) { 33 | $imagickOK = true; 34 | } else { 35 | $imagickMemo = 'Imagick extension should be installed with PNG support in order to be used for image CAPTCHA.'; 36 | } 37 | } 38 | 39 | if (extension_loaded('gd')) { 40 | $gdInfo = gd_info(); 41 | if (!empty($gdInfo['FreeType Support'])) { 42 | $gdOK = true; 43 | } else { 44 | $gdMemo = 'GD extension should be installed with FreeType support in order to be used for image CAPTCHA.'; 45 | } 46 | } 47 | 48 | /** 49 | * Adjust requirements according to your application specifics. 50 | */ 51 | $requirements = array( 52 | // Database : 53 | array( 54 | 'name' => 'PDO extension', 55 | 'mandatory' => true, 56 | 'condition' => extension_loaded('pdo'), 57 | 'by' => 'All DB-related classes', 58 | ), 59 | array( 60 | 'name' => 'PDO SQLite extension', 61 | 'mandatory' => false, 62 | 'condition' => extension_loaded('pdo_sqlite'), 63 | 'by' => 'All DB-related classes', 64 | 'memo' => 'Required for SQLite database.', 65 | ), 66 | array( 67 | 'name' => 'PDO MySQL extension', 68 | 'mandatory' => false, 69 | 'condition' => extension_loaded('pdo_mysql'), 70 | 'by' => 'All DB-related classes', 71 | 'memo' => 'Required for MySQL database.', 72 | ), 73 | array( 74 | 'name' => 'PDO PostgreSQL extension', 75 | 'mandatory' => false, 76 | 'condition' => extension_loaded('pdo_pgsql'), 77 | 'by' => 'All DB-related classes', 78 | 'memo' => 'Required for PostgreSQL database.', 79 | ), 80 | // Cache : 81 | array( 82 | 'name' => 'Memcache extension', 83 | 'mandatory' => false, 84 | 'condition' => extension_loaded('memcache') || extension_loaded('memcached'), 85 | 'by' => 'MemCache', 86 | 'memo' => extension_loaded('memcached') ? 'To use memcached set MemCache::useMemcached to true.' : '' 87 | ), 88 | // CAPTCHA: 89 | array( 90 | 'name' => 'GD PHP extension with FreeType support', 91 | 'mandatory' => false, 92 | 'condition' => $gdOK, 93 | 'by' => 'Captcha', 94 | 'memo' => $gdMemo, 95 | ), 96 | array( 97 | 'name' => 'ImageMagick PHP extension with PNG support', 98 | 'mandatory' => false, 99 | 'condition' => $imagickOK, 100 | 'by' => 'Captcha', 101 | 'memo' => $imagickMemo, 102 | ), 103 | // PHP ini : 104 | 'phpExposePhp' => array( 105 | 'name' => 'Expose PHP', 106 | 'mandatory' => false, 107 | 'condition' => $requirementsChecker->checkPhpIniOff("expose_php"), 108 | 'by' => 'Security reasons', 109 | 'memo' => '"expose_php" should be disabled at php.ini', 110 | ), 111 | 'phpAllowUrlInclude' => array( 112 | 'name' => 'PHP allow url include', 113 | 'mandatory' => false, 114 | 'condition' => $requirementsChecker->checkPhpIniOff("allow_url_include"), 115 | 'by' => 'Security reasons', 116 | 'memo' => '"allow_url_include" should be disabled at php.ini', 117 | ), 118 | 'phpSmtp' => array( 119 | 'name' => 'PHP mail SMTP', 120 | 'mandatory' => false, 121 | 'condition' => strlen(ini_get('SMTP')) > 0, 122 | 'by' => 'Email sending', 123 | 'memo' => 'PHP mail SMTP server required', 124 | ), 125 | ); 126 | 127 | // OPcache check 128 | if (!version_compare(phpversion(), '5.5', '>=')) { 129 | $requirements[] = array( 130 | 'name' => 'APC extension', 131 | 'mandatory' => false, 132 | 'condition' => extension_loaded('apc'), 133 | 'by' => 'ApcCache', 134 | ); 135 | } 136 | 137 | $requirementsChecker->checkYii()->check($requirements)->render(); 138 | -------------------------------------------------------------------------------- /runtime/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore -------------------------------------------------------------------------------- /schema/AddressType.php: -------------------------------------------------------------------------------- 1 | function() { 14 | return [ 15 | 'user' => [ 16 | 'type' => Types::user(), 17 | ], 18 | 'city' => [ 19 | 'type' => Types::city(), 20 | ], 21 | 'zip' => [ 22 | 'type' => Type::string(), 23 | ], 24 | 'street' => [ 25 | 'type' => Type::string(), 26 | ], 27 | ]; 28 | } 29 | ]; 30 | 31 | parent::__construct($config); 32 | } 33 | 34 | } -------------------------------------------------------------------------------- /schema/CityType.php: -------------------------------------------------------------------------------- 1 | function() { 14 | return [ 15 | 'name' => [ 16 | 'type' => Type::string(), 17 | ], 18 | ]; 19 | } 20 | ]; 21 | 22 | parent::__construct($config); 23 | } 24 | 25 | } -------------------------------------------------------------------------------- /schema/MutationType.php: -------------------------------------------------------------------------------- 1 | function() { 16 | return [ 17 | 'user' => [ 18 | 'type' => Types::userMutation(), 19 | 'args' => [ 20 | 'id' => Type::nonNull(Type::int()), 21 | ], 22 | 'resolve' => function($root, $args) { 23 | return User::find()->where($args)->one(); 24 | }, 25 | ], 26 | 'address' => [ 27 | 'type' => Types::addressMutation(), 28 | 'args' => [ 29 | 'id' => Type::nonNull(Type::int()), 30 | ], 31 | 'resolve' => function($root, $args) { 32 | return Address::find()->where($args)->one(); 33 | }, 34 | ], 35 | ]; 36 | } 37 | ]; 38 | 39 | parent::__construct($config); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /schema/QueryType.php: -------------------------------------------------------------------------------- 1 | function() { 16 | return [ 17 | 'user' => [ 18 | 'type' => Types::user(), 19 | 20 | // добавим сюда аргументов, дабы 21 | // выбрать необходимого нам юзера 22 | 'args' => [ 23 | // чтобы агрумент сделать обязательным 24 | // применим модификатор Type::nonNull() 25 | 'id' => Type::nonNull(Type::int()), 26 | ], 27 | 'resolve' => function($root, $args) { 28 | // таким образом тут мы уверены в том 29 | // что в $args обязательно присутствет элемент с индексом 30 | // `id`, и он обязательно целочисленный, иначе мы бы сюда не попали 31 | 32 | // так же мы не боимся, что юзера с этим `id` 33 | // в базе у нас не существует 34 | // библиотека корректно это обработает 35 | return User::find()->where(['id' => $args['id']])->one(); 36 | }, 37 | ], 38 | 39 | // в принципе на поле user можно остановиться, в случае 40 | // если нам нужно обращаться к данным лиш конкретного пользователя 41 | // но если нам нужны данные с другими привязками добавим 42 | // для примера еще полей 43 | 44 | 'addresses' => [ 45 | // без дополтинельных параметров 46 | // просто вернет нам списох всех 47 | // адресов 48 | 'type' => Type::listOf(Types::address()), 49 | 50 | // добавим фильтров для интереса 51 | 'args' => [ 52 | 'zip' => Type::string(), 53 | 'street' => Type::string(), 54 | ], 55 | 'resolve' => function($root, $args) { 56 | $query = Address::find(); 57 | 58 | if (!empty($args)) { 59 | $query->where($args); 60 | } 61 | 62 | return $query->all(); 63 | }, 64 | ], 65 | ]; 66 | } 67 | ]; 68 | 69 | parent::__construct($config); 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /schema/Types.php: -------------------------------------------------------------------------------- 1 | name . 'ValidationErrorsType'])) { 97 | // self::$valitationTypes будет хранить наши типы, чтобы не повторяться 98 | self::$valitationTypes[$type->name . 'ValidationErrorsType'] = new UnionType([ 99 | // генерируем имя типа 100 | 'name' => $type->name . 'ValidationErrorsType', 101 | // перечисляем какие типы мы объединяем 102 | // (фактически мы их не объединяем, а говорим один из каких 103 | // существующих типом вы будем возвращать) 104 | 'types' => [ 105 | $type, 106 | Types::validationErrorsList(), 107 | ], 108 | // в аргументе в resolveType 109 | // в случае успеха нам придет наш 110 | // сохраненный/измененный объект, 111 | // в случае ошибок валидации 112 | // придет ассоциативный массив из $model->getError() 113 | // о котором я также упоминал 114 | 'resolveType' => function ($value) use ($type) { 115 | if ($value instanceof Model) { 116 | // пришел объект 117 | return $type; 118 | } else { 119 | // пришел массив (ну или вообще неизвестно что, 120 | // это нас уже мало волнует, 121 | // хотя должен массив) 122 | return Types::validationErrorsList(); 123 | } 124 | } 125 | ]); 126 | } 127 | 128 | return self::$valitationTypes[$type->name . 'ValidationErrorsType']; 129 | } 130 | 131 | } 132 | -------------------------------------------------------------------------------- /schema/UserType.php: -------------------------------------------------------------------------------- 1 | function() { 15 | return [ 16 | 'firstname' => [ 17 | 'type' => Type::string(), 18 | ], 19 | 'lastname' => [ 20 | 'type' => Type::string(), 21 | ], 22 | 'email' => [ 23 | 'type' => Type::string(), 24 | ], 25 | 'createDate' => [ 26 | 'type' => Type::string(), 27 | 28 | // текстовое описание, поясняющее 29 | // что именно хранит поле 30 | // немного позже вы увидите в чем его удобство 31 | // (оно еще больше сократит ваше общение с юайщиком) 32 | 'description' => 'Date when user was created', 33 | 34 | // чтобы можно было форматировать дату, добавим 35 | // дополнительный аргумент format 36 | 'args' => [ 37 | 'format' => Type::string(), 38 | ], 39 | 40 | // и собственно опишем что с этим аргументом 41 | // делать 42 | 'resolve' => function(User $user, $args) { 43 | if (isset($args['format'])) { 44 | return date($args['format'], strtotime($user->createDate)); 45 | } 46 | 47 | // коли ничего в format не пришло, 48 | // оставляем как есть 49 | return $user->createDate; 50 | }, 51 | ], 52 | 53 | // при необходимости с остальными датами можно 54 | // произвести те же действия, но мы 55 | // сейчас этого делать, конечно же, не будем 56 | 'modityDate' => [ 57 | 'type' => Type::string(), 58 | ], 59 | 'lastVisitDate' => [ 60 | 'type' => Type::string(), 61 | ], 62 | 'status' => [ 63 | 'type' => Type::int(), 64 | ], 65 | 66 | // теперь самая интересная часть схемы - 67 | // связи 68 | 'addresses' => [ 69 | // так как адресов у нас много, 70 | // то нам необходимо применить 71 | // модификатор Type::listOf, который 72 | // указывает на то, что поле должно вернуть 73 | // массив объектов типа, указанного 74 | // в скобках 75 | 'type' => Type::listOf(Types::address()), 76 | 'resolve' => function(User $user) { 77 | // примечательно то, что мы можем сразу же 78 | // обращаться к переменной $user без дополнительных проверок 79 | // вроде, не пустой ли он, и т.п. 80 | // так как если бы он был пустой, до текущего 81 | // уровня вложенности мы бы просто не дошли 82 | return $user->addresses; 83 | }, 84 | ], 85 | ]; 86 | } 87 | ]; 88 | 89 | parent::__construct($config); 90 | } 91 | 92 | } -------------------------------------------------------------------------------- /schema/ValidationErrorType.php: -------------------------------------------------------------------------------- 1 | function() { 15 | return [ 16 | 'field' => Type::string(), 17 | 'messages' => Type::listOf(Type::string()), 18 | ]; 19 | }, 20 | ]; 21 | 22 | parent::__construct($config); 23 | } 24 | } -------------------------------------------------------------------------------- /schema/ValidationErrorsListType.php: -------------------------------------------------------------------------------- 1 | function() { 15 | return [ 16 | 'errors' => Type::listOf(Types::validationError()), 17 | ]; 18 | }, 19 | ]; 20 | 21 | parent::__construct($config); 22 | } 23 | } -------------------------------------------------------------------------------- /schema/mutations/AddressMutationType.php: -------------------------------------------------------------------------------- 1 | function() { 16 | return [ 17 | 'update' => [ 18 | 'type' => Type::boolean(), 19 | 'description' => 'Update address.', 20 | 'args' => [ 21 | 'street' => Type::string(), 22 | 'zip' => Type::string(), 23 | 'status' => Type::int(), 24 | ], 25 | 'resolve' => function(Address $address, $args) { 26 | $address->setAttributes($args); 27 | return $address->save(); 28 | } 29 | ], 30 | 31 | // так как у нас адрес имеет поле 32 | // user, то можем позволить редактировать 33 | // его прямо отсюда 34 | // как именно, посмотрим на этапе тестирования 35 | 'user' => [ 36 | 'type' => Types::userMutation(), 37 | 'description' => 'Edit user directly from his address', 38 | // а вот поле relove должно возвращать 39 | // что, как думаете? 40 | 'resolve' => function(Address $address) { 41 | // именно! 42 | // юзера из связки нашего адреса 43 | // (кстати, если связка окажется пуста - 44 | // не страшно, GraphQL, все это корректно 45 | // кушает, а вот если она окажется типа 46 | // отличного от User, тогда он скажет, что мол 47 | // что-то пошло не так) 48 | return $address->user; 49 | } 50 | ], 51 | ]; 52 | } 53 | ]; 54 | 55 | parent::__construct($config); 56 | } 57 | 58 | } -------------------------------------------------------------------------------- /schema/mutations/UserMutationType.php: -------------------------------------------------------------------------------- 1 | function() { 16 | return [ 17 | // для теста реализуем здесь 18 | // один метод для изменения данных 19 | // объекта User 20 | 'update' => [ 21 | // какой должен быть возвращаемый тип 22 | // здесь 2 варианта - либо 23 | // булев - удача / неудача 24 | // либо же сам объект типа User. 25 | // позже мы поговорим о валидации 26 | // тогда всё станет яснее, а пока 27 | // оставим булев для простоты 28 | 29 | // 'type' => Type::boolean(), 30 | 31 | // с валидацией 32 | 'type' => Types::validationErrorsUnionType(Types::user()), 33 | 34 | 'description' => 'Update user data.', 35 | 'args' => [ 36 | // сюда засунем все то, что 37 | // разрешаем изменять у User. 38 | // в примере оставим все поля необязательными 39 | // но просто если нужно, то можно 40 | 'firstname' => Type::string(), 41 | 'lastname' => Type::string(), 42 | 'status' => Type::int(), 43 | 'email' => Type::string(), 44 | ], 45 | 'resolve' => function(User $user, $args) { 46 | // ну а здесь всё проще простого, 47 | // т.к. библиотека уже все проверила за нас: 48 | // есть ли у нас юзер, правильные ли у нас 49 | // аргументы и всё ли пришло, что необходимо 50 | $user->setAttributes($args); 51 | 52 | if ($user->save()) { 53 | return $user; 54 | } else { 55 | // на практике, этот весь код что ниже - 56 | // переиспользуемый, и должен быть вынесен 57 | // в отдельную библиотеку 58 | foreach ($user->getErrors() as $field => $messages) { 59 | $errors[] = [ 60 | 'field' => $field, 61 | 'messages' => $messages, 62 | ]; 63 | } 64 | 65 | // возвращаемый формат ассоциативного 66 | // массива должен соответствовать 67 | // полям типа (в нашем случае ValidationErrorsListType) 68 | return ['errors' => $errors]; 69 | } 70 | } 71 | ], 72 | ]; 73 | } 74 | ]; 75 | 76 | parent::__construct($config); 77 | } 78 | 79 | } -------------------------------------------------------------------------------- /tests/_bootstrap.php: -------------------------------------------------------------------------------- 1 | amOnPage(Url::toRoute('/site/about')); 9 | $I->see('About', 'h1'); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /tests/acceptance/ContactCest.php: -------------------------------------------------------------------------------- 1 | amOnPage(Url::toRoute('/site/contact')); 10 | } 11 | 12 | public function contactPageWorks(AcceptanceTester $I) 13 | { 14 | $I->wantTo('ensure that contact page works'); 15 | $I->see('Contact', 'h1'); 16 | } 17 | 18 | public function contactFormCanBeSubmitted(AcceptanceTester $I) 19 | { 20 | $I->amGoingTo('submit contact form with correct data'); 21 | $I->fillField('#contactform-name', 'tester'); 22 | $I->fillField('#contactform-email', 'tester@example.com'); 23 | $I->fillField('#contactform-subject', 'test subject'); 24 | $I->fillField('#contactform-body', 'test content'); 25 | $I->fillField('#contactform-verifycode', 'testme'); 26 | 27 | $I->click('contact-button'); 28 | 29 | $I->wait(2); // wait for button to be clicked 30 | 31 | $I->dontSeeElement('#contact-form'); 32 | $I->see('Thank you for contacting us. We will respond to you as soon as possible.'); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /tests/acceptance/HomeCest.php: -------------------------------------------------------------------------------- 1 | amOnPage(Url::toRoute('/site/index')); 9 | $I->see('My Company'); 10 | 11 | $I->seeLink('About'); 12 | $I->click('About'); 13 | $I->wait(2); // wait for page to be opened 14 | 15 | $I->see('This is the About page.'); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /tests/acceptance/LoginCest.php: -------------------------------------------------------------------------------- 1 | amOnPage(Url::toRoute('/site/login')); 9 | $I->see('Login', 'h1'); 10 | 11 | $I->amGoingTo('try to login with correct credentials'); 12 | $I->fillField('input[name="LoginForm[username]"]', 'admin'); 13 | $I->fillField('input[name="LoginForm[password]"]', 'admin'); 14 | $I->click('login-button'); 15 | $I->wait(2); // wait for button to be clicked 16 | 17 | $I->expectTo('see user info'); 18 | $I->see('Logout'); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /tests/acceptance/_bootstrap.php: -------------------------------------------------------------------------------- 1 | [ 21 | 'db' => require(__DIR__ . '/../../config/test_db.php') 22 | ] 23 | ] 24 | ); 25 | 26 | 27 | $application = new yii\console\Application($config); 28 | $exitCode = $application->run(); 29 | exit($exitCode); -------------------------------------------------------------------------------- /tests/bin/yii.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | rem ------------------------------------------------------------- 4 | rem Yii command line bootstrap script for Windows. 5 | rem 6 | rem @author Qiang Xue 7 | rem @link http://www.yiiframework.com/ 8 | rem @copyright Copyright (c) 2008 Yii Software LLC 9 | rem @license http://www.yiiframework.com/license/ 10 | rem ------------------------------------------------------------- 11 | 12 | @setlocal 13 | 14 | set YII_PATH=%~dp0 15 | 16 | if "%PHP_COMMAND%" == "" set PHP_COMMAND=php.exe 17 | 18 | "%PHP_COMMAND%" "%YII_PATH%yii" %* 19 | 20 | @endlocal 21 | -------------------------------------------------------------------------------- /tests/functional.suite.yml: -------------------------------------------------------------------------------- 1 | # Codeception Test Suite Configuration 2 | 3 | # suite for functional (integration) tests. 4 | # emulate web requests and make application process them. 5 | # (tip: better to use with frameworks). 6 | 7 | # RUN `build` COMMAND AFTER ADDING/REMOVING MODULES. 8 | #basic/web/index.php 9 | class_name: FunctionalTester 10 | modules: 11 | enabled: 12 | - Filesystem 13 | - Yii2 14 | -------------------------------------------------------------------------------- /tests/functional/ContactFormCest.php: -------------------------------------------------------------------------------- 1 | amOnPage(['site/contact']); 7 | } 8 | 9 | public function openContactPage(\FunctionalTester $I) 10 | { 11 | $I->see('Contact', 'h1'); 12 | } 13 | 14 | public function submitEmptyForm(\FunctionalTester $I) 15 | { 16 | $I->submitForm('#contact-form', []); 17 | $I->expectTo('see validations errors'); 18 | $I->see('Contact', 'h1'); 19 | $I->see('Name cannot be blank'); 20 | $I->see('Email cannot be blank'); 21 | $I->see('Subject cannot be blank'); 22 | $I->see('Body cannot be blank'); 23 | $I->see('The verification code is incorrect'); 24 | } 25 | 26 | public function submitFormWithIncorrectEmail(\FunctionalTester $I) 27 | { 28 | $I->submitForm('#contact-form', [ 29 | 'ContactForm[name]' => 'tester', 30 | 'ContactForm[email]' => 'tester.email', 31 | 'ContactForm[subject]' => 'test subject', 32 | 'ContactForm[body]' => 'test content', 33 | 'ContactForm[verifyCode]' => 'testme', 34 | ]); 35 | $I->expectTo('see that email address is wrong'); 36 | $I->dontSee('Name cannot be blank', '.help-inline'); 37 | $I->see('Email is not a valid email address.'); 38 | $I->dontSee('Subject cannot be blank', '.help-inline'); 39 | $I->dontSee('Body cannot be blank', '.help-inline'); 40 | $I->dontSee('The verification code is incorrect', '.help-inline'); 41 | } 42 | 43 | public function submitFormSuccessfully(\FunctionalTester $I) 44 | { 45 | $I->submitForm('#contact-form', [ 46 | 'ContactForm[name]' => 'tester', 47 | 'ContactForm[email]' => 'tester@example.com', 48 | 'ContactForm[subject]' => 'test subject', 49 | 'ContactForm[body]' => 'test content', 50 | 'ContactForm[verifyCode]' => 'testme', 51 | ]); 52 | $I->seeEmailIsSent(); 53 | $I->dontSeeElement('#contact-form'); 54 | $I->see('Thank you for contacting us. We will respond to you as soon as possible.'); 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /tests/functional/LoginFormCest.php: -------------------------------------------------------------------------------- 1 | amOnRoute('site/login'); 7 | } 8 | 9 | public function openLoginPage(\FunctionalTester $I) 10 | { 11 | $I->see('Login', 'h1'); 12 | 13 | } 14 | 15 | // demonstrates `amLoggedInAs` method 16 | public function internalLoginById(\FunctionalTester $I) 17 | { 18 | $I->amLoggedInAs(100); 19 | $I->amOnPage('/'); 20 | $I->see('Logout (admin)'); 21 | } 22 | 23 | // demonstrates `amLoggedInAs` method 24 | public function internalLoginByInstance(\FunctionalTester $I) 25 | { 26 | $I->amLoggedInAs(\app\models\User::findByUsername('admin')); 27 | $I->amOnPage('/'); 28 | $I->see('Logout (admin)'); 29 | } 30 | 31 | public function loginWithEmptyCredentials(\FunctionalTester $I) 32 | { 33 | $I->submitForm('#login-form', []); 34 | $I->expectTo('see validations errors'); 35 | $I->see('Username cannot be blank.'); 36 | $I->see('Password cannot be blank.'); 37 | } 38 | 39 | public function loginWithWrongCredentials(\FunctionalTester $I) 40 | { 41 | $I->submitForm('#login-form', [ 42 | 'LoginForm[username]' => 'admin', 43 | 'LoginForm[password]' => 'wrong', 44 | ]); 45 | $I->expectTo('see validations errors'); 46 | $I->see('Incorrect username or password.'); 47 | } 48 | 49 | public function loginSuccessfully(\FunctionalTester $I) 50 | { 51 | $I->submitForm('#login-form', [ 52 | 'LoginForm[username]' => 'admin', 53 | 'LoginForm[password]' => 'admin', 54 | ]); 55 | $I->see('Logout (admin)'); 56 | $I->dontSeeElement('form#login-form'); 57 | } 58 | } -------------------------------------------------------------------------------- /tests/functional/_bootstrap.php: -------------------------------------------------------------------------------- 1 | model = $this->getMockBuilder('app\models\ContactForm') 19 | ->setMethods(['validate']) 20 | ->getMock(); 21 | 22 | $this->model->expects($this->once()) 23 | ->method('validate') 24 | ->will($this->returnValue(true)); 25 | 26 | $this->model->attributes = [ 27 | 'name' => 'Tester', 28 | 'email' => 'tester@example.com', 29 | 'subject' => 'very important letter subject', 30 | 'body' => 'body of current message', 31 | ]; 32 | 33 | expect_that($this->model->contact('admin@example.com')); 34 | 35 | // using Yii2 module actions to check email was sent 36 | $this->tester->seeEmailIsSent(); 37 | 38 | $emailMessage = $this->tester->grabLastSentEmail(); 39 | expect('valid email is sent', $emailMessage)->isInstanceOf('yii\mail\MessageInterface'); 40 | expect($emailMessage->getTo())->hasKey('admin@example.com'); 41 | expect($emailMessage->getFrom())->hasKey('tester@example.com'); 42 | expect($emailMessage->getSubject())->equals('very important letter subject'); 43 | expect($emailMessage->toString())->contains('body of current message'); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /tests/unit/models/LoginFormTest.php: -------------------------------------------------------------------------------- 1 | user->logout(); 15 | } 16 | 17 | public function testLoginNoUser() 18 | { 19 | $this->model = new LoginForm([ 20 | 'username' => 'not_existing_username', 21 | 'password' => 'not_existing_password', 22 | ]); 23 | 24 | expect_not($this->model->login()); 25 | expect_that(\Yii::$app->user->isGuest); 26 | } 27 | 28 | public function testLoginWrongPassword() 29 | { 30 | $this->model = new LoginForm([ 31 | 'username' => 'demo', 32 | 'password' => 'wrong_password', 33 | ]); 34 | 35 | expect_not($this->model->login()); 36 | expect_that(\Yii::$app->user->isGuest); 37 | expect($this->model->errors)->hasKey('password'); 38 | } 39 | 40 | public function testLoginCorrect() 41 | { 42 | $this->model = new LoginForm([ 43 | 'username' => 'demo', 44 | 'password' => 'demo', 45 | ]); 46 | 47 | expect_that($this->model->login()); 48 | expect_not(\Yii::$app->user->isGuest); 49 | expect($this->model->errors)->hasntKey('password'); 50 | } 51 | 52 | } 53 | -------------------------------------------------------------------------------- /tests/unit/models/UserTest.php: -------------------------------------------------------------------------------- 1 | username)->equals('admin'); 11 | 12 | expect_not(User::findIdentity(999)); 13 | } 14 | 15 | public function testFindUserByAccessToken() 16 | { 17 | expect_that($user = User::findIdentityByAccessToken('100-token')); 18 | expect($user->username)->equals('admin'); 19 | 20 | expect_not(User::findIdentityByAccessToken('non-existing')); 21 | } 22 | 23 | public function testFindUserByUsername() 24 | { 25 | expect_that($user = User::findByUsername('admin')); 26 | expect_not(User::findByUsername('not-admin')); 27 | } 28 | 29 | /** 30 | * @depends testFindUserByUsername 31 | */ 32 | public function testValidateUser($user) 33 | { 34 | $user = User::findByUsername('admin'); 35 | expect_that($user->validateAuthKey('test100key')); 36 | expect_not($user->validateAuthKey('test102key')); 37 | 38 | expect_that($user->validatePassword('admin')); 39 | expect_not($user->validatePassword('123456')); 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /views/layouts/main.php: -------------------------------------------------------------------------------- 1 | 14 | beginPage() ?> 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | <?= Html::encode($this->title) ?> 23 | head() ?> 24 | 25 | 26 | beginBody() ?> 27 | 28 |
29 | 'My Company', 32 | 'brandUrl' => Yii::$app->homeUrl, 33 | 'options' => [ 34 | 'class' => 'navbar-inverse navbar-fixed-top', 35 | ], 36 | ]); 37 | echo Nav::widget([ 38 | 'options' => ['class' => 'navbar-nav navbar-right'], 39 | 'items' => [ 40 | ['label' => 'Home', 'url' => ['/site/index']], 41 | ['label' => 'About', 'url' => ['/site/about']], 42 | ['label' => 'Contact', 'url' => ['/site/contact']], 43 | Yii::$app->user->isGuest ? ( 44 | ['label' => 'Login', 'url' => ['/site/login']] 45 | ) : ( 46 | '
  • ' 47 | . Html::beginForm(['/site/logout'], 'post') 48 | . Html::submitButton( 49 | 'Logout (' . Yii::$app->user->identity->username . ')', 50 | ['class' => 'btn btn-link logout'] 51 | ) 52 | . Html::endForm() 53 | . '
  • ' 54 | ) 55 | ], 56 | ]); 57 | NavBar::end(); 58 | ?> 59 | 60 |
    61 | isset($this->params['breadcrumbs']) ? $this->params['breadcrumbs'] : [], 63 | ]) ?> 64 | 65 |
    66 |
    67 | 68 | 75 | 76 | endBody() ?> 77 | 78 | 79 | endPage() ?> 80 | -------------------------------------------------------------------------------- /views/site/about.php: -------------------------------------------------------------------------------- 1 | title = 'About'; 8 | $this->params['breadcrumbs'][] = $this->title; 9 | ?> 10 |
    11 |

    title) ?>

    12 | 13 |

    14 | This is the About page. You may modify the following file to customize its content: 15 |

    16 | 17 | 18 |
    19 | -------------------------------------------------------------------------------- /views/site/contact.php: -------------------------------------------------------------------------------- 1 | title = 'Contact'; 12 | $this->params['breadcrumbs'][] = $this->title; 13 | ?> 14 |
    15 |

    title) ?>

    16 | 17 | session->hasFlash('contactFormSubmitted')): ?> 18 | 19 |
    20 | Thank you for contacting us. We will respond to you as soon as possible. 21 |
    22 | 23 |

    24 | Note that if you turn on the Yii debugger, you should be able 25 | to view the mail message on the mail panel of the debugger. 26 | mailer->useFileTransport): ?> 27 | Because the application is in development mode, the email is not sent but saved as 28 | a file under mailer->fileTransportPath) ?>. 29 | Please configure the useFileTransport property of the mail 30 | application component to be false to enable email sending. 31 | 32 |

    33 | 34 | 35 | 36 |

    37 | If you have business inquiries or other questions, please fill out the following form to contact us. 38 | Thank you. 39 |

    40 | 41 |
    42 |
    43 | 44 | 'contact-form']); ?> 45 | 46 | field($model, 'name')->textInput(['autofocus' => true]) ?> 47 | 48 | field($model, 'email') ?> 49 | 50 | field($model, 'subject') ?> 51 | 52 | field($model, 'body')->textarea(['rows' => 6]) ?> 53 | 54 | field($model, 'verifyCode')->widget(Captcha::className(), [ 55 | 'template' => '
    {image}
    {input}
    ', 56 | ]) ?> 57 | 58 |
    59 | 'btn btn-primary', 'name' => 'contact-button']) ?> 60 |
    61 | 62 | 63 | 64 |
    65 |
    66 | 67 | 68 |
    69 | -------------------------------------------------------------------------------- /views/site/error.php: -------------------------------------------------------------------------------- 1 | title = $name; 11 | ?> 12 |
    13 | 14 |

    title) ?>

    15 | 16 |
    17 | 18 |
    19 | 20 |

    21 | The above error occurred while the Web server was processing your request. 22 |

    23 |

    24 | Please contact us if you think this is a server error. Thank you. 25 |

    26 | 27 |
    28 | -------------------------------------------------------------------------------- /views/site/index.php: -------------------------------------------------------------------------------- 1 | title = 'My Yii Application'; 6 | ?> 7 |
    8 | 9 |
    10 |

    Congratulations!

    11 | 12 |

    You have successfully created your Yii-powered application.

    13 | 14 |

    Get started with Yii

    15 |
    16 | 17 |
    18 | 19 |
    20 |
    21 |

    Heading

    22 | 23 |

    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et 24 | dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip 25 | ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu 26 | fugiat nulla pariatur.

    27 | 28 |

    Yii Documentation »

    29 |
    30 |
    31 |

    Heading

    32 | 33 |

    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et 34 | dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip 35 | ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu 36 | fugiat nulla pariatur.

    37 | 38 |

    Yii Forum »

    39 |
    40 |
    41 |

    Heading

    42 | 43 |

    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et 44 | dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip 45 | ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu 46 | fugiat nulla pariatur.

    47 | 48 |

    Yii Extensions »

    49 |
    50 |
    51 | 52 |
    53 |
    54 | -------------------------------------------------------------------------------- /views/site/login.php: -------------------------------------------------------------------------------- 1 | title = 'Login'; 11 | $this->params['breadcrumbs'][] = $this->title; 12 | ?> 13 |
    14 |

    title) ?>

    15 | 16 |

    Please fill out the following fields to login:

    17 | 18 | 'login-form', 20 | 'layout' => 'horizontal', 21 | 'fieldConfig' => [ 22 | 'template' => "{label}\n
    {input}
    \n
    {error}
    ", 23 | 'labelOptions' => ['class' => 'col-lg-1 control-label'], 24 | ], 25 | ]); ?> 26 | 27 | field($model, 'username')->textInput(['autofocus' => true]) ?> 28 | 29 | field($model, 'password')->passwordInput() ?> 30 | 31 | field($model, 'rememberMe')->checkbox([ 32 | 'template' => "
    {input} {label}
    \n
    {error}
    ", 33 | ]) ?> 34 | 35 |
    36 |
    37 | 'btn btn-primary', 'name' => 'login-button']) ?> 38 |
    39 |
    40 | 41 | 42 | 43 |
    44 | You may login with admin/admin or demo/demo.
    45 | To modify the username/password, please check out the code app\models\User::$users. 46 |
    47 |
    48 | -------------------------------------------------------------------------------- /web/.htaccess: -------------------------------------------------------------------------------- 1 | 2 | Header add Access-Control-Allow-Origin "*" 3 | Header add Access-Control-Allow-Headers "Content-Type, Authorization" 4 | Header add Access-Control-Allow-Methods "GET, POST, OPTIONS" 5 | 6 | 7 | RewriteEngine on 8 | # If a directory or a file exists, use it directly 9 | RewriteCond %{REQUEST_FILENAME} !-f 10 | RewriteCond %{REQUEST_FILENAME} !-d 11 | # Otherwise forward it to index.php 12 | RewriteRule . index.php -------------------------------------------------------------------------------- /web/assets/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /web/css/site.css: -------------------------------------------------------------------------------- 1 | html, 2 | body { 3 | height: 100%; 4 | } 5 | 6 | .wrap { 7 | min-height: 100%; 8 | height: auto; 9 | margin: 0 auto -60px; 10 | padding: 0 0 60px; 11 | } 12 | 13 | .wrap > .container { 14 | padding: 70px 15px 20px; 15 | } 16 | 17 | .footer { 18 | height: 60px; 19 | background-color: #f5f5f5; 20 | border-top: 1px solid #ddd; 21 | padding-top: 20px; 22 | } 23 | 24 | .jumbotron { 25 | text-align: center; 26 | background-color: transparent; 27 | } 28 | 29 | .jumbotron .btn { 30 | font-size: 21px; 31 | padding: 14px 24px; 32 | } 33 | 34 | .not-set { 35 | color: #c55; 36 | font-style: italic; 37 | } 38 | 39 | /* add sorting icons to gridview sort links */ 40 | a.asc:after, a.desc:after { 41 | position: relative; 42 | top: 1px; 43 | display: inline-block; 44 | font-family: 'Glyphicons Halflings'; 45 | font-style: normal; 46 | font-weight: normal; 47 | line-height: 1; 48 | padding-left: 5px; 49 | } 50 | 51 | a.asc:after { 52 | content: /*"\e113"*/ "\e151"; 53 | } 54 | 55 | a.desc:after { 56 | content: /*"\e114"*/ "\e152"; 57 | } 58 | 59 | .sort-numerical a.asc:after { 60 | content: "\e153"; 61 | } 62 | 63 | .sort-numerical a.desc:after { 64 | content: "\e154"; 65 | } 66 | 67 | .sort-ordinal a.asc:after { 68 | content: "\e155"; 69 | } 70 | 71 | .sort-ordinal a.desc:after { 72 | content: "\e156"; 73 | } 74 | 75 | .grid-view th { 76 | white-space: nowrap; 77 | } 78 | 79 | .hint-block { 80 | display: block; 81 | margin-top: 5px; 82 | color: #999; 83 | } 84 | 85 | .error-summary { 86 | color: #a94442; 87 | background: #fdf7f7; 88 | border-left: 3px solid #eed3d7; 89 | padding: 10px 20px; 90 | margin: 0 0 15px 0; 91 | } 92 | 93 | /* align the logout "link" (button in form) of the navbar */ 94 | .nav li > form > button.logout { 95 | padding: 15px; 96 | border: none; 97 | } 98 | 99 | @media(max-width:767px) { 100 | .nav li > form > button.logout { 101 | display:block; 102 | text-align: left; 103 | width: 100%; 104 | padding: 10px 15px; 105 | } 106 | } 107 | 108 | .nav > li > form > button.logout:focus, 109 | .nav > li > form > button.logout:hover { 110 | text-decoration: none; 111 | } 112 | 113 | .nav > li > form > button.logout:focus { 114 | outline: none; 115 | } 116 | -------------------------------------------------------------------------------- /web/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/timur560/graphql-server-demo/2242c20f0ec7b9f5c23de880ca6a3e5c708bf653/web/favicon.ico -------------------------------------------------------------------------------- /web/index-test.php: -------------------------------------------------------------------------------- 1 | run(); 17 | -------------------------------------------------------------------------------- /web/index.php: -------------------------------------------------------------------------------- 1 | run(); 13 | -------------------------------------------------------------------------------- /web/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: -------------------------------------------------------------------------------- /yii: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | run(); 21 | exit($exitCode); 22 | -------------------------------------------------------------------------------- /yii.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | rem ------------------------------------------------------------- 4 | rem Yii command line bootstrap script for Windows. 5 | rem 6 | rem @author Qiang Xue 7 | rem @link http://www.yiiframework.com/ 8 | rem @copyright Copyright (c) 2008 Yii Software LLC 9 | rem @license http://www.yiiframework.com/license/ 10 | rem ------------------------------------------------------------- 11 | 12 | @setlocal 13 | 14 | set YII_PATH=%~dp0 15 | 16 | if "%PHP_COMMAND%" == "" set PHP_COMMAND=php.exe 17 | 18 | "%PHP_COMMAND%" "%YII_PATH%yii" %* 19 | 20 | @endlocal 21 | --------------------------------------------------------------------------------