app_path — アプリケーション(app/)ディレクトリの絶対パスを取得

helper
  • カテゴリ: helper
  • 掲載バージョン: Laravel 12・PHP 8.4
  • 名前空間 / FQCN / コマンド: app_path(string $path = '')
  • 関連: base_path / storage_path / config_path / resource_path / public_path
  • 変更履歴: なし

要点(TL;DR)

  • app/ の絶対パス(+任意のサブパス)を得る
  • app_path('Models')
  • 罠: URLではない/存在確認はしない/書き込み用途はstorage_pathを使う

概要

app_path() は、プロジェクトのアプリケーションコードが置かれる app/ ディレクトリへの絶対パスを返します。引数にサブディレクトリ(例: Models)を渡すと結合したパスを返します。アプリケーションの配置パスをカスタマイズしていても、コンテナ設定に従って正しい場所を返します。

構文 / シグネチャ

string app_path(string $path = '');
  • 引数(表)
引数必須既定値説明
$pathstringいいえ''app/ 配下に連結する相対パス(例: 'Models', 'Services/Foo'
  • 戻り値string(絶対パス。存在確認は行わない)
  • 例外/副作用:なし(単純結合。ディレクトリの作成や権限変更はしない)

使用例

最小例

<?php

use Illuminate\Support\Facades\Route;

Route::get('/debug/app-path', function () {
    // 例: /var/www/html/app/Models
    return app_path('Models');
});

実務例(簡易ジェネレータで DTO クラスを作成)

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Filesystem\Filesystem;

class MakeDto extends Command
{
    protected $signature = 'make:dto {name}';
    protected $description = 'Create a simple DTO class';

    public function handle(Filesystem $fs): int
    {
        $dir = app_path('DTOs');
        if (! is_dir($dir)) {
            $fs->makeDirectory($dir, 0755, true);
        }

        $class = trim($this->argument('name'));
        $path  = $dir . DIRECTORY_SEPARATOR . "{$class}.php";

        $stub = <<<PHP
        <?php

        namespace App\\DTOs;

        final class {$class}
        {
            public function __construct(
                public array \$attributes = [],
            ) {}
        }
        PHP;

        if ($fs->put($path, $stub) === false) {
            $this->error('Failed to write DTO file.');
            return self::FAILURE;
        }

        $this->info("Created: {$path}");
        return self::SUCCESS;
    }
}

よくある落とし穴・注意

  • URLではない:ビューやリンクに使う場合は asset() / route() を使う。
  • 書き込み用途は不向き:実行時生成ファイルは storage_path() を利用(権限面・運用分離)。
  • 存在保証なし:返るのは文字列のみ。is_dir() / file_exists() を必要に応じて実施。
  • パス変更に追随app/ を別名/別階層へ移動していても適切に解決。ハードコードしないこと。

代替・関連APIとの比較

  • base_path():プロジェクトルート。app_path()はその配下の app/ 特化。
  • storage_path():書き込み・キャッシュ等の実行時ファイル用。
  • resource_path()resources/ 配下(ビュー・言語ファイル等)。
  • public_path():公開ディレクトリ。URLにしたい場合は asset() を併用。

選定基準
コード配置参照=app_path/ルート起点操作=base_path/実行時ファイル=storage_path

テスト例(Pest)

<?php

it('resolves app directory paths', function () {
    expect(app_path())->toBe(base_path('app'));
    expect(app_path('Models'))->toBe(base_path('app/Models'));
});

トラブルシュート(エラー別)

症状/エラー原因対処
Permission denied で書き込み失敗app/ は書き込み前提ではないstorage_path() を使い、権限はストレージ側で設定
ブラウザで 404/アクセス不可取得したのはファイルシステムのパス画面出力は asset() / route() を利用
file_get_contents(): failed to open stream指定したサブパスが存在しないfile_exists() で確認し、必要なら作成・配置

参考リンク

長野県・北アルプス地方在住のフリーランスWebプログラマー。
「落ち着くためのWeb開発」をテーマに、訪れる人が安心して使えるサービスづくりを心がけています。

LaravelやWordPressなどのWebアプリケーション開発を得意とし、技術面の安定性はもちろん、運用後も長く活用できる設計を大切にしています。
静かな山間の暮らしから生まれる視点で、シンプルかつ本質的な解決策をご提案します。

野鳥観察も趣味のひとつで、特にミソサザイ(Wren)に魅力を感じています。
小さな体に反して力強く上向きの尾羽、そして澄んだ鳴き声が遠くまで響く姿に、静かな存在感と芯の強さを感じます。
このサイト名「Laravel Wren」には、そんなミソサザイのように、小さくても確かな価値を届けたいという想いを込めています。

信頼できるパートナーとして、そして気軽に相談できる存在として、あなたのWebプロジェクトをサポートします。

Yudai Tsuyuzakiをフォローする