mirror of
https://github.com/yiisoft/yii2.git
synced 2025-08-06 14:19:23 +08:00
193 lines
9.2 KiB
Markdown
193 lines
9.2 KiB
Markdown
Trabajar con código de terceros
|
|
===============================
|
|
|
|
De tiempo en tiempo, puede necesitar usar algún código de terceros en sus aplicaciones Yii. O puedes querer
|
|
utilizar Yii como una librería en otros sistemas de terceros. En esta sección, te enseñaremos cómo conseguir estos objetivos.
|
|
|
|
|
|
Utilizar librerías de terceros en Yii <span id="using-libs-in-yii"></span>
|
|
-------------------------------------
|
|
|
|
Para usar una librería en una aplicación Yii, primeramente debes de asegurarte que las clases en la librería
|
|
son incluidas adecuadamente o pueden ser cargadas de forma automática.
|
|
|
|
### Usando Paquetes de Composer <span id="using-composer-packages"></span>
|
|
|
|
Muchas librerías de terceros son liberadas en términos de paquetes [Composer](https://getcomposer.org/).
|
|
Puedes instalar este tipo de librerías siguiendo dos sencillos pasos:
|
|
|
|
1. modificar el fichero `composer.json` de tu aplicación y especificar que paquetes Composer quieres instalar.
|
|
2. ejecuta `composer install` para instalar los paquetes especificados.
|
|
|
|
Las clases en los paquetes Composer instalados pueden ser autocargados usando el cargador automatizado de Composer autoloader.
|
|
Asegúrate que el fichero [script de entrada](structure-entry-scripts.md) de tu aplicación contiene las siguientes líneas
|
|
para instalar el cargador automático de Composer:
|
|
|
|
```php
|
|
// instalar el cargador automático de Composer
|
|
require __DIR__ . '/../vendor/autoload.php';
|
|
|
|
// incluir rl fichero de la clase Yii
|
|
require __DIR__ . '/../vendor/yiisoft/yii2/Yii.php';
|
|
```
|
|
|
|
### Usando librerías Descargadas <span id="using-downloaded-libs"></span>
|
|
|
|
Si la librería no es liberada como un paquete de Composer, debes de seguir sus instrucciones de instalación para instalarla.
|
|
En muchos casos, puedes necesitar descargar manualmente el fichero de la versión y desempaquetarlo en el directorio `BasePath/vendor`,
|
|
donde `BasePath` representa el [camino base (base path)](structure-applications.md#basePath) de tu aplicación.
|
|
|
|
Si la librería lleva su propio cargador automático (autoloader), puedes instalarlo en [script de entrada](structure-entry-scripts.md) de tu aplicación.
|
|
Es recomendable que la instalación se termine antes de incluir el fichero `Yii.php` de forma que el cargador automático tenga precedencia al cargar
|
|
de forma automática las clases.
|
|
|
|
Si la librería no provee un cargador automático de clases, pero la denominación de sus clases sigue el [PSR-4](https://www.php-fig.org/psr/psr-4/),
|
|
puedes usar el cargador automático de Yii para cargar de forma automática las clases. Todo lo que necesitas
|
|
es declarar un [alias raíz](concept-aliases.md#defining-aliases) para cada espacio de nombres (namespace) raiz usado en sus clases. Por ejemplo,
|
|
asume que has instalado una librería en el directorio `vendor/foo/bar`, y que las clases de la librería están bajo el espacio de nombres raiz `xyz`.
|
|
Puedes incluir el siguiente código en la configuración de tu aplicación:
|
|
|
|
```php
|
|
[
|
|
'aliases' => [
|
|
'@xyz' => '@vendor/foo/bar',
|
|
],
|
|
]
|
|
```
|
|
|
|
Si ninguno de lo anterior es el caso, estaría bien que la librería dependa del camino de inclusión (include path) de configuración de PHP
|
|
para localizar correctamente e incluir los ficheros de las clases. Simplemente siguiendo estas instrucciones de cómo configurar el camino de inclusión de PHP.
|
|
|
|
En el caso más grave en el que la librería necesite incluir cada uno de sus ficheros de clases, puedes usar el siguiente método
|
|
para incluir las clases según se pidan:
|
|
|
|
* Identificar que clases contiene la librería.
|
|
* Listar las clases y el camino a los archivos correspondientes en `Yii::$classMap` en el script de entrada [script de entrada](structure-entry-scripts.md)
|
|
de la aplicación. Por ejemplo,
|
|
```php
|
|
Yii::$classMap['Class1'] = 'path/to/Class1.php';
|
|
Yii::$classMap['Class2'] = 'path/to/Class2.php';
|
|
```
|
|
|
|
|
|
Utilizar Yii en Sistemas de Terceros <span id="using-yii-in-others"></span>
|
|
------------------------------------
|
|
|
|
Debido a que Yii provee muchas posibilidades excelentes, a veces puedes querer usar alguna de sus características para permitir
|
|
el desarrollo o mejora de sistemas de terceros, como es WordPress, Joomla, o aplicaciones desarrolladas usando otros frameworks de PHP.
|
|
Por ejemplo, puedes querer utilizar la clase [[yii\helpers\ArrayHelper]] o usar la característica [Active Record](db-active-record.md)
|
|
en un sistema de terceros. Para lograr este objetivo, principalmente necesitas realizar dos pasos:
|
|
instalar Yii , e iniciar Yii.
|
|
|
|
Si el sistema de terceros usa Composer para manejar sus dependencias, simplemente ejecuta estos comandos
|
|
para instalar Yii:
|
|
|
|
composer global require "fxp/composer-asset-plugin:^1.4.1"
|
|
composer require yiisoft/yii2
|
|
composer install
|
|
|
|
El primer comando instala el [composer asset plugin](https://github.com/fxpio/composer-asset-plugin),
|
|
que permite administrar paquetes bower y npm a través de Composer. Incluso si sólo quieres utilizar la capa de base de datos
|
|
u otra característica de Yii no relacionada a assets, requiere que instales el paquete composer de Yii.
|
|
|
|
Si quieres utilizar la [publicación de Assets de Yii](structure-assets.md) deberías agregar también la siguiente configuración
|
|
a la sección `extra` de tu `composer.json`:
|
|
|
|
```json
|
|
{
|
|
...
|
|
"extra": {
|
|
"asset-installer-paths": {
|
|
"npm-asset-library": "vendor/npm",
|
|
"bower-asset-library": "vendor/bower"
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
Visita también la [sección de cómo instalar Yii](start-installation.md#installing-via-composer) para más información
|
|
sobre Composer y sobre cómo solucionar posibles problemas que surjan durante la instalación.
|
|
|
|
En otro caso, puedes [descargar](https://www.yiiframework.com/download/) el archivo de la edición de Yii
|
|
y desempaquetarla en el directorio `BasePath/vendor`.
|
|
|
|
Después, debes de modificar el script de entrada de sistema de terceros para incluir el siguiente código al principio:
|
|
|
|
```php
|
|
require __DIR__ . '/../vendor/yiisoft/yii2/Yii.php';
|
|
|
|
$yiiConfig = require __DIR__ . '/../config/yii/web.php';
|
|
new yii\web\Application($yiiConfig); // No ejecutes run() aquí
|
|
```
|
|
|
|
Como puedes ver, el código anterior es muy similar al que puedes ver en [script de entrada](structure-entry-scripts.md)
|
|
de una aplicación típica. La única diferencia es que después de que se crea la instancia de la aplicación, el método `run()` no es llamado.
|
|
Esto es así porque llamando a `run()`, Yii se haría cargo del control del flujo de trabajo del manejo de las peticiones,
|
|
lo cual no es necesario en este caso por estar ya es manejado por la aplicación existente.
|
|
|
|
Como en una aplicación Yii, debes configurar la instancia de la aplicación basándose en el entorno que se está
|
|
ejecutando del sistema de terceros. Por ejemplo, para usar la característica [Active Record](db-active-record.md), necesitas configurar
|
|
el [componente de la aplicación](structure-application-components.md) `db` con los parámetros de la conexión a la BD del sistema de terceros.
|
|
|
|
Ahora puedes usar muchas características provistas por Yii. Por ejemplo, puedes crear clases Active Record y usarlas
|
|
para trabajar con bases de datos.
|
|
|
|
|
|
Utilizar Yii 2 con Yii 1 <span id="using-both-yii2-yii1"></span>
|
|
------------------------
|
|
|
|
Si estaba usando Yii 1 previamente, es como si tuvieras una aplicación Yii 1 funcionando. En vez de reescribir
|
|
toda la aplicación en Yii 2, puedes solamente mejorarla usando alguna de las características sólo disponibles en Yii 2.
|
|
Esto se puede lograr tal y como se describe abajo.
|
|
|
|
> Note: Yii 2 requiere PHP 5.4 o superior. Debes de estar seguro que tanto tu servidor como la aplicación
|
|
> existente lo soportan.
|
|
|
|
Primero, instala Yii 2 en tu aplicación siguiendo las instrucciones descritas en la [última subsección](#using-yii-in-others).
|
|
|
|
Segundo, modifica el script de entrada de la aplicación como sigue,
|
|
|
|
```php
|
|
// incluir la clase Yii personalizada descrita debajo
|
|
require __DIR__ . '/../components/Yii.php';
|
|
|
|
// configuración para la aplicación Yii 2
|
|
$yii2Config = require __DIR__ . '/../config/yii2/web.php';
|
|
new yii\web\Application($yii2Config); // No llamar a run()
|
|
|
|
// configuración para la aplicación Yii 1
|
|
$yii1Config = require __DIR__ . '/../config/yii1/main.php';
|
|
Yii::createWebApplication($yii1Config)->run();
|
|
```
|
|
|
|
Debido a que ambos Yii 1 y Yii 2 tiene la clase `Yii` , debes crear una versión personalizada para combinarlas.
|
|
El código anterior incluye el fichero con la clase `Yii` personalizada, que tiene que ser creada como sigue.
|
|
|
|
```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
|
|
}
|
|
|
|
Yii::$classMap = include($yii2path . '/classes.php');
|
|
// registrar el autoloader de Yii 2 vía Yii 1
|
|
Yii::registerAutoloader(['Yii', 'autoload']);
|
|
// crear el contenedor de inyección de dependencia
|
|
Yii::$container = new yii\di\Container;
|
|
```
|
|
|
|
¡Esto es todo!. Ahora, en cualquier parte de tu código, puedes usar `Yii::$app` para acceder a la instancia de la aplicación de Yii 2,
|
|
mientras `Yii::app()` proporciona la instancia de la aplicación de Yii 1 :
|
|
|
|
```php
|
|
echo get_class(Yii::app()); // genera 'CWebApplication'
|
|
echo get_class(Yii::$app); // genera 'yii\web\Application'
|
|
```
|
|
|