usar - Problema de ruta de índice de Laravel cuando se usa para una subsección en otro fw(directorio público externo)
vistas en laravel (1)
Estoy usando una aplicación Laravel con un directorio público externo, por ejemplo, root/Laravel
y root/html/public
.
Necesito esta aplicación para cargar desde un requerimiento en un archivo php ( root/html/this-section.php
) que ya tiene otro framework cargándolo, por lo tanto, el otro fw tiene su propia cabecera y etiqueta corporal. Esta aplicación se cargará entre el encabezado y el pie de página de ese archivo.
Cuando configuro las rutas, noto que ambas rutas funcionan, pero obtengo resultados diferentes.
Route::get(''/'', ''HomeController@index'');
Route::get(''/this-section'', ''HomeController@index'');
# this also works as a substitute for above, still same issue though
Route::get(''//'', ''HomeController@index'');
Estas son las mismas páginas, el controlador tiene el mismo código, esperaría que las páginas se carguen igual. Lo que está sucediendo es que el índice principal site.com/
está cargando correctamente, pero el último se está cargando sin las etiquetas html <head>
y <body>
que existen en this-section.php
. En esencia, este último no carga la página principal, solo carga lo que ve en las plantillas blade.
Sospecho que quizás sea necesario agregar una reescritura al .htaccess para cubrir esto, o configurar una redirección personalizada o devolver una vista o respuesta en el controlador (necesito ayuda aquí con sugerencias) donde puedo hacer un segundo método, por ejemplo, thisSectionIndex()
y devolver esa sugerencia.
Al principio tenía cosas trabajando con la anulación de la vía public_path()
a la ruta correcta de this-section
sin embargo, que resultó contraproducente cuando hice las rutas secundarias, por ejemplo, cuando se utiliza la siguiente configuración de ruta
Route::get(''/'', ''HomeController@index'');
Route::get(''/feature'', ''SectionController@feature'');
Causó que la ruta feature
fuera de 500 o de 404, creo que no pudo encontrar los archivos, así que me di cuenta de que necesitaba agregar desafortunadamente en la /this-section
a la ruta, lo que abrió una lata de gusanos.
Route :: get (''/'', ''HomeController @ index''); Route :: get (''/ this-section'', ''HomeController @ index''); Route :: get (''/ this-section / feature'', ''SectionController @ feature'');
En una nota al margen, algunas consecuencias para esto, que ya encontré una solución temporal, fue que {{assets()}}
rompió. Tenía assets()
anulados para no tener que usar la this-section/
porción this, por ejemplo, {{assets(/this-section/css/styles.css)}}
. La solución temporal fue unfortunately
tener que agregar manualmente las rutas y renunciar a usar {{assets()}}
completo en las plantillas blade hasta que sepa qué parte, porque ninguna ruta está funcionando para ellos ahora.
Alguna información de fondo:
Estoy anulando el camino público como este
#Laravel/app/SectionApplication
class SectionApplication extends /Illuminate/Foundation/Application
{
public function publicPath()
{
$newBasePath = $this->basePath . DIRECTORY_SEPARATOR . ''..'' .
DIRECTORY_SEPARATOR . ''html/this-section'';
return $newBasePath;
}
}
#Laravel/bootstrap/app.php
// $app = new Illuminate/Foundation/Application(
// realpath(__DIR__.''/../'')
// );
$app = new App/SectionApplication(
realpath(__DIR__.''/../'')
);
Aquí están las partes pertinentes (ajustadas) del índice laravel bootstrapper ( html/this-section/index.php
)
function public_path($path = '''')
{
return realpath(__DIR__);
}
//adjust your relative laravel framework path here
$laravelRelPath = ''../../Laravel'';
//override the blade {{asset()}} helper
function asset($path, $secure = null)
{
$newPubPath = ''this-section/''; //relative from html where the index.php will be
return app(''url'')->asset($newPubPath . $path, $secure);
}
.htaccess se encuentra fuera de Laravel, y en html/
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>
RewriteEngine On
#Rewritebase /this-section/
#RewriteRule ^(.*)$ this-section/$1 [L]
# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
# Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
</IfModule>
Con la ayuda de este tema y este tema encontré una solución de trabajo. Se necesitan ajustes cuando carga en la aplicación. Desea iniciarlo desde la misma ruta que el archivo carga el programa de arranque, y luego anular el .htaccess solamente para esa ruta en particular.
mueva el archivo de arranque laravels
html/this-section/index.php
a un directorio, al lado del archivohtml/this-section.php
, yhtml/this-section-laravel-boostrap.php
ahtml/this-section-laravel-boostrap.php
ajuste la ruta para laravel en
html/this-section-laravel-boostrap.php
eliminando un directorio../
- por ejemplo, de
$laravelRelPath = ''../../Laravel'';
a$laravelRelPath = ''../Laravel'';
- por ejemplo, de
agregue el siguiente código a
htlm/this-section.php
(el archivo carga el programa de arranque)
if (strpos($_SERVER[''REQUEST_URI''],''this-section'') !== false) { require_once(''this-section-laravel-bootstrap.php''); }
- agrega lo siguiente al .htaccess para enganchar el uri
#Rewritebase / RewriteRule ^this-section/?$ / [L,NC]
- La única ruta necesaria para
this-section
Route::get(''/this-section'', ''HomeController@index'')
- En sus plantillas blade, llame a sus activos de esta manera para que carguen en cada url de las subsecciones, por ejemplo, para css
<link rel="stylesheet" href="/this-section/css/styles.css">
La aplicación ahora se iniciará y siempre usará el contenido externo del archivo principal que lo carga. Vea a continuación un ejemplo de archivo de prueba principal ( html/this-section.php
) para esto.
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Parent Application</title>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
</head>
<body>
<header>
<nav>
<ul>
<li>menu</li>
</ul>
</nav>
</header>
<?php
<--! laravel sandwich -->
if (strpos($_SERVER[''REQUEST_URI''],''this-section'') !== false) {
require_once(''this-section-laravel-bootstrap.php'');
}
?>
<footer>
<p>Copyright <?php echo date(''Y''); ?> - All rights reserved.</p>
</footer> -->
</body>
</html>
Los activos de bonificación ahora se están cargando correctamente, probablemente no necesites el paso 5. {{asset(''css/vendors.css'')}}