Laravel 新手教程:目录结构和配置
Laravel 的目录结构在初始状态下相对更丰富。除了传统的驱动程序之外,它还可以帮助我们准备脚本和中间件等代码文件。目录,基本可以直接启动使用。
目录结构
首先我们看看根目录有什么。
其实根据这些目录的名字就可以知道它们的作用。例如,应用程序目录是应用程序特定代码。 config目录存放配置文件信息。在上一篇文章中,我们提到如果在虚拟机中运行 Laravel,则需要使用根目录下的 server.php 文件。事实上,这个文件将 public/index.php 加载到根目录中。文档。
bootstrap是启动框架时需要加载的文件。一般来说,这个文件的内容不会改变。该目录还包含缓存相关的目录文件。数据库显然是数据库相关的内容。 public 是我们框架的输入目录。直接显示的图片、静态文件等其他资源文件也可以放在这里。 resources 存储视图和未编译的资源文件。
routes目录是存放路由文件的目录。这个目录非常重要。当然,里面的路由文件其实非常重要。默认包含web.php、api.php、channels.php、console.php,分别代表默认的Web请求路由、API请求路由、注册事件广播、基于闭包的控制台脚本命令。存储目录
用于存储应用程序生成的各种文件,包括缓存、日志等信息。测试目录包含与自动化测试相关的内容。
在这些目录中,我们重点关注应用程序目录中包含的内容。
应用程序目录是我们开发应用程序时最常用的目录。该目录包含我们应用程序的所有驱动程序、模型、中间件和其他内容。
Console目录是我们编写的命令行脚本的目录,即通过php artisan可以自定义运行的命令行功能都在这个目录下。
异常是我们可以自定义的异常类。模型存储我们定制的数据模型。 Providers目录存储了默认的以及一些我们可以自定义的服务提供者。
接下来是Http目录。
驱动不用说,所有的驱动都写在这里了。中间件包括默认中间件。当然我们定制的中间件也可以写入这个目录。
Kernel.php是内核请求控制文件。在这个文件中我们可以定义所需的中间件。这也是一份非常重要的背景文件。这个我们以后学习的时候会详细讲解。
配置文件
目录结构的内容其实就是上面的。接下来我们看一下配置文件,它是根目录下配置目录的内容。这里的内容也是我们经常需要接触到的。
其实从这些配置文件的名称就可以看出它们的作用了。下一篇文章我们很快就会进入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=mysqlDB_HOST=127.0.0.1DB_PORT=3306DB_DATABASE=laravelDB_USERNAME=rootDB_PASSWORD=
这里我们可以配置当前环境下的数据库连接信息。这样的配置有什么优点呢?
采用独立配置文件的形式,很容易实现配置中心,也很容易分别部署测试环境和正式环境。一般来说,我们不会把这个.env放到git中或者和代码一起上传。在正式或测试环境中,配置是手动或通过配置中心完成的。在这种情况下,我们不需要修改源代码。我们只需要使用不同的.env配置文件就可以在不同的环境中运行相同的代码。
通过XDebug,我们可以追踪到env()方法调用了底层DotEnv Composer vlucas组件来读取、写入和加载PHPENV类型的文件。
要在程序运行时加载,我们使用以下代码加载它。
// laravel/framework/src/Illuminate/Foundation/Application.phpforeach ($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 类变量定义。第一个环境变量bootloader就是我们需要加载的配置文件,如下:
// laravel/framework/src/Illuminate/Foundation/Http/Kernel.php/** * The bootstrap classes for the application. * * @var string[] */protected $bootstrappers = [ IlluminateFoundationBootstrapLoadEnvironmentVariables::class, IlluminateFoundationBootstrapLoadConfiguration::class, IlluminateFoundationBootstrapHandleExceptions::class, IlluminateFoundationBootstrapRegisterFacades::class, IlluminateFoundationBootstrapRegisterProviders::class, IlluminateFoundationBootstrapBootProviders::class,];
源码中Bootstrap相关的内容,从名字文件中可以看出代码是bootloader的实现,这个bootloader加载的是相关的内容环境变量。 .env文件中的配置信息也会以全局环境变量的形式加载到系统中。
// laravel/framework/src/Illuminate/Foundation/Bootstrap/LoadEnvironmentVariables.php$this->createDotenv($app)->safeLoad();
LoadEnvironmentVariables.php通过上述代码进入DotEnv组件,并使用以下方法读取配置文件相关信息。
// vlucas/phpdotenv/src/Dotenv.phpcreate() // 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目录下,所以我在有些文章中没有写这个路径。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。