- カテゴリ: 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 = '');
- 引数(表)
 
| 引数 | 型 | 必須 | 既定値 | 説明 | 
|---|---|---|---|---|
| $path | string | いいえ | '' | 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() で確認し、必要なら作成・配置 | 
参考リンク
- Laravel Docs — Helpers: Path Helpers(
app_pathほか): https://laravel.com/docs/12.x/helpers#paths - Laravel Framework(ソース)— 
helpers.phpのapp_path実装: https://github.com/laravel/framework/blob/12.x/src/Illuminate/Foundation/helpers.php - Laravel Docs — Filesystem(書き込み先の設計): https://laravel.com/docs/12.x/filesystem
 

  
  
  
  