185 changed files with 10896 additions and 10390 deletions
			
			
		| @ -0,0 +1,14 @@ | ||||
| language: php | ||||
| 
 | ||||
| php: | ||||
|   - 5.3 | ||||
|   - 5.4 | ||||
|   - 5.5 | ||||
| 
 | ||||
| env: | ||||
|   - DB=mysql | ||||
| 
 | ||||
| before_script: | ||||
|   - sh -c "if [ '$DB' = 'mysql' ]; then mysql -e 'create database IF NOT EXISTS yiitest;'; fi" | ||||
| 
 | ||||
| script: phpunit | ||||
| Before Width: | Height: | Size: 8.6 KiB After Width: | Height: | Size: 8.6 KiB | 
| Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB | 
| @ -0,0 +1,319 @@ | ||||
| Database Migration | ||||
| ================== | ||||
| 
 | ||||
| Like source code, the structure of a database is evolving as we develop and maintain | ||||
| a database-driven application. For example, during development, we may want to | ||||
| add a new table; or after the application is put into production, we may realize | ||||
| the need of adding an index on a column. It is important to keep track of these | ||||
| structural database changes (called **migration**) like we do with our source | ||||
| code. If the source code and the database are out of sync, it is very likely | ||||
| the whole system may break. For this reason, Yii provides a database migration | ||||
| tool that can keep track of database migration history, apply new migrations, | ||||
| or revert existing ones. | ||||
| 
 | ||||
| The following steps show how we can use database migration during development: | ||||
| 
 | ||||
| 1. Tim creates a new migration (e.g. create a new table) | ||||
| 2. Tim commits the new migration into source control system (e.g. GIT, Mercurial) | ||||
| 3. Doug updates from source control system and receives the new migration | ||||
| 4. Doug applies the migration to his local development database | ||||
| 
 | ||||
| 
 | ||||
| Yii supports database migration via the `yiic migrate` command line tool. This | ||||
| tool supports creating new migrations, applying/reverting/redoing migrations, and | ||||
| showing migration history and new migrations. | ||||
| 
 | ||||
| Creating Migrations | ||||
| ------------------- | ||||
| 
 | ||||
| To create a new migration (e.g. create a news table), we run the following command: | ||||
| 
 | ||||
| ~~~ | ||||
| yiic migrate/create <name> | ||||
| ~~~ | ||||
| 
 | ||||
| The required `name` parameter specifies a very brief description of the migration | ||||
| (e.g. `create_news_table`). As we will show in the following, the `name` parameter | ||||
| is used as part of a PHP class name. Therefore, it should only contain letters, | ||||
| digits and/or underscore characters. | ||||
| 
 | ||||
| ~~~ | ||||
| yiic migrate/create create_news_table | ||||
| ~~~ | ||||
| 
 | ||||
| The above command will create under the `protected/migrations` directory a new | ||||
| file named `m101129_185401_create_news_table.php` which contains the following | ||||
| initial code: | ||||
| 
 | ||||
| ~~~ | ||||
| [php] | ||||
| class m101129_185401_create_news_table extends \yii\db\Migration | ||||
| { | ||||
| 	public function up() | ||||
| 	{ | ||||
| 	} | ||||
| 
 | ||||
| 	public function down() | ||||
| 	{ | ||||
| 		echo "m101129_185401_create_news_table cannot be reverted.\n"; | ||||
| 		return false; | ||||
| 	} | ||||
| } | ||||
| ~~~ | ||||
| 
 | ||||
| Notice that the class name is the same as the file name which is of the pattern | ||||
| `m<timestamp>_<name>`, where `<timestamp>` refers to the UTC timestamp (in the | ||||
| format of `yymmdd_hhmmss`) when the migration is created, and `<name>` is taken | ||||
| from the command's `name` parameter. | ||||
| 
 | ||||
| The `up()` method should contain the code implementing the actual database | ||||
| migration, while the `down()` method may contain the code reverting what is | ||||
| done in `up()`. | ||||
| 
 | ||||
| Sometimes, it is impossible to implement `down()`. For example, if we delete | ||||
| table rows in `up()`, we will not be able to recover them in `down()`. In this | ||||
| case, the migration is called irreversible, meaning we cannot roll back to | ||||
| a previous state of the database. In the above generated code, the `down()` | ||||
| method returns `false` to indicate that the migration cannot be reverted. | ||||
| 
 | ||||
| As an example, let's show the migration about creating a news table. | ||||
| 
 | ||||
| ~~~ | ||||
| [php] | ||||
| class m101129_185401_create_news_table extends \yii\db\Migration | ||||
| { | ||||
| 	public function up() | ||||
| 	{ | ||||
| 		$this->db->createCommand()->createTable('tbl_news, array( | ||||
| 			'id' => 'pk', | ||||
| 			'title' => 'string NOT NULL', | ||||
| 			'content' => 'text', | ||||
| 		))->execute(); | ||||
| 	} | ||||
| 
 | ||||
| 	public function down() | ||||
| 	{ | ||||
| 		$this->db->createCommand()->dropTable('tbl_news')->execute(); | ||||
| 	} | ||||
| } | ||||
| ~~~ | ||||
| 
 | ||||
| The base class [\yii\db\Migration] exposes a database connection via `db` | ||||
| property. You can use it for manipulating data and schema of a database. | ||||
| 
 | ||||
| Transactional Migrations | ||||
| ------------------------ | ||||
| 
 | ||||
| While performing complex DB migrations, we usually want to make sure that each | ||||
| migration succeed or fail as a whole so that the database maintains the | ||||
| consistency and integrity. In order to achieve this goal, we can exploit | ||||
| DB transactions. | ||||
| 
 | ||||
| We could explicitly start a DB transaction and enclose the rest of the DB-related | ||||
| code within the transaction, like the following: | ||||
| 
 | ||||
| ~~~ | ||||
| [php] | ||||
| class m101129_185401_create_news_table extends \yii\db\Migration | ||||
| { | ||||
| 	public function up() | ||||
| 	{ | ||||
| 		$transaction=$this->getDbConnection()->beginTransaction(); | ||||
| 		try | ||||
| 		{ | ||||
| 			$this->db->createCommand()->createTable('tbl_news, array( | ||||
| 				'id' => 'pk', | ||||
| 				'title' => 'string NOT NULL', | ||||
| 				'content' => 'text', | ||||
| 			))->execute(); | ||||
| 			$transaction->commit(); | ||||
| 		} | ||||
| 		catch(Exception $e) | ||||
| 		{ | ||||
| 			echo "Exception: ".$e->getMessage()."\n"; | ||||
| 			$transaction->rollback(); | ||||
| 			return false; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	// ...similar code for down() | ||||
| } | ||||
| ~~~ | ||||
| 
 | ||||
| > Note: Not all DBMS support transactions. And some DB queries cannot be put | ||||
| > into a transaction. In this case, you will have to implement `up()` and | ||||
| > `down()`, instead. And for MySQL, some SQL statements may cause | ||||
| > [implicit commit](http://dev.mysql.com/doc/refman/5.1/en/implicit-commit.html). | ||||
| 
 | ||||
| 
 | ||||
| Applying Migrations | ||||
| ------------------- | ||||
| 
 | ||||
| To apply all available new migrations (i.e., make the local database up-to-date), | ||||
| run the following command: | ||||
| 
 | ||||
| ~~~ | ||||
| yiic migrate | ||||
| ~~~ | ||||
| 
 | ||||
| The command will show the list of all new migrations. If you confirm to apply | ||||
| the migrations, it will run the `up()` method in every new migration class, one | ||||
| after another, in the order of the timestamp value in the class name. | ||||
| 
 | ||||
| After applying a migration, the migration tool will keep a record in a database | ||||
| table named `tbl_migration`. This allows the tool to identify which migrations | ||||
| have been applied and which are not. If the `tbl_migration` table does not exist, | ||||
| the tool will automatically create it in the database specified by the `db` | ||||
| application component. | ||||
| 
 | ||||
| Sometimes, we may only want to apply one or a few new migrations. We can use the | ||||
| following command: | ||||
| 
 | ||||
| ~~~ | ||||
| yiic migrate/up 3 | ||||
| ~~~ | ||||
| 
 | ||||
| This command will apply the 3 new migrations. Changing the value 3 will allow | ||||
| us to change the number of migrations to be applied. | ||||
| 
 | ||||
| We can also migrate the database to a specific version with the following command: | ||||
| 
 | ||||
| ~~~ | ||||
| yiic migrate/to 101129_185401 | ||||
| ~~~ | ||||
| 
 | ||||
| That is, we use the timestamp part of a migration name to specify the version | ||||
| that we want to migrate the database to. If there are multiple migrations between | ||||
| the last applied migration and the specified migration, all these migrations | ||||
| will be applied. If the specified migration has been applied before, then all | ||||
| migrations applied after it will be reverted (to be described in the next section). | ||||
| 
 | ||||
| 
 | ||||
| Reverting Migrations | ||||
| -------------------- | ||||
| 
 | ||||
| To revert the last one or several applied migrations, we can use the following | ||||
| command: | ||||
| 
 | ||||
| ~~~ | ||||
| yiic migrate/down [step] | ||||
| ~~~ | ||||
| 
 | ||||
| where the optional `step` parameter specifies how many migrations to be reverted | ||||
| back. It defaults to 1, meaning reverting back the last applied migration. | ||||
| 
 | ||||
| As we described before, not all migrations can be reverted. Trying to revert | ||||
| such migrations will throw an exception and stop the whole reverting process. | ||||
| 
 | ||||
| 
 | ||||
| Redoing Migrations | ||||
| ------------------ | ||||
| 
 | ||||
| Redoing migrations means first reverting and then applying the specified migrations. | ||||
| This can be done with the following command: | ||||
| 
 | ||||
| ~~~ | ||||
| yiic migrate/redo [step] | ||||
| ~~~ | ||||
| 
 | ||||
| where the optional `step` parameter specifies how many migrations to be redone. | ||||
| It defaults to 1, meaning redoing the last migration. | ||||
| 
 | ||||
| 
 | ||||
| Showing Migration Information | ||||
| ----------------------------- | ||||
| 
 | ||||
| Besides applying and reverting migrations, the migration tool can also display | ||||
| the migration history and the new migrations to be applied. | ||||
| 
 | ||||
| ~~~ | ||||
| yiic migrate/history [limit] | ||||
| yiic migrate/new [limit] | ||||
| ~~~ | ||||
| 
 | ||||
| where the optional parameter `limit` specifies the number of migrations to be | ||||
| displayed. If `limit` is not specified, all available migrations will be displayed. | ||||
| 
 | ||||
| The first command shows the migrations that have been applied, while the second | ||||
| command shows the migrations that have not been applied. | ||||
| 
 | ||||
| 
 | ||||
| Modifying Migration History | ||||
| --------------------------- | ||||
| 
 | ||||
| Sometimes, we may want to modify the migration history to a specific migration | ||||
| version without actually applying or reverting the relevant migrations. This | ||||
| often happens when developing a new migration. We can use the following command | ||||
| to achieve this goal. | ||||
| 
 | ||||
| ~~~ | ||||
| yiic migrate/mark 101129_185401 | ||||
| ~~~ | ||||
| 
 | ||||
| This command is very similar to `yiic migrate/to` command, except that it only | ||||
| modifies the migration history table to the specified version without applying | ||||
| or reverting the migrations. | ||||
| 
 | ||||
| 
 | ||||
| Customizing Migration Command | ||||
| ----------------------------- | ||||
| 
 | ||||
| There are several ways to customize the migration command. | ||||
| 
 | ||||
| ### Use Command Line Options | ||||
| 
 | ||||
| The migration command comes with four options that can be specified in command | ||||
| line: | ||||
| 
 | ||||
| * `interactive`: boolean, specifies whether to perform migrations in an | ||||
|   interactive mode. Defaults to true, meaning the user will be prompted when | ||||
|   performing a specific migration. You may set this to false should the | ||||
|   migrations be done in a background process. | ||||
| 
 | ||||
| * `migrationPath`: string, specifies the directory storing all migration class | ||||
|   files. This must be specified in terms of a path alias, and the corresponding | ||||
|   directory must exist. If not specified, it will use the `migrations` | ||||
|   sub-directory under the application base path. | ||||
| 
 | ||||
| * `migrationTable`: string, specifies the name of the database table for storing | ||||
|   migration history information. It defaults to `tbl_migration`. The table | ||||
|   structure is `version varchar(255) primary key, apply_time integer`. | ||||
| 
 | ||||
| * `connectionID`: string, specifies the ID of the database application component. | ||||
|   Defaults to 'db'. | ||||
| 
 | ||||
| * `templateFile`: string, specifies the path of the file to be served as the code | ||||
|   template for generating the migration classes. This must be specified in terms | ||||
|   of a path alias (e.g. `application.migrations.template`). If not set, an | ||||
|   internal template will be used. Inside the template, the token `{ClassName}` | ||||
|   will be replaced with the actual migration class name. | ||||
| 
 | ||||
| To specify these options, execute the migrate command using the following format | ||||
| 
 | ||||
| ~~~ | ||||
| yiic migrate/up --option1=value1 --option2=value2 ... | ||||
| ~~~ | ||||
| 
 | ||||
| For example, if we want to migrate for a `forum` module whose migration files | ||||
| are located within the module's `migrations` directory, we can use the following | ||||
| command: | ||||
| 
 | ||||
| ~~~ | ||||
| yiic migrate/up --migrationPath=ext.forum.migrations | ||||
| ~~~ | ||||
| 
 | ||||
| 
 | ||||
| ### Configure Command Globally | ||||
| 
 | ||||
| While command line options allow us to configure the migration command | ||||
| on-the-fly, sometimes we may want to configure the command once for all. | ||||
| For example, we may want to use a different table to store the migration history, | ||||
| or we may want to use a customized migration template. We can do so by modifying | ||||
| the console application's configuration file like the following, | ||||
| 
 | ||||
| ```php | ||||
| TBD | ||||
| ``` | ||||
| 
 | ||||
| Now if we run the `migrate` command, the above configurations will take effect | ||||
| without requiring us to enter the command line options every time. | ||||
| @ -0,0 +1,181 @@ | ||||
| Performance Tuning | ||||
| ================== | ||||
| 
 | ||||
| Application performance consists of two parts. First is the framework performance | ||||
| and the second is the application itself. Yii has a pretty low performance impact | ||||
| on your application out of the box and can be fine-tuned further for production | ||||
| environment. As for the application, we'll provide some of the best practices | ||||
| along with examples on how to apply them to Yii. | ||||
| 
 | ||||
| Preparing framework for production | ||||
| ---------------------------------- | ||||
| 
 | ||||
| ### Disabling Debug Mode | ||||
| 
 | ||||
| First thing you should do before deploying your application to production environment | ||||
| is to disable debug mode. A Yii application runs in debug mode if the constant | ||||
| `YII_DEBUG` is defined as `true` in `index.php` so to disable debug the following | ||||
| should be in your `index.php`: | ||||
| 
 | ||||
| ```php | ||||
| defined('YII_DEBUG') or define('YII_DEBUG', false); | ||||
| ``` | ||||
| 
 | ||||
| Debug mode is very useful during development stage, but it would impact performance | ||||
| because some components cause extra burden in debug mode. For example, the message | ||||
| logger may record additional debug information for every message being logged. | ||||
| 
 | ||||
| ### Enabling PHP opcode cache | ||||
| 
 | ||||
| Enabling the PHP opcode cache improves any PHP application performance and lowers | ||||
| memory usage significantly. Yii is no exception. It was tested with | ||||
| [APC PHP extension](http://php.net/manual/en/book.apc.php) that caches | ||||
| and optimizes PHP intermediate code and avoids the time spent in parsing PHP | ||||
| scripts for every incoming request. | ||||
| 
 | ||||
| ### Turning on ActiveRecord database schema caching | ||||
| 
 | ||||
| If the application is using Active Record, we should turn on the schema caching | ||||
| to save the time of parsing database schema. This can be done by setting the | ||||
| `Connection::enableSchemaCache` property to be `true` via application configuration | ||||
| `protected/config/main.php`: | ||||
| 
 | ||||
| ```php | ||||
| return array( | ||||
| 	// ... | ||||
| 	'components' => array( | ||||
| 		// ... | ||||
| 		'db' => array( | ||||
| 			'class' => 'yii\db\Connection', | ||||
| 			'dsn' => 'mysql:host=localhost;dbname=mydatabase', | ||||
| 			'username' => 'root', | ||||
| 			'password' => '', | ||||
| 			'enableSchemaCache' => true, | ||||
| 
 | ||||
| 			// Duration of schema cache. | ||||
| 			// 'schemaCacheDuration' => 3600, | ||||
| 
 | ||||
| 			// Name of the cache component used. Default is 'cache'. | ||||
| 			//'schemaCache' => 'cache', | ||||
| 		), | ||||
| 		'cache' => array( | ||||
| 			'class' => 'yii\caching\FileCache', | ||||
| 		), | ||||
| 	), | ||||
| ); | ||||
| ``` | ||||
| 
 | ||||
| Note that `cache` application component should be configured. | ||||
| 
 | ||||
| ### Combining and Minimizing Assets | ||||
| 
 | ||||
| TBD | ||||
| 
 | ||||
| ### Using better storage for sessions | ||||
| 
 | ||||
| By default PHP uses files to handle sessions. It is OK for development and | ||||
| small projects but when it comes to handling concurrent requests it's better to | ||||
| switch to another storage such as database. You can do so by configuring your | ||||
| application via `protected/config/main.php`: | ||||
| 
 | ||||
| ```php | ||||
| return array( | ||||
| 	// ... | ||||
| 	'components' => array( | ||||
| 		'session' => array( | ||||
| 			'class' => 'yii\web\DbSession', | ||||
| 
 | ||||
| 			// Set the following if want to use DB component other than | ||||
| 			// default 'db'. | ||||
| 			// 'db' => 'mydb', | ||||
| 
 | ||||
| 			// To override default session table set the following | ||||
| 			// 'sessionTable' => 'my_session', | ||||
| 		), | ||||
| 	), | ||||
| ); | ||||
| ``` | ||||
| 
 | ||||
| You can use `CacheSession` to store sessions using cache. Note that some | ||||
| cache storages such as memcached has no guaranteee that session data will not | ||||
| be lost leading to unexpected logouts. | ||||
| 
 | ||||
| Improving application | ||||
| --------------------- | ||||
| 
 | ||||
| ### Using Serverside Caching Techniques | ||||
| 
 | ||||
| As described in the Caching section, Yii provides several caching solutions that | ||||
| may improve the performance of a Web application significantly. If the generation | ||||
| of some data takes long time, we can use the data caching approach to reduce the | ||||
| data generation frequency; If a portion of page remains relatively static, we | ||||
| can use the fragment caching approach to reduce its rendering frequency; | ||||
| If a whole page remains relative static, we can use the page caching approach to | ||||
| save the rendering cost for the whole page. | ||||
| 
 | ||||
| 
 | ||||
| ### Leveraging HTTP to save procesing time and bandwidth | ||||
| 
 | ||||
| TBD | ||||
| 
 | ||||
| ### Database Optimization | ||||
| 
 | ||||
| Fetching data from database is often the main performance bottleneck in | ||||
| a Web application. Although using caching may alleviate the performance hit, | ||||
| it does not fully solve the problem. When the database contains enormous data | ||||
| and the cached data is invalid, fetching the latest data could be prohibitively | ||||
| expensive without proper database and query design. | ||||
| 
 | ||||
| Design index wisely in a database. Indexing can make SELECT queries much faster, | ||||
| but it may slow down INSERT, UPDATE or DELETE queries. | ||||
| 
 | ||||
| For complex queries, it is recommended to create a database view for it instead | ||||
| of issuing the queries inside the PHP code and asking DBMS to parse them repetitively. | ||||
| 
 | ||||
| Do not overuse Active Record. Although Active Record is good at modelling data | ||||
| in an OOP fashion, it actually degrades performance due to the fact that it needs | ||||
| to create one or several objects to represent each row of query result. For data | ||||
| intensive applications, using DAO or database APIs at lower level could be | ||||
| a better choice. | ||||
| 
 | ||||
| Last but not least, use LIMIT in your SELECT queries. This avoids fetching | ||||
| overwhelming data from database and exhausting the memory allocated to PHP. | ||||
| 
 | ||||
| ### Using asArray | ||||
| 
 | ||||
| A good way to save memory and processing time on read-only pages is to use | ||||
| ActiveRecord's `asArray` method. | ||||
| 
 | ||||
| ```php | ||||
| class PostController extends Controller | ||||
| { | ||||
| 	public function actionIndex() | ||||
| 	{ | ||||
| 		$posts = Post::find()->orderBy('id DESC')->limit(100)->asArray()->all(); | ||||
| 		echo $this->render('index', array( | ||||
| 			'posts' => $posts, | ||||
| 		)); | ||||
| 	} | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
| In the view you should access fields of each invidual record from `$posts` as array: | ||||
| 
 | ||||
| ```php | ||||
| foreach($posts as $post) { | ||||
| 	echo $post['title']."<br>"; | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
| Note that you can use array notation even if `asArray` wasn't specified and you're | ||||
| working with AR objects. | ||||
| 
 | ||||
| ### Processing data in background | ||||
| 
 | ||||
| In order to respond to user requests faster you can process heavy parts of the | ||||
| request later if there's no need for immediate response. | ||||
| 
 | ||||
| - Cron jobs + console. | ||||
| - queues + handlers. | ||||
| 
 | ||||
| TBD | ||||
| @ -1,17 +0,0 @@ | ||||
| <?php | ||||
| /** @var $controller \yii\console\controllers\AppController */ | ||||
| $controller = $this; | ||||
| 
 | ||||
| return array( | ||||
| 	'default' => array( | ||||
| 		'index.php' => array( | ||||
| 			'handler' => function($source) use ($controller) { | ||||
| 				return $controller->replaceRelativePath($source, realpath(YII_PATH.'/yii.php'), 'yii'); | ||||
| 			}, | ||||
| 			'permissions' => 0777, | ||||
| 		), | ||||
| 		'protected/runtime' => array( | ||||
| 			'permissions' => 0755, | ||||
| 		), | ||||
| 	), | ||||
| ); | ||||
| @ -1,10 +0,0 @@ | ||||
| <?php | ||||
| define('YII_DEBUG', true); | ||||
| 
 | ||||
| require __DIR__.'/../framework/yii.php'; | ||||
| 
 | ||||
| $config = require dirname(__DIR__).'/protected/config/main.php'; | ||||
| $config['basePath'] = dirname(__DIR__).'/protected'; | ||||
| 
 | ||||
| $app = new \yii\web\Application($config); | ||||
| $app->run(); | ||||
| @ -1,20 +0,0 @@ | ||||
| <?php | ||||
| return array( | ||||
| 	'id' => 'webapp', | ||||
| 	'name' => 'My Web Application', | ||||
| 
 | ||||
| 	'components' => array( | ||||
| 		// uncomment the following to use a MySQL database | ||||
| 		/* | ||||
| 		'db' => array( | ||||
| 			'class' => 'yii\db\Connection', | ||||
| 			'dsn' => 'mysql:host=localhost;dbname=testdrive', | ||||
| 			'username' => 'root', | ||||
| 			'password' => '', | ||||
| 		), | ||||
| 		*/ | ||||
| 		'cache' => array( | ||||
| 			'class' => 'yii\caching\DummyCache', | ||||
| 		), | ||||
| 	), | ||||
| ); | ||||
| @ -1,15 +0,0 @@ | ||||
| <?php | ||||
| use \yii\web\Controller; | ||||
| 
 | ||||
| /** | ||||
|  * SiteController | ||||
|  */ | ||||
| class SiteController extends Controller | ||||
| { | ||||
| 	public function actionIndex() | ||||
| 	{ | ||||
| 		echo $this->render('index', array( | ||||
| 			'name' => 'Qiang', | ||||
| 		)); | ||||
| 	} | ||||
| } | ||||
| @ -1,17 +0,0 @@ | ||||
| <?php use yii\helpers\Html as Html; ?> | ||||
| <!doctype html> | ||||
| <html lang="<?php \Yii::$app->language?>">
 | ||||
| 	<head> | ||||
| 		<meta charset="utf-8" /> | ||||
| 		<title><?php echo Html::encode($this->title)?></title>
 | ||||
| 	</head> | ||||
| 	<body> | ||||
| 		<h1><?php echo Html::encode($this->title)?></h1>
 | ||||
| 		<div class="content"> | ||||
| 			<?php echo $content?> | ||||
| 		</div> | ||||
| 		<div class="footer"> | ||||
| 			<?php echo \Yii::powered()?> | ||||
| 		</div> | ||||
| 	</body> | ||||
| </html> | ||||
| @ -1 +0,0 @@ | ||||
| Hello, <?php echo $name?>!
 | ||||
| @ -0,0 +1,13 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <phpunit bootstrap="./tests/unit/bootstrap.php" | ||||
| 		colors="true" | ||||
| 		convertErrorsToExceptions="true" | ||||
| 		convertNoticesToExceptions="true" | ||||
| 		convertWarningsToExceptions="true" | ||||
| 		stopOnFailure="false"> | ||||
| 		<testsuites> | ||||
| 			<testsuite name="Yii Test Suite"> | ||||
| 				<directory>./tests/unit</directory> | ||||
| 			</testsuite> | ||||
| 		</testsuites> | ||||
| </phpunit> | ||||
| @ -1,66 +1,40 @@ | ||||
| Yii 2 Web Programming Framework | ||||
| =============================== | ||||
| Yii 2.0 Public Preview | ||||
| ====================== | ||||
| 
 | ||||
| Thank you for choosing Yii 2 — a high-performance component-based PHP framework. | ||||
| Thank you for choosing Yii - a high-performance component-based PHP framework. | ||||
| 
 | ||||
| If you are looking for a production-ready PHP framework, please use | ||||
| [Yii v1.1](https://github.com/yiisoft/yii). | ||||
| 
 | ||||
| Yii 2.0 is still under heavy development. We may make significant changes | ||||
| without prior notices. **Yii 2.0 is not ready for production use yet.** | ||||
| 
 | ||||
| INSTALLATION | ||||
| ------------ | ||||
| 
 | ||||
| Please make sure the release file is unpacked under a Web-accessible | ||||
| directory. You shall see the following files and directories: | ||||
| DIRECTORY STRUCTURE | ||||
| ------------------- | ||||
| 
 | ||||
|       demos/               demos | ||||
|       apps/                ready-to-use Web apps built on Yii 2 | ||||
|           bootstrap/       a simple app supporting user login and contact page | ||||
|       build/               internally used build tools | ||||
|       docs/                documentation | ||||
|       framework/           framework source files | ||||
|       requirements/        requirement checker | ||||
|       changelog.md         describing changes in every Yii release | ||||
|       license.md           license of Yii | ||||
|       readme.md            this file | ||||
|       upgrade.md           upgrading instructions | ||||
|       tests/               tests of the core framework code | ||||
| 
 | ||||
| 
 | ||||
| REQUIREMENTS | ||||
| ------------ | ||||
| 
 | ||||
| The minimum requirement by Yii is that your Web server supports | ||||
| PHP 5.3.8 or above. Yii has been tested with Apache HTTP server | ||||
| on Windows and Linux operating systems. | ||||
| 
 | ||||
| Please access the following URL to check if your Web server reaches | ||||
| the requirements by Yii, assuming "YiiPath" is where Yii is installed: | ||||
| 
 | ||||
|       http://hostname/YiiPath/requirements/index.php | ||||
| 
 | ||||
| 
 | ||||
| QUICK START | ||||
| ----------- | ||||
| 
 | ||||
| Yii comes with a command line tool called "yiic" that can create | ||||
| a skeleton Yii application for you to start with. | ||||
| 
 | ||||
| On a command line, type in the following commands: | ||||
| 
 | ||||
|    for Linux | ||||
|         $ cd YiiPath/framework | ||||
|         $ ./yiic webapp ../testdrive | ||||
| 
 | ||||
|    for Windows | ||||
|         cd YiiPath\framework | ||||
|         yiic webapp ..\testdrive | ||||
| 
 | ||||
| The new Yii application will be created at "YiiPath/testdrive". | ||||
| You can access it with the following URL: | ||||
| 
 | ||||
|         http://hostname/YiiPath/testdrive/index.php | ||||
| 
 | ||||
| The minimum requirement by Yii is that your Web server supports PHP 5.3.?. | ||||
| 
 | ||||
| WHAT's NEXT | ||||
| ----------- | ||||
| 
 | ||||
| Please visit the project website for tutorials, class reference | ||||
| and join discussions with other Yii users. | ||||
| HOW TO PARTICIPATE | ||||
| ------------------ | ||||
| 
 | ||||
| You are welcome to participate in Yii 2 development in the following ways: | ||||
| 
 | ||||
| * [Report issues](https://github.com/yiisoft/yii2/issues) | ||||
| * [Give us feedback or start a design discussion](http://www.yiiframework.com/forum/index.php/forum/42-design-discussions-for-yii-20/) | ||||
| * Fix issues, develop features, write/polish documentation | ||||
|     - Before you start, please adopt an existing issue (labelled with "ready for adoption") or start a new one to avoid duplicated efforts. | ||||
|     - Please submit a merge request after you finish development. | ||||
| 
 | ||||
| The Yii Developer Team | ||||
| http://www.yiiframework.com | ||||
| @ -0,0 +1,12 @@ | ||||
| <?php | ||||
| namespace yiiunit\framework\helpers; | ||||
| use \yii\helpers\VarDumper; | ||||
| 
 | ||||
| class VarDumperTest extends \yii\test\TestCase | ||||
| { | ||||
| 	public function testDumpObject() | ||||
| 	{ | ||||
| 		$obj = new \StdClass(); | ||||
| 		VarDumper::dump($obj); | ||||
| 	} | ||||
| } | ||||
					Loading…
					
					
				
		Reference in new issue