web-dev-qa-db-fra.com

Laravel 5 changez public_path ()

J'essaie de déplacer le dossier public vers un autre emplacement. Cependant, je ne trouve pas l'endroit pour modifier la variable public_path(). Maintenant, 'public_path ()' retourne le mauvais chemin du dossier.

Où puis-je définir la variable pour public_path()?

45
user1995781

Vous pouvez remplacer le chemin public à l'aide du conteneur ioc:

Ce qui a parfaitement fonctionné pour moi a été d’ajouter à public/index.php les trois lignes suivantes:

 $app->bind('path.public', function() {
    return __DIR__;
});

Pour une explication plus détaillée, cliquez ici

43
Jigs Virani

Bien que la réponse acceptée fonctionne pour les demandes provenant de HTTP, elle ne fonctionnera pas pour artisan.

Si vous avez besoin de artisan pour connaître votre chemin public personnalisé, vous devez étendre Laravel la classe principale de l'application. Je sais que cela semble effrayant, mais c'est en fait très simple.

Tout ce que vous devez faire est de suivre:
Step 1: Dans le fichier: bootstrap/app.php _ change la toute première déclaration de $app variable

$app = new Illuminate\Foundation\Application(
    realpath(__DIR__.'/../')
);

pour refléter votre propre classe d'application personnalisée:

$app = new App\Application(
    realpath(__DIR__.'/../')
);

Étape 2: Définissez votre classe d'application personnalisée quelque part. Par exemple dans app/Application.php

<?php namespace App;

class Application extends \Illuminate\Foundation\Application
{
}

Félicitations! Vous avez étendu Laravel la classe d'applications principale.

Étape 3: Écrasez la méthode publicPath. Copiez et collez Laravel originale à votre nouvelle classe et modifiez-la en fonction de vos besoins. Dans mon cas particulier, j’ai ressemblé à ceci:

public function publicPath()
{
    return $this->basePath.DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR.'public_html';
}

C'est ça! Vous pouvez écraser n'importe quelle méthode de la classe Application de la même manière.

43
ruuter

Je vous suggère de l'ajouter dans app/Providers/AppServiceProvider.php:

public function register()
{
    $this->app->bind('path.public', function() {
        return realpath(base_path().'/../public_html');
    });
}

Cela affecte également artisan.

12
Broshi

Dans laravel 5.6 cela fonctionne pour moi ... en ajoutant ce code à bootstrap/app.php:

$app->bind('path.public', function() {
    return realpath(__DIR__.'/../');
});

__ DIR __. '/ .. /' est le chemin d'accès à votre dossier public

5
AnasSafi
$app->bind('path.public', function() {
  return base_path().'/mynewpublic';
});
1
macieks