Laravelのディレクトリ構造を変更する

publicのディレクトリをドキュメントルートとした場合、ドキュメントルートよりも上のディレクトリにapp, bootstrap, configといったディレクトリが展開されることとなります。
ドキュメントルートの上のディレクトリにはアクセスログなどのディレクトリがあり、それらのディレクトリと混ざってしまうことがあるかと思います。
Laravelのファイルはディレクトリを追加して、そこに格納するようにしたいと思います。

laravel/frameworkのバージョンはv9.45.1です。

目的とするディレクトリ構造

laravelというディレクトリにソースを格納し、/var/www/public/をドキュメントルートとするディレクトリ構造を目指します。

/var/www/
 ├ logs/ <もともとあるディレクトリなど>
 │ ├ ...
 │ └ access-yymmdd.log
 ├ laravel/ <Larabelのソースを格納するディレクトリ>
 │ ├ app/
 │ ├ bootstrap/
 │ ├ lang/
 │ ├ node_modules/
 │ ├ resources/
 │ ├ routes/
 │ ├ storage/
 │ ├ tests/
 │ ├ vendor/
 │ ├ .editorconfig
 │ ├ .env
 │ ├ .gitattributes
 │ ├ .gitignore
 │ ├ artisan
 │ ├ composer.json
 │ ├ composer.lock
 │ ├ manifest.json
 │ ├ package-lock.json
 │ ├ package.json
 │ ├ phpunit.xml
 │ ├ README.md
 │ └ vite.config.js
 └ public/ <DocumentRoot>
   ├ build/
   ├ .htaccess
   ├ favicon.ico
   ├ index.php
   └ robots.txt

作業手順

手順といってもファイルの移動、3ファイルの更新で完了します。

ファイルの移動

laravelのディレクトリを作成し、publicのディレクトリ以外のディレクトリとファイルをlaravelのディレクトリに移動します。

public/index.phpの書き換え

public/index.phpに記載のあるパス(3か所)にlaravel/を追記します。

public/index.php
if (file_exists($maintenance = __DIR__.'/../laravel/storage/framework/maintenance.php')) {
    require $maintenance;
}
public/index.php
require __DIR__.'/../laravel/vendor/autoload.php';
public/index.php
$app = require_once __DIR__.'/../laravel/bootstrap/app.php';

AppServiceProvider.phpの書き換え

app/Providers/AppServiceProvider.phpregister関数に追記します。

AppServiceProvider.php
/**
 * Register any application services.
 *
 * @return void
 */
public function register()
{
    $this->app->bind('path.public', function () {
        return base_path() . '/../public';
    });
}

viteの変更

vite.config.jsのlaravel-vite-pluginにpublicDirectoryを追加します。

vite.config.js
export default defineConfig({
    plugins: [
        laravel({
            publicDirectory: '../public',
            input: ['resources/css/app.css', 'resources/js/app.js'],
            refresh: true,
        }),
    ],
});