Laravel11でディレクトリ構成とpublic_path()の設定を変更する

 

ファイルや画像のアップロードを行うときなど、laravelの意図するところは、storage/app/publicにシンボリックリンクを作成し、ファイルや画像を公開するのだと思います。

この場合、サーバーにSSH接続を行い、下記のコマンドを実行します。

php artisan storage:link

ただ、個人的には、上記のためだけに、SSH環境を構築するのは、特に商用サーバーでは、それぞれ設定方法が異なったり、できなさそうなサーバーもあり、それをいちいち調べ、設定するのが億劫なため、Laravel上で解決する方法をとっていますので、その方法をLaravel11の場合で解説していきます。

画像やファイルの保存場所

画像やファイルは、公開フォルダに直接保存していきます。

Webサーバーによりフォルダ名は異なると思いますが、通常「html」「public_html」「public」フォルダなどです。

この中にasettsフォルダやimagesフォルダなどを作成し、その中に保存していきます。

Laravelでは「config/filesystems.php」にその設定を記述していきます。

    'disks' => [

        'local' => [
            'driver' => 'local',
            'root' => storage_path('app'),
            'throw' => false,
        ],

        'public' => [
            'driver' => 'local',
            'root' => storage_path('app/public'),
            'url' => env('APP_URL').'/storage',
            'visibility' => 'public',
            'throw' => false,
        ],

上記はデフォルトで存在する設定です。ここに保存するファイル用の設定を追記します

        'images' => [
            'driver' => 'local',
            'root' => public_path('assets/images'),
            'url' => env('APP_URL') . '/assets/images',
            'visibility' => 'public',
        ],

上記は、公開フォルダがpublicの場合、public/assets/imagesフォルダに画像を追加していく設定です。

ファイルを表示するには、env('APP_URL')の設定で、例えば、「http://yahoo.co.jp/assets/images/」の後にファイル名を指定することで表示されます

ここで問題になるのが、「public_path()」の設定です。

public_path()の設定変更

デフォルトの設定はvendor\Illuminate\Foundation\Applicationにあります

・・・
    /**
     * Get the path to the public / web directory.
     *
     * @param  string  $path
     * @return string
     */
    public function publicPath($path = '')
    {
        return $this->joinPaths($this->publicPath ?: $this->basePath('public'), $path);
    }
・・・

上記を見ると、デフォルトの設定は、「public」フォルダになっています

つまり、このままでは、Laravelの初期状態のままで、appやbootstrapフォルダと同じレベルに「public」フォルダが存在する前提となっています

個人的には、システム用ディレクトリと公開ディレクトリの二つのフォルダだけで構成するのが好みで、例えば下記のような構成にしています

  • laravel_sys(laravelの構成ファイル、フォルダ名は随時変更している)
    • app
    • bootstrap
    • config
    • ・・・
  • public(htmlやpublic_htmlなどの公開フォルダ)

上記の場合、デフォルトのpublic_path()は、laravel_sysの中にpublicが存在している前提になっているので、ファイルのアップロードなどでは設定の変更が必要です。

そこで、「vendor\Illuminate\Foundation\Application」ファイルをオーバーライドして設定を変更します

ファイル名を「Application.php」として「app」フォルダの直下におき下記のような内容にします。

<?php

namespace App;

class Application extends \Illuminate\Foundation\Application
{
  //
}

extendsで\Illuminate\Foundation\Applicationの上書きが可能となります。

下記にpublic_path()の関数をコピペします

<?php

namespace App;

class Application extends \Illuminate\Foundation\Application
{
    /**
     * Get the path to the public / web directory.
     *
     * @param  string  $path
     * @return string
     */
    public function publicPath($path = '')
    {
        return $this->joinPaths($this->publicPath ?: $this->basePath('public'), $path);
    }
}

そして上記の「'public'」の部分を書き換えます

・・・
return $this->joinPaths($this->publicPath ?: $this->basePath('../public'), $path);
・・・

一つ上の階層からpublicフォルダを参照するように設定しました

bootstrap/app.phpの変更

このままでは、「app\Application.php」は参照されません。あいかわらず、もとの「vendor\Illuminate\Foundation\Application」のままです。

変更するには、bootstrap/app.phpを書き換える必要があります。

<?php

use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;
・・・

ファイル冒頭にある「use Illuminate\Foundation\Application;」を書き換えます

<?php

use app\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;
・・・

これでpublic_path()の設定の変更が反映されます

Laravelのディレクトリ構成の変更

下記は先ほど記載したディレクトリ構成です

  • laravel_sys(laravelの構成ファイル、フォルダ名は随時変更している)
    • app
    • bootstrap
    • config
    • ・・・
  • public(htmlやpublic_htmlなどの公開フォルダ)

上記のように設定する場合には、上記で設定した「app\Application.php」ファイルの設置以外に「public/index.php」の変更が必要になります

<?php

use Illuminate\Http\Request;

define('LARAVEL_START', microtime(true));

// Determine if the application is in maintenance mode...
if (file_exists($maintenance = __DIR__.'/../storage/framework/maintenance.php')) {
    require $maintenance;
}

// Register the Composer autoloader...
require __DIR__.'/../vendor/autoload.php';

// Bootstrap Laravel and handle the request...
(require_once __DIR__.'/../bootstrap/app.php')
    ->handleRequest(Request::capture());

上記はデフォルトの設定ですが、上記のうち3か所を変更します。変更箇所は下記です

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

今回の例では、Laravelの構成ファイルはすべて「/laravel_sys」に入れているので、それに合わせて設定を変更します

・・・
if (file_exists($maintenance = __DIR__.'/../laravel_sys/storage/framework/maintenance.php')) {
・・・
require __DIR__.'/../laravel_sys/vendor/autoload.php';
・・・
(require_once __DIR__.'/../laravel_sys/bootstrap/app.php')
・・・

これでディレクトリの変更設定は完了です

viteを使う場合など他にも設定を変更する箇所があるとおもいますが、それらは利用環境により変更する必要があります

まとめ

以上がLaravelのディレクトリ構成の変更と、public_html()の設定の変更についての解説となります。

構築環境は、みなさん工夫されていると思いますが、意外にこういった設定に躓くことが多いので、参考になればと思い記述させてもらいました

文責:フライング・ハイ・ワークス代表 松田 治人(まつだ はるひと)
会社では、Laravelを中心としたエンジニアとして働いており、これまでに50本以上のLaravelによるWebアプリケーションの構築や東京でホームページ制作をしています。
エンジニアとして弊社で働きたい方、お仕事のご相談など、お待ちしております。

WEBサイト・ホームページの制作をご検討の方

コーポレートサイト

フライング・ハイ・ワークスの紹介

フライング・ハイ・ワークスは、東京のホームページ制作・Web制作会社・システム開発会社です。東京都及びその近郊(首都圏)を中心として、SEO対策を意識したPC及びスマホのサイトをワンソース(レスポンシブ対応)で制作します。

実績

デザイナーチームは、グラフィックデザインやイラストの制作も得意としており、著作権を意識しない素材の提供が可能です。システム・コーディングチームでは、Laravelなどを使用したスクラッチからのオリジナルシステム開発を始め、WordPressのカスタマイズを得意としております。

また、SEOやランディングページ(LP)、広告向けバナーなどを他社様でやっていた作業の引継ぎでも問題ありません。制作実績は多数ございますので、お客様に合わせたご提案が可能です。

500点以上のフライング・ハイ・ワークスの制作実績ページをご覧ください。

東京のWeb制作会社・ホームページ制作のお問い合わせ、お見積り依頼、相談、質問は
お問い合わせフォームよりお願いいたします

ホームページ制作実績

コーポレートサイトへ