web-dev-qa-db-fra.com

Comment changer le dossier public en public_html dans laravel 5

J'utilise un hébergement partagé qui utilise cPanel comme panneau de configuration et dans cPanel public_html est le répertoire racine par défaut. De ce fait, je ne parviens pas à faire fonctionner correctement mon application Laravel.

Est-il possible de faire en sorte que Laravel utilise public_html au lieu du dossier public?

29
Ravexina

Assez facile à trouver cela avec une simple recherche.

Voir: https://laracasts.com/discuss/channels/general-discussion/where-do-you-set-public-directory-laravel-5

Dans votre index.php ajoutez les 3 lignes suivantes.

/*
|--------------------------------------------------------------------------
| Turn On The Lights
|--------------------------------------------------------------------------
|
| We need to illuminate PHP development, so let us turn on the lights.
| This bootstraps the framework and gets it ready for use, then it
| will load up this application so that we can run it and send
| the responses back to the browser and delight our users.
|
*/

$app = require_once __DIR__.'/../bootstrap/app.php';

// set the public path to this directory
$app->bind('path.public', function() {
    return __DIR__;
});

Modifier:


Comme Burak Erdem l'a mentionné, une autre option (et plus préférable) consiste à mettre cela dans la méthode \App\Providers\AppServiceProviderregister().

/**
 * Register any application services.
 *
 * @return void
 */
public function register()
{
    // ...

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

Si la solution index.php de Robert ne fonctionne pas pour vous, vous pouvez également enregistrer le code suivant à Application Service Provider (App\Providers\AppServiceProvider.php).

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

public function register()
{
    $this->app->bind('path.public', function() {
        return base_path().'/public_http';
    });
}
17
Burak Erdem

Ce n'est pas si facile comme contraignant. Ferrolho fournit la réponse la plus propre et la plus élaborée ici https://laracasts.com/discuss/channels/general-discussion/where-do-you-set-public-directory-laravel-5

Mais la réponse la plus rapide consiste à créer un lien symbolique nommé public pointant sur public_html et à mettre index.php dans le dernier. 

1
Diego Viniegra

Je veux juste mettre à jour toutes les réponses précédentes. Si votre public_html n'est pas dans le dossier laravel, vous devez utiliser ce code:

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

Ces réponses n'ont pas fonctionné pour laravel 5.5, mais ma propre méthode peut vous aider.

Étape 1: Supprimez tous les fichiers sauf le fichier public dans le répertoire principal du serveur.

Étape 2: Fichier public dans le fichier public_html sur le serveur.

Étape 3: Extrayez le fichier index.php de public_html et changez-le comme ceci.

Étape 3a: 

Originale -> require __DIR__.'/../vendor/autoload.php';

Changements -> require __DIR__.'/../**created_folder**/vendor/autoload.php';

Original -> $app = require_once __DIR__.'/../bootstrap/app.php';

Changements -> $app = require_once __DIR__.'/../**Created_folder**/bootstrap/app.php';

Étape 4: Créer symlinkcreate.php

Étape 4A: <?php symlink('/home/**server_directory**/**created_folder**/storage/app/public','/home/**server_directory**/public_html/storage');

Étape 4B: votre site web/symlinkcreate.php visite

Étape 4C: symlinkcreate.php supprimez votre serveur.

Enfin, la structure du répertoire ressemble à ceci:

/etc
/logs
/lscache
/mail
/Your_Created_Folder
  ../LARAVEL_FOLDERS
/public_html
  ../css
  ../js
  ../.htaccess
  ../index.php
  ../web.config
/ssl
/tmp

Terminer.

Laravel 5.5 public_html sorunu için bu cevabı gönül rahatlığıyla kullanabilirsiniz.

1
T.Arslan

Serveur

Les méthodes décrites dans la rubrique fonctionnent parfaitement. Par conséquent, la méthode de registre App\Providers\AppServiceProvider.php devrait faire le travail:

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

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

Développement des services artisanaux php locaux

Cependant, il existe un autre problème que vous pouvez rencontrer. Si vous développez votre application sur une machine locale et que vous utilisez la commande php artisan serve pour la servir, vous allez la décomposer avec la syntaxe ci-dessus uniquement. Vous devez toujours ajuster le fichier server.php qui existe dans le répertoire principal. Éditez le contenu de celui-ci et remplacez chaque occurrence de /public par /public_html, afin qu'il ressemble à ceci:

<?php

/**
 * Laravel - A PHP Framework For Web Artisans
 *
 * @package  Laravel
 * @author   Taylor Otwell <[email protected]>
 */

$uri = urldecode(
    parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)
);

// This file allows us to emulate Apache's "mod_rewrite" functionality from the
// built-in PHP web server. This provides a convenient way to test a Laravel
// application without having installed a "real" web server software here.
if ($uri !== '/' && file_exists(__DIR__.'/public_html'.$uri)) {
    return false;
}

require_once __DIR__.'/public_html/index.php';

Après ça. Arrêtez simplement votre serveur et rechargez-le avec php artisan serve

Développement de laravel-mix front end

Si vous utilisez webpack et laravel-mix pour générer vos fichiers css et js, une mise à jour est également nécessaire. Sans modifier webpack.mix.js, vous obtiendrez quelque chose comme ceci sur npm run watch ou npm run production:

.
..
public
  _html
    js
  public_html
    css
public_html

Donc, ça va gâcher votre code. Pour clarifier cela, vous devez fournir un chemin public à votre fichier webpack.mix.js. Cela pourrait ressembler à ceci:

const mix = require('laravel-mix');

mix.setPublicPath('public_html/');
mix.js('resources/js/app.js', 'js')
mix.sass('resources/sass/app.scss', 'css');

Cela va changer la définition par défaut de public directory de public à public_html et les lignes suivantes fournissent un chemin relatif à votre valeur setPublicPath.

Bonne codage.

1
David

Pour ceux qui doivent modifier le chemin public afin qu’il soit également disponible pour Artisan, ajoutez ce qui suit à bootstrap/app.php, juste après la dernière méthode singleton:

$app->bind('path.public', function () {
    return base_path("<your public directory name>");
});
0
Mike Rockétt

Pour moi, rien de tout cela n'a fonctionné jusqu'à ce que je modifie le dossier public racine dans les paramètres du serveur. En production, il est en /etc/nginx/sites-enabled/<your_site_name>. Modifiez-le avec un éditeur de texte et faites défiler l'écran jusqu'à voir le chemin racine pointant vers le dossier /public. Changez-le en votre nouveau dossier public et redémarrez le serveur. Au niveau local, je devais changer le chemin dans Homestead.yaml et /etc/nginx/sites-enabled/<your_site_name> après que je sois entré dans Vagrant. vagrant reload --provision pour vous assurer qu'il est bien compris. Ensuite, j'ai également modifié index.php et enregistré un nouveau chemin dans le fournisseur de services au cas où, mais il semble fonctionner sans. Je n’utilise cependant aucune dépendance de tiers avec Laravel, je ne sais donc pas si cela fonctionnera dans ce cas.

0
Arthur Tarasov

salut les gars ça marche pour moi ... vous pouvez l'utiliser 

aller à cette adresse: 

/app/Providers/AppServiceProvider.php

et ajoutez ce code à la fin du fichier ....

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