>  기사  >  PHP 프레임워크  >  30분 안에 Laravel 디렉터리 구조 및 구성을 완료하세요.

30분 안에 Laravel 디렉터리 구조 및 구성을 완료하세요.

WBOY
WBOY앞으로
2022-02-15 17:33:402721검색

이 글은 Laravel의 디렉토리 구조와 구성에 대한 지식을 제공합니다. Laravel의 디렉토리 구조는 초기 상태에서 상대적으로 더 풍부합니다. 기존 컨트롤러 외에도 스크립트를 준비하는 데 도움이 되며, 미들웨어와 같은 코드 파일의 디렉토리는 기본적으로 직접 사용할 수 있습니다. . 모든 사람에게 도움이 되기를 바랍니다.

30분 안에 Laravel 디렉터리 구조 및 구성을 완료하세요.

Laravel 디렉터리 구조 및 구성

Laravel의 디렉터리 구조는 초기 상태에서 상대적으로 풍부하며, 스크립트 및 미들웨어와 같은 코드를 준비하는 데도 도움이 됩니다. 기본적으로 파일 디렉터리를 직접 사용할 수 있습니다.

디렉토리 구조

먼저 루트 디렉터리에 무엇이 있는지 살펴보겠습니다.

30분 안에 Laravel 디렉터리 구조 및 구성을 완료하세요.

사실 이름을 보면 이러한 디렉터리의 역할을 알 수 있습니다. 예를 들어 앱 디렉터리는 특정 애플리케이션 코드입니다. config 디렉토리는 구성 파일 정보를 저장합니다. 이전 글에서 Laravel을 가상 머신에서 사용한다면 루트 디렉터리에 있는 server.php 파일을 사용해야 한다고 언급했습니다. 실제로 이 파일은 루트 디렉터리에 있는 public/index.php를 로드합니다.

bootstrap은 프레임워크를 시작할 때 로드해야 하는 파일입니다. 일반적으로 이 파일의 내용은 수정되지 않습니다. 이 디렉터리에는 캐시 관련 디렉터리 파일도 포함되어 있습니다. 데이터베이스는 분명히 데이터베이스 관련 콘텐츠입니다. public은 우리 프레임워크의 항목 디렉터리입니다. 직접 표시된 그림, 정적 파일 등과 같은 다른 리소스 파일도 여기에 배치할 수 있습니다. 리소스는 뷰와 컴파일되지 않은 리소스 파일을 저장합니다.

routes 디렉토리는 라우팅 파일이 저장되는 디렉토리입니다. 물론 이 디렉토리는 실제로 매우 중요한 라우팅 파일입니다. 여기에는 기본적으로 web.php, api.php,channel.php 및 console.php가 포함되어 있으며 각각 기본 웹 요청 라우팅, API 요청 라우팅, 등록 이벤트 브로드캐스트 및 클로저 기반 콘솔 스크립트 명령을 나타냅니다.

저장 디렉터리는 캐시, 로그 및 기타 정보를 포함하여 애플리케이션에서 생성된 다양한 파일을 저장하는 데 사용됩니다. 테스트 디렉토리에는 자동화된 테스트와 관련된 콘텐츠가 포함되어 있습니다.

이 디렉토리에서는 앱 디렉토리에 포함된 콘텐츠에 중점을 두겠습니다.

30분 안에 Laravel 디렉터리 구조 및 구성을 완료하세요.

app 디렉토리는 애플리케이션 개발에서 가장 많이 사용되는 디렉토리입니다. 애플리케이션의 컨트롤러, 모델, 미들웨어 및 기타 콘텐츠가 모두 이 디렉터리에 있습니다.

Console 디렉터리는 우리가 작성한 명령줄 스크립트 디렉터리입니다. 즉, php artisan을 통해 사용자 정의하고 실행할 수 있는 명령줄 기능이 모두 이 디렉터리에 있습니다.

예외는 사용자 정의할 수 있는 예외 클래스입니다. 모델은 사용자 정의된 데이터 모델을 저장합니다. Providers 디렉터리에는 사용자 정의할 수 있는 기본 서비스 공급자와 일부 서비스 공급자가 저장됩니다.

다음은 Http 디렉터리입니다.

컨트롤러 말할 필요도 없이 컨트롤러는 모두 여기에 작성되어 있습니다. 미들웨어에는 기본 미들웨어가 포함되어 있습니다. 물론 맞춤형 미들웨어도 이 디렉터리에 작성할 수 있습니다.

Kernel.php는 커널을 요청하기 위한 제어 파일입니다. 이 파일에서는 요청된 미들웨어를 정의할 수 있습니다. 이것도 매우 중요한 핵심문서입니다. 앞으로 학습할 때 자세히 설명하겠습니다.

구성 파일

디렉토리 구조에 대한 내용은 실제로 위와 같습니다. 다음으로 루트 디렉터리 아래의 config 디렉터리에 있는 내용인 구성 파일을 살펴보겠습니다. 여기에 있는 내용도 우리에게 자주 필요합니다. 접촉하다.

30분 안에 Laravel 디렉터리 구조 및 구성을 완료하세요.

사실 이러한 구성 파일의 이름으로 해당 파일의 기능을 알 수 있습니다. 다음 기사에서는 곧 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视频教程

위 내용은 30분 안에 Laravel 디렉터리 구조 및 구성을 완료하세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제