mirror of
				https://github.com/yiisoft/yii2.git
				synced 2025-11-03 22:32:40 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			180 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			180 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
Working with Third-Party Code
 | 
						|
=============================
 | 
						|
 | 
						|
From time to time, you may need to use some third-party code in your Yii applications. Or you may want to
 | 
						|
use Yii as a library in some third-party systems. In this section, we will show how to achieve these goals.
 | 
						|
 | 
						|
 | 
						|
Using Third-Party Libraries in Yii <span id="using-libs-in-yii"></span>
 | 
						|
----------------------------------
 | 
						|
 | 
						|
To use a third-party library in a Yii application, you mainly need to make sure the classes in the library
 | 
						|
are properly included or can be autoloaded.
 | 
						|
 | 
						|
### Using Composer Packages <span id="using-composer-packages"></span>
 | 
						|
 | 
						|
Many third-party libraries are released in terms of [Composer](https://getcomposer.org/) packages.
 | 
						|
You can install such libraries by taking the following two simple steps:
 | 
						|
 | 
						|
1. modify the `composer.json` file of your application and specify which Composer packages you want to install.
 | 
						|
2. run `composer install` to install the specified packages.
 | 
						|
 | 
						|
The classes in the installed Composer packages can be autoloaded using the Composer autoloader. Make sure
 | 
						|
the [entry script](structure-entry-scripts.md) of your application contains the following lines to install
 | 
						|
the Composer autoloader:
 | 
						|
 | 
						|
```php
 | 
						|
// install Composer autoloader
 | 
						|
require __DIR__ . '/../vendor/autoload.php';
 | 
						|
 | 
						|
// include Yii class file
 | 
						|
require __DIR__ . '/../vendor/yiisoft/yii2/Yii.php';
 | 
						|
```
 | 
						|
 | 
						|
### Using Downloaded Libraries <span id="using-downloaded-libs"></span>
 | 
						|
 | 
						|
If a library is not released as a Composer package, you should follow its installation instructions to install it.
 | 
						|
In most cases, you will need to download a release file manually and unpack it in the `BasePath/vendor` directory,
 | 
						|
where `BasePath` represents the [base path](structure-applications.md#basePath) of your application.
 | 
						|
 | 
						|
If a library carries its own class autoloader, you may install it in the [entry script](structure-entry-scripts.md)
 | 
						|
of your application. It is recommended the installation is done before you include the `Yii.php` file so that
 | 
						|
the Yii class autoloader can take precedence in autoloading classes.
 | 
						|
 | 
						|
If a library does not provide a class autoloader, but its class naming follows [PSR-4](http://www.php-fig.org/psr/psr-4/),
 | 
						|
you may use the Yii class autoloader to autoload the classes. All you need to do is just to declare a
 | 
						|
[root alias](concept-aliases.md#defining-aliases) for each root namespace used in its classes. For example,
 | 
						|
assume you have installed a library in the directory `vendor/foo/bar`, and the library classes are under
 | 
						|
the `xyz` root namespace. You can include the following code in your application configuration:
 | 
						|
 | 
						|
```php
 | 
						|
[
 | 
						|
    'aliases' => [
 | 
						|
        '@xyz' => '@vendor/foo/bar',
 | 
						|
    ],
 | 
						|
]
 | 
						|
```
 | 
						|
 | 
						|
If neither of the above is the case, it is likely that the library relies on PHP include path configuration to
 | 
						|
correctly locate and include class files. Simply follow its instruction on how to configure the PHP include path.
 | 
						|
 | 
						|
In the worst case when the library requires explicitly including every class file, you can use the following method
 | 
						|
to include the classes on demand:
 | 
						|
 | 
						|
* Identify which classes the library contains.
 | 
						|
* List the classes and the corresponding file paths in `Yii::$classMap` in the [entry script](structure-entry-scripts.md)
 | 
						|
  of the application. For example,
 | 
						|
```php
 | 
						|
Yii::$classMap['Class1'] = 'path/to/Class1.php';
 | 
						|
Yii::$classMap['Class2'] = 'path/to/Class2.php';
 | 
						|
```
 | 
						|
 | 
						|
 | 
						|
Using Yii in Third-Party Systems <span id="using-yii-in-others"></span>
 | 
						|
--------------------------------
 | 
						|
 | 
						|
Because Yii provides many excellent features, sometimes you may want to use some of its features to support
 | 
						|
developing or enhancing 3rd-party systems, such as WordPress, Joomla, or applications developed using other PHP
 | 
						|
frameworks. For example, you may want to use the [[yii\helpers\ArrayHelper]] class or use the
 | 
						|
[Active Record](db-active-record.md) feature in a third-party system. To achieve this goal, you mainly need to
 | 
						|
take two steps: install Yii, and bootstrap Yii.
 | 
						|
 | 
						|
If the third-party system uses Composer to manage its dependencies, run the following command to add Yii
 | 
						|
to the project requirements:
 | 
						|
 | 
						|
```bash
 | 
						|
composer require yiisoft/yii2
 | 
						|
```
 | 
						|
 | 
						|
In case you would like to use only the database abstraction layer or other non-asset related features of Yii,
 | 
						|
you should require a special composer package that prevent Bower and NPM packages installation. See 
 | 
						|
[cebe/assetfree-yii2](https://github.com/cebe/assetfree-yii2) for details.
 | 
						|
 | 
						|
See also the general [section about installing Yii](start-installation.md#installing-via-composer) for more information
 | 
						|
on Composer and solution to possible issues popping up during the installation.
 | 
						|
 | 
						|
Otherwise, you can [download](http://www.yiiframework.com/download/) the Yii release file and unpack it in
 | 
						|
the `BasePath/vendor` directory.
 | 
						|
 | 
						|
Next, you should modify the entry script of the 3rd-party system by including the following code at the beginning:
 | 
						|
 | 
						|
```php
 | 
						|
require __DIR__ . '/../vendor/yiisoft/yii2/Yii.php';
 | 
						|
 | 
						|
$yiiConfig = require __DIR__ . '/../config/yii/web.php';
 | 
						|
new yii\web\Application($yiiConfig); // Do NOT call run() here
 | 
						|
```
 | 
						|
 | 
						|
As you can see, the code above is very similar to that in the [entry script](structure-entry-scripts.md) of
 | 
						|
a typical Yii application. The only difference is that after the application instance is created, the `run()` method
 | 
						|
is not called. This is because by calling `run()`, Yii will take over the control of the request handling workflow
 | 
						|
which is not needed in this case and already handled by the existing application.
 | 
						|
 | 
						|
Like in a Yii application, you should configure the application instance based on the environment running
 | 
						|
the third-party system. For example, to use the [Active Record](db-active-record.md) feature, you need to configure
 | 
						|
the `db` [application component](structure-application-components.md) with the DB connection setting used by the third-party system.
 | 
						|
 | 
						|
Now you can use most features provided by Yii. For example, you can create Active Record classes and use them
 | 
						|
to work with databases.
 | 
						|
 | 
						|
 | 
						|
Using Yii 2 with Yii 1 <span id="using-both-yii2-yii1"></span>
 | 
						|
----------------------
 | 
						|
 | 
						|
If you were using Yii 1 previously, it is likely you have a running Yii 1 application. Instead of rewriting
 | 
						|
the whole application in Yii 2, you may just want to enhance it using some of the features only available in Yii 2.
 | 
						|
This can be achieved as described below.
 | 
						|
 | 
						|
> Note: Yii 2 requires PHP 5.4 or above. You should make sure that both your server and the existing application
 | 
						|
> support this.
 | 
						|
 | 
						|
First, install Yii 2 in your existing application by following the instructions given in the [last subsection](#using-yii-in-others).
 | 
						|
 | 
						|
Second, modify the entry script of the application as follows,
 | 
						|
 | 
						|
```php
 | 
						|
// include the customized Yii class described below
 | 
						|
require __DIR__ . '/../components/Yii.php';
 | 
						|
 | 
						|
// configuration for Yii 2 application
 | 
						|
$yii2Config = require __DIR__ . '/../config/yii2/web.php';
 | 
						|
new yii\web\Application($yii2Config); // Do NOT call run(), yii2 app is only used as service locator
 | 
						|
 | 
						|
// configuration for Yii 1 application
 | 
						|
$yii1Config = require __DIR__ . '/../config/yii1/main.php';
 | 
						|
Yii::createWebApplication($yii1Config)->run();
 | 
						|
```
 | 
						|
 | 
						|
Because both Yii 1 and Yii 2 have the `Yii` class, you should create a customized version to combine them.
 | 
						|
The above code includes the customized `Yii` class file, which can be created as follows.
 | 
						|
 | 
						|
```php
 | 
						|
$yii2path = '/path/to/yii2';
 | 
						|
require $yii2path . '/BaseYii.php'; // Yii 2.x
 | 
						|
 | 
						|
$yii1path = '/path/to/yii1';
 | 
						|
require $yii1path . '/YiiBase.php'; // Yii 1.x
 | 
						|
 | 
						|
class Yii extends \yii\BaseYii
 | 
						|
{
 | 
						|
    // copy-paste the code from YiiBase (1.x) here
 | 
						|
}
 | 
						|
 | 
						|
spl_autoload_unregister(array('YiiBase','autoload'));
 | 
						|
spl_autoload_register(array('Yii','autoload'));
 | 
						|
 | 
						|
Yii::$classMap = include($yii2path . '/classes.php');
 | 
						|
// register Yii 2 autoloader via Yii 1
 | 
						|
Yii::registerAutoloader(['yii\BaseYii', 'autoload']);
 | 
						|
// create the dependency injection container
 | 
						|
Yii::$container = new yii\di\Container;
 | 
						|
```
 | 
						|
 | 
						|
That's all! Now in any part of your code, you can use `Yii::$app` to access the Yii 2 application instance, while
 | 
						|
`Yii::app()` will give you the Yii 1 application instance:
 | 
						|
 | 
						|
```php
 | 
						|
echo get_class(Yii::app()); // outputs 'CWebApplication'
 | 
						|
echo get_class(Yii::$app);  // outputs 'yii\web\Application'
 | 
						|
```
 |