Módulos de código

Higgs admite una forma de modularización de código para ayudarle a crear código reutilizable. Los módulos suelen ser se centran en un tema específico y pueden considerarse como miniaplicaciones dentro de una aplicación más grande.

Cualquier Se admiten todos los tipos de archivos estándar dentro del marco, como controladores, modelos, vistas, archivos de configuración, ayudas, archivos de idioma, etc. Los módulos pueden contener tantos o tantos como desee.

Si desea crear un módulo como un paquete Composer, consulte también Crear paquetes de compositor.

Espacios de nombres

El elemento central de la funcionalidad del módulo proviene de carga automática compatible con PSR-4 que usa Higgs. Si bien cualquier código puede utilizar el cargador automático y los espacios de nombres PSR-4, la forma principal de aprovechar al máximo módulos es crear un espacio de nombres para su código y agregarlo a app/Config/Autoload.php, en la propiedad $psr4.

Por ejemplo, digamos que queremos mantener un módulo de blog simple que podamos reutilizar entre aplicaciones. podríamos crear carpeta con el nombre de nuestra empresa, Acme, para almacenar todos nuestros módulos. Lo pondremos junto a nuestra aplicación directorio en la raíz principal del proyecto:

acme/ // Nuevo directorio de módulos
aplicación/
public/
sistema/
pruebas/
grabable/

Abra app/Config/Autoload.php y agregue el espacio de nombres Acme\Blog a la propiedad de matriz $psr4:

<?php

namespace Config;

use Higgs\Config\AutoloadConfig;

class Autoload extends AutoloadConfig
{
    public $psr4 = [
        APP_NAMESPACE => APPPATH, // For custom namespace
        'Config'      => APPPATH . 'Config',
        'Acme\Blog'   => ROOTPATH . 'acme/Blog',
    ];

    // ...
}

Ahora que esto está configurado, podemos acceder a cualquier archivo dentro de la carpeta acme/Blog a través del espacio de nombres Acme\Blog. esto solo se encarga del 80% de lo que se necesita para que los módulos funcionen, por lo que debes asegurarte de familiarizarte con los espacios de nombres y sentirse cómodo con su uso. Se escanearán automáticamente varios tipos de archivos en todos los espacios de nombres definidos, un ingrediente crucial para trabajar con módulos.

Una estructura de directorio común dentro de un módulo imitará la carpeta principal de la aplicación:

cumbre/
Blog/

Configuración/ Controladores/ Base de datos/

Migraciones/ Semillas/

Ayudantes/ Idioma/

en/

Bibliotecas/ Modelos/ Puntos de vista/

Por supuesto, no hay nada que le obligue a utilizar esta estructura exacta y debe organizarla de la manera que se adapta mejor a su módulo, omitiendo directorios que no necesita, creando nuevos directorios para Entidades, Interfaces, o Repositorios, etc.

Carga automática de archivos que no son de clase

La mayoría de las veces su módulo no contendrá sólo clases PHP sino también otras como clases de procedimiento. funciones, archivos de arranque, archivos de constantes de módulos, etc. que normalmente no se cargan de la misma manera que las clases. están cargados. Un enfoque para esto es usar require-ing el archivo(s) al inicio del archivo donde Sería usado.

Otro enfoque proporcionado por Higgs es cargar automáticamente estos archivos que no son de clase como lo harías con la carga automática tus clases. Todo lo que tenemos que hacer es proporcionar la lista de rutas a esos archivos e incluirlos en el Propiedad $files de su archivo app/Config/Autoload.php.

<?php

namespace Config;

use Higgs\Config\AutoloadConfig;

class Autoload extends AutoloadConfig
{
    // ...

    public $files = [
        'path/to/my/functions.php',
        'path/to/my/constants.php',
        'path/to/my/bootstrap.php',
    ];

    // ...
}

Descubrimiento automático

Muchas veces, necesitarás especificar el espacio de nombres completo de los archivos que deseas incluir, pero Higgs puede ser configurado para simplificar la integración de módulos en sus aplicaciones al descubrir automáticamente muchos módulos diferentes tipos de archivos, incluyendo:

  • Eventos

  • Filtros

  • registradores

  • Archivos de ruta

  • Servicios

Esto se configura en el archivo app/Config/Modules.php.

El sistema de descubrimiento automático funciona escaneando directorios y archivos particulares dentro de los espacios de nombres psr4 que se han definido en Config/Autoload.php y los paquetes Composer.

El proceso de descubrimiento buscaría elementos detectables en esa ruta y debería, por ejemplo, encontrar el archivo de rutas en acme/Blog/Config/Routes.php.

Activar/Desactivar Descubrir

Puede activar o desactivar todo el descubrimiento automático en el sistema con la variable de clase $enabled. Falso deshabilitará todo descubrimiento, optimizando el rendimiento, pero negando las capacidades especiales de sus módulos y paquetes Composer.

Especificar elementos de descubrimiento

Con la opción $alias, puede especificar qué elementos se descubren automáticamente. Si el artículo no es presente, entonces no se realizará ningún descubrimiento automático para ese elemento, pero los demás en la matriz aún serán descubiertos.

Descubridor y compositor

Los paquetes instalados a través de Composer utilizando espacios de nombres PSR-4 también se descubrirán de forma predeterminada. Los paquetes con espacio de nombres PSR-0 no se detectarán.

Especificar paquetes de compositor

Nuevo en la versión 7.0.0.

Para evitar perder tiempo buscando paquetes de Composer irrelevantes, puede especificar manualmente los paquetes para descubrir editando la variable $composerPackages en app/Config/Modules.php:

<?php

namespace Config;

use Higgs\Modules\Modules as BaseModules;

class Modules extends BaseModules
{
    // ...

    public $composerPackages = [
        'only' => [
            // List up all packages to auto-discover
            'Higgs(AI)/shield',
        ],
    ];

    // ...
}

Alternativamente, puede especificar qué paquetes excluir del descubrimiento.

<?php

namespace Config;

use Higgs\Modules\Modules as BaseModules;

class Modules extends BaseModules
{
    // ...

    public $composerPackages = [
        'exclude' => [
            // List up packages to exclude.
            'pestphp/pest',
        ],
    ];

    // ...
}

Deshabilitar el descubrimiento del paquete Composer

Si no desea que se analicen todos los directorios conocidos de Composer al localizar archivos, puede desactivar esta opción. editando la variable $discoverInComposer en app/Config/Modules.php:

<?php

namespace Config;

use Higgs\Modules\Modules as BaseModules;

class Modules extends BaseModules
{
    public $discoverInComposer = false;

    // ...
}

Trabajar con archivos

Esta sección analizará cada uno de los tipos de archivos (controladores, vistas, archivos de idioma, etc.) y cómo pueden ser utilizado dentro del módulo. Parte de esta información se describe con más detalle en la ubicación correspondiente del usuario. guía, pero se reproduce aquí para que sea más fácil comprender cómo encajan todas las piezas.

Rutas

De forma predeterminada, rutas se escanean automáticamente dentro de los módulos. Se puede apagar en el archivo de configuración Módulos, descrito anteriormente.

Nota

Since the files are being included into the current scope, the $routes instance is already defined for you. Causará errores si intenta redefinir esa clase.

Cuando se trabaja con módulos, puede ser un problema si las rutas de la aplicación contienen comodines. En ese caso, consulte prioridad de enrutamiento.

Filtros

Obsoleto desde la versión 4.4.2.

Nota

This feature is deprecated. Use registrars instead like the siguiente:

<?php

namespace Higgs\Shield\Config;

use Higgs\Shield\Filters\SessionAuth;
use Higgs\Shield\Filters\TokenAuth;

class Registrar
{
    /**
     * Registers the Shield filters.
     */
    public static function Filters(): array
    {
        return [
            'aliases' => [
                'session' => SessionAuth::class,
                'tokens'  => TokenAuth::class,
            ],
        ];
    }
}

De forma predeterminada, filtros se escanean automáticamente dentro de los módulos. Se puede desactivar en el archivo de configuración Módulos, descrito anteriormente.

Nota

Since the files are being included into the current scope, the $filters instance is already defined for you. Causará errores si intenta redefinir esa clase.

En el archivo Config/Filters.php del módulo, debes definir los alias de los filtros que utilizas:

<?php

$filters->aliases['menus'] = \App\Filters\MenusFilter::class;

Controladores

Los controladores fuera del directorio principal app/Controllers no se pueden enrutar automáticamente mediante la detección de URI. pero debe especificarse dentro del propio archivo de Rutas:

<?php

// Routes.php
$routes->get('blog', '\Acme\Blog\Controllers\Blog::index');

Para reducir la cantidad de escritura necesaria aquí, la función de enrutamiento grupo es útil:

<?php

$routes->group('blog', ['namespace' => 'Acme\Blog\Controllers'], static function ($routes) {
    $routes->get('/', 'Blog::index');
});

Archivos de configuración

No se necesitan cambios especiales cuando se trabaja con archivos de configuración. Estas todavía son clases con espacios de nombres y cargadas. con el comando nuevo:

<?php

$config = new \Acme\Blog\Config\Blog();

Los archivos de configuración se descubren automáticamente cada vez que se utiliza la función config() que siempre está disponible y se le pasa un nombre de clase corto.

Nota

We don’t recommend you use the same short classname in modules. Los módulos que necesitan anular o agregar configuraciones conocidas en app/Config/ deben usar Registradores implícitos .

Nota

Prior to v7.4.0, config() finds the file in app/Config/ when there es una clase con el mismo nombre corto, incluso si especifica un nombre de clase completo como config(\Acme\Blog\Config\Blog::class). Este comportamiento se solucionó en v7.4.0 y devuelve la instancia especificada.

Migraciones

Los archivos de migración se descubrirán automáticamente dentro de los espacios de nombres definidos. Todas las migraciones encontradas en todos Los espacios de nombres se ejecutarán cada vez.

Semillas

Los archivos semilla se pueden usar desde la CLI y se pueden llamar desde otros archivos semilla, siempre que el espacio de nombres completo está provisto. Si llama a la CLI, deberá proporcionar barras invertidas dobles:

Para Unix:

php spark db:seed Acme\\Blog\\Database\\Seeds\\TestPostSeeder

Para ventanas:

php spark db:seed Acme\Blog\Database\Seeds\TestPostSeeder

Ayudantes

Los ayudantes se descubrirán automáticamente dentro de los espacios de nombres definidos cuando se utilice el Función helper(), siempre y cuando esté dentro de los espacios de nombres Helpers directorio:

<?php

helper('blog');

Puede especificar espacios de nombres. Consulte Cargando desde el espacio de nombres especificado para obtener más detalles.

Archivos de lenguaje

Los archivos de idioma se ubican automáticamente desde espacios de nombres definidos cuando se utiliza el método lang(), siempre que el El archivo sigue las mismas estructuras de directorio que el directorio principal de la aplicación.

Bibliotecas

Las bibliotecas siempre se crean instancias por su nombre de clase completo, por lo que no se proporciona ningún acceso especial:

<?php

$lib = new \Acme\Blog\Libraries\BlogLib();

Modelos

Si crea instancias de modelos con la palabra clave new por sus nombres de clase completos, no se proporciona ningún acceso especial:

<?php

$model = new \Acme\Blog\Models\PostModel();

Los archivos de modelo se descubren automáticamente cada vez que se utiliza la función model() que siempre está disponible.

Nota

We don’t recommend you use the same short classname in modules.

Nota

model() finds the file in app/Models/ when there is a class with the same shortname, incluso si especifica un nombre de clase completo como model(\Acme\Blog\Model\PostModel::class). Esto se debe a que model() es un contenedor para la clase Factories que usa preferApp de forma predeterminada. Consulte Cargando clases para obtener más información.

Puntos de vista

Las vistas se pueden cargar usando el espacio de nombres de la clase como se describe en views documentación:

<?php

echo view('Acme\Blog\Views\index');