[Laravel] publicフォルダのパスを変更する

例えば、「public」から「public_html」へ変更する場合。

とりあえずフォルダ名前を変えてみると・・

 [ErrorException]
 chdir(): No such file or directory (errno 2)

と、怒られます。

原因

    /**
     * Execute the console command.
     *
     * @return void
     */
    public function fire()
    {
     chdir($this->laravel->publicPath());

     $host = $this->input->getOption('host');

     $port = $this->input->getOption('port');

     $base = $this->laravel->basePath();

     $this->info("Laravel development server started on http://{$host}:{$port}/");

     passthru('"'.PHP_BINARY.'"'." -S {$host}:{$port} \"{$base}\"/server.php");
    }

vendor/laravel/framework/src/Illuminate/Foundation/Console/ServeCommand.php

ここ(chdir($this->laravel->publicPath());)でpublicフォルダが存在しないと。

パスはどこで登録されている?

    /*
    |--------------------------------------------------------------------------
    | Create The Application
    |--------------------------------------------------------------------------
    |
    | The first thing we will do is create a new Laravel application instance
    | which serves as the "glue" for all the components of Laravel, and is
    | the IoC container for the system binding all of the various parts.
    |
    */

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

bootstrap/app.php

ここでLaravelの各パスが登録されている。

Illuminate/Foundation/Applicationクラスを見てみると、

    /**
     * Get the path to the public / web directory.
     *
     * @return string
     */
    public function publicPath()
    {
     return $this->basePath.DIRECTORY_SEPARATOR.'public';
    }

vendor/laravel/framework/src/Illuminate/Foundation/Application.php

と、パワーコーディングされており、変数等では上書きできない模様。

publicpath()をOverrideする

Illuminate\Foundation\Applicationを継承した、app/Application.phpを作成します。

<?php namespace App;

    class Application extends \Illuminate\Foundation\Application {

     /**
      * Get the path to the public / web directory.
      *
      * @return string
      */
     public function publicPath()
     {
        return $this->basePath . '/public_html';
     }
    }

app/Application.php

作成した\App\Applicationクラスを読み込む様に編集します。

    /*
    |--------------------------------------------------------------------------
    | Create The Application
    |--------------------------------------------------------------------------
    |
    | The first thing we will do is create a new Laravel application instance
    | which serves as the "glue" for all the components of Laravel, and is
    | the IoC container for the system binding all of the various parts.
    |
    */

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

artisanコマンドで確認

$ php artisan serve

Laravel development server started on http://localhost:8000/

public_htmlフォルダが読み込まれました!

※ ディレクトリの階層を変更する場合は、public/index.php内にも変更が必要です。

© Xzxzyzyz