2017-10-06 4 views
0

J'utilise une application Laravel avec un répertoire public externe, par ex. root/Laravel et root/html/public.Problème de routage d'index Laravel lors de l'utilisation pour une sous-section dans un autre fw (répertoire public externe)

J'ai besoin de cette application pour charger à partir d'un require sur un fichier php (root/html/this-section.php) qui a déjà un autre framework le chargeant, d'où le fait que fw a sa propre tête, et son tag body. Cette application va charger entre l'en-tête et le pied de page de ce fichier. Lorsque je configure les routes, je remarque que les deux routes suivantes fonctionnent, mais j'obtiens des résultats différents.

Route::get('/', '[email protected]'); 
Route::get('/this-section', '[email protected]'); 

# this also works as a substitute for above, still same issue though 
Route::get('//', '[email protected]'); 

Ce sont les mêmes pages, le contrôleur a le même code, je m'attendrais à ce que les pages se chargent le même. Ce qui se passe est l'index principal site.com/ se charge correctement, mais ce dernier est en cours de chargement sans les balises html <head> et <body> qui existent sur this-section.php. Donc, essentiellement, ce dernier ne charge pas la page parente, son seul chargement est ce qu'il voit sur les modèles de lame.

je soupçonne peut-être soit besoin d'ajouter une ré-écriture au .htaccess pour couvrir cela, ou mettre en place une redirection personnalisée ou le retour d'une vue ou d'une réponse dans le contrôleur (je besoin d'aide ici avec des suggestions) où je peux puis faire une seconde méthode, par exemple thisSectionIndex() et renvoyez cette suggestion.

Au début, j'avais des choses qui fonctionnaient avec l'annulation du public_path() au chemin correct this-section mais qui a échoué lorsque j'ai fait les sous-routes par exemple. lorsque vous utilisez la configuration de l'itinéraire suivant

Route::get('/', '[email protected]'); 
Route::get('/feature', '[email protected]'); 

Il a causé la route feature être 500 ou 404, je pense qu'il n'a pas pu trouver les fichiers, donc je compris que je devais malheureusement ajouter dans la partie /this-section à la route, qui a ouvert une boîte de Pandore à peu près.

Route :: get ('/', 'HomeController @ index'); Route :: get ('/ this-section', 'HomeController @ index'); Route :: get ('/ this-section/feature', 'Fonction SectionController @'); Sur une note de côté, quelques retombées pour ce que j'ai trouvé une solution de rechange temporaire pour déjà été {{assets()}} cassé. J'ai eu assets() remplacé pour ne pas avoir à utiliser la partie this-section/, par exemple. comme ça {{assets(/this-section/css/styles.css)}}. Le travail temporaire devait unfortunately ajouter manuellement les chemins et renoncer à utiliser {{assets()}} dans les modèles de lame jusqu'à ce que je trouve cette partie, car aucun chemin ne fonctionne pour eux maintenant.

Quelques informations de fond:

Im redéfinissant la voie publique comme celui-ci

#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__.'/../') 
); 

Voici les pertinentes parties (ajusté) de l'indice bootstrapper de Laravel (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 est situé en dehors de Laravel, et 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> 
+0

Vous ** vraiment ** ne voulez pas être 'remplaçant public_path' et' asset' comme cette. – ceejayoz

+0

Selon les meilleures suggestions sur laracast qui a été recommandé. Je pense qu'il peut avoir été ici https://laracasts.com/discuss/channels/general-discussion/where-do-you-set-public-directory-laravel-5, est-ce la source du problème? Comment recommanderiez-vous? En outre, notez que j'ai l'actif commenté. – blamb

+0

En fait, alors que c'est une bonne ressource liée ci-dessus, pour une raison quelconque (pour soutenir l'artisan je crois), je devais passer à cette solution https://stackoverflow.com/questions/31758901/laravel-5-change-public-path est ce que vous voyez dans mon exemple. – blamb

Répondre

0

Avec l'aide de this topic et this topic j'ai trouvé une solution de travail. Des ajustements sont nécessaires lors de votre chargement dans l'application. Vous voulez l'amorcer à partir du même chemin que le fichier charge le bootstrap, puis remplacer le .htaccess pour ce chemin particulier uniquement.

  1. déplacer laravels fichier de démarrage fichier html/this-section/index.php d'un répertoire, à côté du fichier html/this-section.php, et renommez-le à html/this-section-laravel-boostrap.php

  2. régler le chemin Laravel sur html/this-section-laravel-boostrap.php en supprimant un répertoire ../

    • par exemple $laravelRelPath = '../../Laravel';-$laravelRelPath = '../Laravel';
  3. ajouter le code suivant à htlm/this-section.php (le fichier charge le bootstrap)

if (strpos($_SERVER['REQUEST_URI'],'this-section') !== false) { require_once('this-section-laravel-bootstrap.php'); }

  1. ajouter ce qui suit à la .htaccess pour accrocher l'uri

#Rewritebase/ RewriteRule ^this-section/?$/[L,NC]

  1. La seule voie nécessaire pour this-section

Route::get('/this-section', '[email protected]')

  1. Dans vos modèles de lame, appelez vos actifs comme celui-ci donc ils chargent sur chaque sous-section url, par exemple pour
css

<link rel="stylesheet" href="/this-section/css/styles.css">

L'application va maintenant bootstrap, et toujours utiliser le contenu extérieur à partir du fichier parent qui le charge. Voir ci-dessous pour un exemple de fichier de test parent (html/this-section.php) pour cela.

<!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> 

Bonus actifs sont maintenant se charge pas correctement, vous n'avez probablement pas besoin étape 5. {{asset('css/vendors.css')}}