この記事では、Laravel のディレクトリ構造と構成についての知識を提供します。Laravel のディレクトリ構造は、初期状態では比較的充実しています。従来のコントローラーに加えて、スクリプトやミドルウェアなどのコード ファイルのディレクトリを準備するのにも役立ちます。皆様のお役に立てれば幸いです。
Laravel のディレクトリ構造は、初期状態では比較的充実しています。従来のコントローラーに加えて、準備にも役立ちます。スクリプトやミドルウェアなどのコードファイルのディレクトリ。基本的には直接使用できます。
まず、ルート ディレクトリの内容を見てみましょう。
実際には、これらのディレクトリの名前に基づいてその機能を知ることができます。たとえば、app ディレクトリは特定のアプリケーション コードです。 config ディレクトリには、構成ファイル情報が保存されます。前回の記事で、仮想マシンで Laravel を使用する場合、ルート ディレクトリにあるファイル server.php を使用する必要があると述べましたが、実際には、このファイルはルート ディレクトリにある public/index.php ドキュメントをロードします。
bootstrap は、フレームワークの起動時にロードする必要があるファイルです。通常、このファイルの内容は変更されません。このディレクトリには、キャッシュ関連のディレクトリ ファイルも含まれています。 「database」は明らかにデータベース関連のコンテンツです。 public はフレームワークのエントリ ディレクトリであり、直接表示される画像や静的ファイルなど、他のリソース ファイルもここに配置できます。 resource には、ビューとコンパイルされていないリソース ファイルが格納されます。
routes ディレクトリは、ルーティング ファイルが保存されているディレクトリです。このディレクトリは非常に重要です。もちろん、実際に非常に重要なのは、その中にあるルーティング ファイルです。これにはデフォルトで web.php、api.php、channels.php、console.php が含まれており、それぞれデフォルトの Web リクエスト ルーティング、API リクエスト ルーティング、登録イベント ブロードキャスト、およびクロージャ ベースのコンソール スクリプト コマンドを表します。
ストレージ ディレクトリは、キャッシュ、ログ、その他の情報など、アプリケーションによって生成されたさまざまなファイルを保存するために使用されます。テスト ディレクトリには、自動テストに関連するコンテンツが含まれています。
これらのディレクトリでは、アプリ ディレクトリに含まれるコンテンツに注目してみましょう。
アプリ ディレクトリは、アプリケーション開発で最も一般的に使用されるディレクトリです。コントローラー、モデル、ミドルウェア、およびアプリケーションのその他のコンテンツはすべてこのディレクトリにあります。
コンソール ディレクトリは、私たちが作成したコマンド ライン スクリプト ディレクトリです。つまり、カスタマイズして php 職人を通じて実行できるコマンド ライン関数はすべてこのディレクトリにあります。
Exceptions は、カスタマイズできる例外クラスです。モデルには、カスタマイズされたデータ モデルが保存されます。 Providers ディレクトリには、デフォルトのサービス プロバイダーとカスタマイズ可能ないくつかのサービス プロバイダーが保存されます。
次は Http ディレクトリです。
コントローラー 言うまでもなく、コントローラーはすべてここに書かれています。ミドルウェアにはデフォルトのミドルウェアが含まれていますが、もちろん、カスタマイズしたミドルウェアもこのディレクトリに書き込むことができます。
Kernel.php はカーネルを要求するための制御ファイルで、このファイルには要求されたミドルウェアを定義できます。こちらも非常に重要なコアドキュメントですので、今後学習する際に詳しく解説していきます。
実際のディレクトリ構成は上記の通りですが、次にルートディレクトリ直下のconfigディレクトリの内容である設定ファイルを見てみましょう。ここにあるコンテンツは、頻繁に公開する必要があるものでもあります。
実際、これらの設定ファイルの名前からその機能がわかります。次の記事では、すぐに、database.php ファイルについて触れます。これは、エントリ関連のコンテンツでは、データベースに接続するだけで体験できるからです。
database.phpでは、接続するmysqlデータベース情報だけでなく、接続するNoSQL型データベースも定義できます(デフォルトではredis接続設定が与えられています)。ここでMySQLの接続情報を見てみましょう。
'mysql' => [ 'driver' => 'mysql', 'url' => env('DATABASE_URL'), 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'unix_socket' => env('DB_SOCKET', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'prefix_indexes' => true, 'strict' => true, 'engine' => null, 'options' => extension_loaded('pdo_mysql') ? array_filter([ PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), ]) : [], ],
設定ファイルのコードを見ると、env() 関数を通じて多くの情報が取得されていることがわかります。この関数によって取得されるコンテンツは、実際にはルート ディレクトリの .env ファイルのコンテンツです。この .env ファイルを開くと、設定方法が php.ini ファイルの方法と似ており、どちらも key=value の形式で設定情報を持っていることがわかります。
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=laravel DB_USERNAME=root DB_PASSWORD=
ここでは、現在の環境でのデータベース接続情報を設定できます。この構成の利点は何ですか?
独立的配置文件这种形式的很容易实现配置中心,也很容易实现测试环境和正式环境的分别部署。一般我们不会将这个 .env 放到 git 中,或者跟随代码上传。在正式环境或者测试环境都是手动地或者通过配置中心来进行配置。这样的话,我们就不需要修改源代码,只需要使用不同的这个 .env 配置文件就可以实现不同的环境下运行相同的代码了。
通过 XDebug ,我们可以追踪到 env() 这个方法在底层调用了 vlucas 的 DotEnv 这个 Composer 组件来进行 PHPENV 类型文件的读写加载。
对于加载来说,在程序运行的时候,我们会通过下面这段代码来进行加载。
// laravel/framework/src/Illuminate/Foundation/Application.php foreach ($bootstrappers as $bootstrapper) { $this['events']->dispatch('bootstrapping: '.$bootstrapper, [$this]); $this->make($bootstrapper)->bootstrap($this); $this['events']->dispatch('bootstrapped: '.$bootstrapper, [$this]); }
其中核心是 $this->make($bootstrapper)->bootstrap($this); 这一段,它在循环中会加载所有 $bootstrappers 数组中的内容,这个数组里面的内容是在 laravel/framework/src/Illuminate/Foundation/Http/Kernel.php 中的类变量 $bootstrappers 所定义的。第一个环境变量启动加载器就是我们加载配置文件所需要的,如下所示:
// laravel/framework/src/Illuminate/Foundation/Http/Kernel.php /** * The bootstrap classes for the application. * * @var string[] */ protected $bootstrappers = [ \Illuminate\Foundation\Bootstrap\LoadEnvironmentVariables::class, \Illuminate\Foundation\Bootstrap\LoadConfiguration::class, \Illuminate\Foundation\Bootstrap\HandleExceptions::class, \Illuminate\Foundation\Bootstrap\RegisterFacades::class, \Illuminate\Foundation\Bootstrap\RegisterProviders::class, \Illuminate\Foundation\Bootstrap\BootProviders::class, ];
源码中和代码中的 Bootstrap 相关的内容都是启动加载器的实现,从文件名就可以看出,这个启动加载器是加载环境变量相关内容的。.env 文件里面的配置信息也将是以整体的环境变量的形式加载到系统中。
// laravel/framework/src/Illuminate/Foundation/Bootstrap/LoadEnvironmentVariables.php $this->createDotenv($app)->safeLoad();
LoadEnvironmentVariables.php 中会通过上述代码进入到 DotEnv 组件中,通过以下方法读取配置文件相关的信息。
// vlucas/phpdotenv/src/Dotenv.php create() // vlucas/phpdotenv/src/Loader/Loader.php load()
最后通过 ServerConstAdapter.php 文件中的 write() 方法将这些配置文件中的信息写入到 $_SERVER 全局变量数组中。
//vlucas/phpdotenv/src/Repository/Adapter/ServerConstAdapter.php /** * Write to an environment variable, if possible. * * @param string $name * @param string $value * * @return bool */ public function write(string $name, string $value) { $_SERVER[$name] = $value; return true; }
在路由文件中,我们可以通过打印 \$_SERVER 数据看到配置文件里面我们配置过的信息。之后的读取,也直接是读取这个 $_SERVER 中的数据。
Route::get('/', function () { var_dump($_SERVER); var_dump(env('REDIS_PASSWORD')); // null $_SERVER['REDIS_PASSWORD'] = '123456'; var_dump(env('REDIS_PASSWORD')); // string '123456' return view('welcome'); });
其实反过来看,我们的 Laravel 就是将 .env 文件中的数据缓存到了全局变量 $_SERVER ,然后我们在将来使用的时候就直接从全局变量中获取就可以了,这样就可以避免下一次还要从文件读取,从而提高系统效率。
一开始以为就是简单地讲讲目录和配置文件,没想到吧,直接就进入源码的分析了。当然,这只是开胃菜而已。对于框架架构的学习,一定要配置好 XDebug 之类的调试工具,如果没这些工具,这种使用了许多 Composer 组件来回调用的代码还真不好找出最终实现的地方。
后面的文章也都会以这样的方式进行,需要注意的是,我们的源码都是在 vendor 目录下的,所以有的文章中这个路径我就没有写了。
【相关推荐:laravel视频教程】
以上がLaravel のディレクトリ構造と構成を 30 分で完了の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。