php - tutorial - zend framework download
Cómo fusionar los directorios del módulo Zend Framework 2 (3)
Algunos módulos zf2 tienen directorios públicos para la distribución de recursos como js / css / images. ¿Cuál es la mejor práctica para hacer que estos recursos estén disponibles para la aplicación?
Me gustaría que estos recursos estuvieran disponibles automáticamente a través de http://mysite.com/[moduleName]/
. Por ejemplo,
root/public/js/sitescript.js
-> http://mysite.com/js/sitescript.js
root/module/mymodule/public/js/modulescript.js
-> http://mysite.com/mymodule/js/modulescript.js
root/vendor/vendormodule/public/js/vendorscript.js
-> http://mysite.com/vendormodule/js/vendorscript.js
¿Deben copiarse estos recursos en el directorio raíz / público? La copia manual será dolorosa, y dudo que un proceso de compilación automatizado para fusionar los directorios sea muy práctico tampoco.
Tal vez hay algo de magia que se puede trabajar con httpd.conf o .htaccess?
Tal vez los enlaces simbólicos son la solución? Pero, los enlaces simbólicos no son sencillos para ponerse en marcha en una plataforma Windows, y deberían crearse manualmente para cada módulo individual.
Hay 4 maneras de manejar esto:
- Simulación de activos en el directorio
public/
- Copiar y pegar activos de los módulos al directorio
public/
- Uso de una configuración de host virtual particular (o configuración del servidor web en general)
Utilice un módulo de gestión de activos, como uno de los siguientes:
- AssetManager , respaldado por assetic , combina los activos en tiempo de ejecución, almacena en caché para los entornos de producción y los filtros para la minificación de CSS / JS y la conversión de LESS / SASS, permite exponer los activos de los directorios en los módulos en sí mismos.
- zf2-assetic-module - respaldado por assetic - maneja la assetic CSS / JS y la conversión de LESS / SASS en tiempo de ejecución
- BaconAssetLoader : expone los activos de los módulos implementándolos en el directorio
public/
en el momento de la implementación
Hay muchas maneras de hacerlo.
En mi opinión, Assetic es un desperdicio de rendimiento informático, y una muy mala adaptación para este simple problema.
El problema, como se indicó, es acceder / público desde los módulos.
Mi solución es la siguiente:
Edite htdocs / yoursite / public / .htaccess para agregar esta línea justo después de RewriteEngine On:
RewriteRule ^resource/([a-zA-Z0-9/./-]+)/([a-zA-Z0-9/./-_//]+)$ index.php?action=resource&module=$1&path=$2 [QSA,L]
Edite htdocs / yoursite / public / index.php y agregue este código justo después de chdir (dirname ( DIR )) ;:
if (isset($_GET[''action'']) && $_GET[''action''] == "resource") {
$module = $_GET[''module''];
$path = $_GET[''path''];
if (!ctype_alnum($module))
die("Module name must consist of only alphanumeric characters");
$filetype = pathinfo($path, PATHINFO_EXTENSION);
$mimetypes = array(
''js'' => "text/javascript",
''css'' => "text/css",
''jpg'' => "image/jpeg",
''jpeg'' => "image/jpeg",
''png'' => "image/png"
);
if (!isset($mimetypes[$filetype]))
die(sprintf("Unrecognized file extension ''%s''. Supported extensions: %s.", htmlspecialchars($filetype, ENT_QUOTES), implode(", ", array_keys($mimetypes))));
$currentDir = realpath(".");
$destination = realpath("module/$module/public/$path");
if (!$destination)
die(sprintf("File not found: ''%s''!", htmlspecialchars("module/$module/public/$path", ENT_QUOTES)));
if (substr($destination, 0, strlen($currentDir)) != $currentDir)
die(sprintf("Access to ''%s'' is not allowed!", htmlspecialchars($destination, ENT_QUOTES)));
header(sprintf("Content-type: %s", $mimetypes[$filetype]));
readfile("module/$module/public/$path", FALSE);
die();
}
Uso: / resource / moduleName / ruta
Ejemplo: http://yoursite.com/resource/Statistics/css/style.css leerá el css real de su sitio / módulo / Estadísticas / public / css / style.css.
Es rápido, seguro, no necesita que especifique ninguna ruta en la configuración, no necesita instalación, no depende del mantenimiento de terceros y no necesita ayuda a la vista. Simplemente acceda / recurso desde cualquier lugar! Disfrutar :)
Puede intentar usar phing para administrar su proceso de compilación y automatizarlo todo. Tendrías que escribir el script de compilación, pero después sería como tocar el reproductor en un reproductor de CD.
Por supuesto que para probar sería un dolor.