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

Hello username) ?>,

11 | 12 |

Follow the link below to reset your password:

13 | 14 |

15 |
16 | -------------------------------------------------------------------------------- /mail/passwordResetToken-text.php: -------------------------------------------------------------------------------- 1 | urlManager->createAbsoluteUrl(['site/reset-password', 'token' => $user->password_reset_token]); 7 | ?> 8 | Hello username ?>, 9 | 10 | Follow the link below to reset your password: 11 | 12 | 13 | -------------------------------------------------------------------------------- /migrations/m161209_144250_create_user_table.php: -------------------------------------------------------------------------------- 1 | db->driverName === 'mysql') { 14 | $tableOptions = 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE=InnoDB'; 15 | } 16 | 17 | $this->createTable('user', [ 18 | 'id' => $this->primaryKey(), 19 | 'username' => $this->string()->notNull()->unique(), 20 | 'auth_key' => $this->string(32)->notNull(), 21 | 'password_hash' => $this->string()->notNull(), 22 | 'password_reset_token' => $this->string()->unique(), 23 | 'email' => $this->string()->notNull()->unique(), 24 | 25 | 'status' => $this->smallInteger()->notNull()->defaultValue(10), 26 | 'created_at' => $this->integer()->notNull(), 27 | 'updated_at' => $this->integer()->notNull(), 28 | ], $tableOptions); 29 | } 30 | 31 | public function down() 32 | { 33 | $this->dropTable('user'); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /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()) { 49 | $user = $this->getUser(); 50 | 51 | if (!$user || !$user->validatePassword($this->password)) { 52 | $this->addError($attribute, 'Incorrect username or password.'); 53 | } 54 | } 55 | } 56 | 57 | /** 58 | * Logs in a user using the provided username and password. 59 | * @return bool whether the user is logged in successfully 60 | */ 61 | public function login() 62 | { 63 | if ($this->validate()) { 64 | return Yii::$app->user->login($this->getUser(), $this->rememberMe ? 3600*24*30 : 0); 65 | } 66 | return false; 67 | } 68 | 69 | /** 70 | * Finds user by [[username]] 71 | * 72 | * @return User|null 73 | */ 74 | public function getUser() 75 | { 76 | if ($this->_user === false) { 77 | $this->_user = User::findByEmail($this->email); // 78 | } 79 | 80 | return $this->_user; 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /models/PasswordResetRequestForm.php: -------------------------------------------------------------------------------- 1 | '\app\models\User', 26 | 'filter' => ['status' => User::STATUS_ACTIVE], 27 | 'message' => 'There is no user with such email.' 28 | ], 29 | ]; 30 | } 31 | 32 | /** 33 | * Sends an email with a link, for resetting the password. 34 | * 35 | * @return bool whether the email was send 36 | */ 37 | public function sendEmail() 38 | { 39 | /* @var $user User */ 40 | $user = User::findOne([ 41 | 'status' => User::STATUS_ACTIVE, 42 | 'email' => $this->email, 43 | ]); 44 | 45 | if (!$user) { 46 | return false; 47 | } 48 | 49 | if (!User::isPasswordResetTokenValid($user->password_reset_token)) { 50 | $user->generatePasswordResetToken(); 51 | if (!$user->save()) { 52 | return false; 53 | } 54 | } 55 | 56 | return Yii::$app 57 | ->mailer 58 | ->compose( 59 | ['html' => 'passwordResetToken-html', 'text' => 'passwordResetToken-text'], 60 | ['user' => $user] 61 | ) 62 | ->setFrom([Yii::$app->params['supportEmail'] => Yii::$app->name . ' robot']) 63 | ->setTo($this->email) 64 | ->setSubject('Password reset for ' . Yii::$app->name) 65 | ->send(); 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /models/ResetPasswordForm.php: -------------------------------------------------------------------------------- 1 | _user = User::findByPasswordResetToken($token); 33 | if (!$this->_user) { 34 | throw new InvalidParamException('Wrong password reset token.'); 35 | } 36 | parent::__construct($config); 37 | } 38 | 39 | /** 40 | * @inheritdoc 41 | */ 42 | public function rules() 43 | { 44 | return [ 45 | ['password', 'required'], 46 | ['password', 'string', 'min' => 6], 47 | ]; 48 | } 49 | 50 | /** 51 | * Resets password. 52 | * 53 | * @return bool if password was reset. 54 | */ 55 | public function resetPassword() 56 | { 57 | $user = $this->_user; 58 | $user->setPassword($this->password); 59 | $user->removePasswordResetToken(); 60 | 61 | return $user->save(false); 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /models/SignupForm.php: -------------------------------------------------------------------------------- 1 | '\app\models\User', 'message' => 'This username has already been taken.'], 27 | ['username', 'string', 'min' => 2, 'max' => 255], 28 | 29 | ['email', 'trim'], 30 | ['email', 'required'], 31 | ['email', 'email'], 32 | ['email', 'string', 'max' => 255], 33 | ['email', 'unique', 'targetClass' => '\app\models\User', 'message' => 'This email address has already been taken.'], 34 | 35 | ['password', 'required'], 36 | ['password', 'string', 'min' => 6], 37 | ]; 38 | } 39 | 40 | /** 41 | * Signs user up. 42 | * 43 | * @return User|null the saved model or null if saving fails 44 | */ 45 | public function signup() 46 | { 47 | if (!$this->validate()) { 48 | return null; 49 | } 50 | 51 | $user = new User(); 52 | $user->username = $this->username; 53 | $user->email = $this->email; 54 | $user->setPassword($this->password); 55 | $user->generateAuthKey(); 56 | 57 | return $user->save() ? $user : null; 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /models/User.php: -------------------------------------------------------------------------------- 1 | self::STATUS_ACTIVE], 56 | ['status', 'in', 'range' => [self::STATUS_ACTIVE, self::STATUS_DELETED]], 57 | ]; 58 | } 59 | 60 | /** 61 | * @inheritdoc 62 | */ 63 | public static function findIdentity($id) 64 | { 65 | return static::findOne(['id' => $id, 'status' => self::STATUS_ACTIVE]); 66 | } 67 | 68 | /** 69 | * @inheritdoc 70 | */ 71 | public static function findIdentityByAccessToken($token, $type = null) 72 | { 73 | throw new NotSupportedException('"findIdentityByAccessToken" is not implemented.'); 74 | } 75 | 76 | /** 77 | * Finds user by username 78 | * 79 | * @param string $username 80 | * @return static|null 81 | */ 82 | public static function findByUsername($username) 83 | { 84 | return static::findOne(['username' => $username, 'status' => self::STATUS_ACTIVE]); 85 | } 86 | 87 | /** 88 | * Finds user by e-mail 89 | * 90 | * @param string $email 91 | * @return static|null 92 | */ 93 | public static function findByEmail($email) 94 | { 95 | return static::findOne(['email' => $email, 'status' => self::STATUS_ACTIVE]); 96 | } 97 | 98 | /** 99 | * Finds user by password reset token 100 | * 101 | * @param string $token password reset token 102 | * @return static|null 103 | */ 104 | public static function findByPasswordResetToken($token) 105 | { 106 | if (!static::isPasswordResetTokenValid($token)) { 107 | return null; 108 | } 109 | 110 | return static::findOne([ 111 | 'password_reset_token' => $token, 112 | 'status' => self::STATUS_ACTIVE, 113 | ]); 114 | } 115 | 116 | /** 117 | * Finds out if password reset token is valid 118 | * 119 | * @param string $token password reset token 120 | * @return bool 121 | */ 122 | public static function isPasswordResetTokenValid($token) 123 | { 124 | if (empty($token)) { 125 | return false; 126 | } 127 | 128 | $timestamp = (int) substr($token, strrpos($token, '_') + 1); 129 | $expire = Yii::$app->params['user.passwordResetTokenExpire']; 130 | return $timestamp + $expire >= time(); 131 | } 132 | 133 | /** 134 | * @inheritdoc 135 | */ 136 | public function getId() 137 | { 138 | return $this->getPrimaryKey(); 139 | } 140 | 141 | /** 142 | * @inheritdoc 143 | */ 144 | public function getAuthKey() 145 | { 146 | return $this->auth_key; 147 | } 148 | 149 | /** 150 | * @inheritdoc 151 | */ 152 | public function validateAuthKey($authKey) 153 | { 154 | return $this->getAuthKey() === $authKey; 155 | } 156 | 157 | /** 158 | * Validates password 159 | * 160 | * @param string $password password to validate 161 | * @return bool if password provided is valid for current user 162 | */ 163 | public function validatePassword($password) 164 | { 165 | return Yii::$app->security->validatePassword($password, $this->password_hash); 166 | } 167 | 168 | /** 169 | * Generates password hash from password and sets it to the model 170 | * 171 | * @param string $password 172 | */ 173 | public function setPassword($password) 174 | { 175 | $this->password_hash = Yii::$app->security->generatePasswordHash($password); 176 | } 177 | 178 | /** 179 | * Generates "remember me" authentication key 180 | */ 181 | public function generateAuthKey() 182 | { 183 | $this->auth_key = Yii::$app->security->generateRandomString(); 184 | } 185 | 186 | /** 187 | * Generates new password reset token 188 | */ 189 | public function generatePasswordResetToken() 190 | { 191 | $this->password_reset_token = Yii::$app->security->generateRandomString() . '_' . time(); 192 | } 193 | 194 | /** 195 | * Removes password reset token 196 | */ 197 | public function removePasswordResetToken() 198 | { 199 | $this->password_reset_token = null; 200 | } 201 | } -------------------------------------------------------------------------------- /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 -------------------------------------------------------------------------------- /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 | <?= Html::encode($this->title) ?> 22 | head() ?> 23 | 24 | 25 | beginBody() ?> 26 | 27 |
28 | 'My Company', 31 | 'brandUrl' => Yii::$app->homeUrl, 32 | 'options' => [ 33 | 'class' => 'navbar-inverse navbar-fixed-top', 34 | ], 35 | ]); 36 | $menuItems = [ 37 | ['label' => 'Home', 'url' => ['/site/index']], 38 | ['label' => 'About', 'url' => ['/site/about']], 39 | ['label' => 'Contact', 'url' => ['/site/contact']], 40 | ]; 41 | if (Yii::$app->user->isGuest) { 42 | $menuItems[] = ['label' => 'Signup', 'url' => ['/site/signup']]; 43 | $menuItems[] = ['label' => 'Login', 'url' => ['/site/login']]; 44 | } else { 45 | $menuItems[] = '
  • ' 46 | . Html::beginForm(['/site/logout'], 'post') 47 | . Html::submitButton( 48 | 'Logout (' . Yii::$app->user->identity->username . ')', 49 | ['class' => 'btn btn-link logout'] 50 | ) 51 | . Html::endForm() 52 | . '
  • '; 53 | } 54 | echo Nav::widget([ 55 | 'options' => ['class' => 'navbar-nav navbar-right'], 56 | 'items' => $menuItems, 57 | ]); 58 | NavBar::end(); 59 | ?> 60 | 61 |
    62 | isset($this->params['breadcrumbs']) ? $this->params['breadcrumbs'] : [], 64 | ]) ?> 65 | 66 |
    67 |
    68 | 69 |
    70 |
    71 |

    © My Company

    72 | 73 |

    74 |
    75 |
    76 | 77 | endBody() ?> 78 | 79 | 80 | endPage() ?> 81 | -------------------------------------------------------------------------------- /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 | 47 | -------------------------------------------------------------------------------- /views/site/requestPasswordResetToken.php: -------------------------------------------------------------------------------- 1 | title = 'Request password reset'; 11 | $this->params['breadcrumbs'][] = $this->title; 12 | ?> 13 |
    14 |

    title) ?>

    15 | 16 |

    Please fill out your email. A link to reset password will be sent there.

    17 | 18 |
    19 |
    20 | 'request-password-reset-form']); ?> 21 | 22 | field($model, 'email')->textInput(['autofocus' => true]) ?> 23 | 24 |
    25 | 'btn btn-primary']) ?> 26 |
    27 | 28 | 29 |
    30 |
    31 |
    32 | -------------------------------------------------------------------------------- /views/site/resetPassword.php: -------------------------------------------------------------------------------- 1 | title = 'Reset password'; 11 | $this->params['breadcrumbs'][] = $this->title; 12 | ?> 13 |
    14 |

    title) ?>

    15 | 16 |

    Please choose your new password:

    17 | 18 |
    19 |
    20 | 'reset-password-form']); ?> 21 | 22 | field($model, 'password')->passwordInput(['autofocus' => true]) ?> 23 | 24 |
    25 | 'btn btn-primary']) ?> 26 |
    27 | 28 | 29 |
    30 |
    31 |
    32 | -------------------------------------------------------------------------------- /views/site/signup.php: -------------------------------------------------------------------------------- 1 | title = 'Signup'; 11 | $this->params['breadcrumbs'][] = $this->title; 12 | ?> 13 | 36 | -------------------------------------------------------------------------------- /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/egor/yii2-basic-auth-through-db/acdf127d9759de0fec7377987dcbb7842cd7c872/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 | --------------------------------------------------------------------------------