Laravel 框架結構 以及目錄文件解讀(學習筆記)

composer下載Laravel 5.4(因爲PHP版本僅7.0,故未下載5.6)php

        composer create-project laravel/laravel your-project-name --prefer-dist "5.4.*"css

        composer下載後已經生成APP_KEY,若是須要改變 使用命令 php artisan key:generate ,須要把php命令設置爲全局前端

下面咱們說說根文件夾下的幾個文件和文件夾storage 和 bootstrap/cache 目錄應該容許寫入)mysql

   app 文件夾  包含了應用的核心代碼,此外你爲應用編寫的代碼絕大多數也會放到這裏(詳情能夠看官網);laravel

         bootstrap 文件夾包含了少量文件,用於框架的啓動和自動載入配置,還有一個 cache 文件夾用於包含框架爲提高性能所生成的文件,如路由和服務緩存文件;git

   config 文件夾包含了應用全部的配置文件,建議通讀一遍這些配置文件以便熟悉全部配置項;web

   database 文件夾包含了數據遷移及填充文件,若是你喜歡的話還能夠將其做爲 SQLite 數據庫存放文件夾;sql

   public 文件夾包含了入口文件 index.php 和前端資源文件(圖片、JavaScript、CSS等);數據庫

   resources 文件夾包含了視圖文件及原生資源文件(LESS、SASS、CoffeeScript),以及本地化語言文件;json

   routes 文件夾包含了應用的全部路由定義。Laravel默認提供了三個路由文件:web.phpapi.phpconsole.php

     web.php 文件包含的路由都會應用web中間件組,具有Session、CSRF防禦以及Cookie加密功能,若是應用無需提供無狀態的、RESTful風格的API,全部路由都會定義在web.php文件。

    api.php 文件包含的路由應用了api中間件組,具有頻率限制功能,這些路由是無狀態的,因此請求經過這些路由進入應用須要經過token進行認證而且不能訪問Session狀態。

    console.php 文件用於定義全部基於閉包的控制檯命令,每一個閉包都被綁定到一個控制檯命令而且容許與命令行IO方法進行交互,儘管這個文件並不定義HTTP路由,可是它定義了基於控制檯的應用入口(路由)。

   storage 文件夾包含了編譯過的Blade模板、基於文件的session、文件緩存,以及其它由框架生成的文件,該文件夾被細分爲成appframeworklogs子文件夾,app文件夾用於存放應用要使用的文件,framework文件夾用於存放框架生成的文件和緩存,最後,logs文件夾包含應用的日誌文件;

   storage/app/public 文件夾用於存儲用戶生成的文件,好比能夠被公開訪問的用戶頭像,要達到被訪問的目的,你還須要在public文件夾下生成一個軟鏈接 storage 指向這個文件夾。你能夠經過 php artisan storage:link 命令生成這個軟連接。

   tests 文件夾包含自動化測試,其中已經提供了一個開箱即用的PHPUnit示例;每個測試類都要以 Test 開頭,你能夠經過 phpunit 或 php vendor/bin/phpunit 命令來運行測試。

   vendor文件夾包含全部Composer依賴,這個文件咱們不要動,也不要修改裏面的代碼。

  .env文件(如沒有,請複製一份.env.example更名爲.env)

            上面說的app_key就在.env文件中,.env文件就是Laravel的配置文件,一看便懂, 同時和config文件夾下的database一塊兒配合使用

APP_ENV=local
APP_KEY=base64:Wt1CEnZTaB7kq82syINzBqHcNCXxXL7uY1KMEmW/23I=
APP_DEBUG=true
APP_LOG_LEVEL=debug
APP_URL=http://localhost

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret

BROADCAST_DRIVER=log
CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=sync

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

MAIL_DRIVER=smtp
MAIL_HOST=mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null

PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=

.gitignore 文件 用於設置git的忽略文件

artisan 文件 中的代碼跟public/index.php的代碼基本同樣,猜想應該是經過artisan命令來運行程序,作一些自動操做,好比數據庫遷移等。

composer 文件 與package.json 不必說,你們都知道

phpunit.xml 文件 單元測試的配置文件

最後說下server.php文件。

這是根目錄下的惟一.php文件,代碼以下

$uri = urldecode(
    parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)
);

// This file allows us to emulate Apache's "mod_rewrite" functionality from the
// built-in PHP web server. This provides a convenient way to test a Laravel
// application without having installed a "real" web server software here.
if ($uri !== '/' && file_exists(__DIR__.'/public'.$uri)) {
    return false;
}

require_once __DIR__.'/public/index.php';
註釋翻譯:該文件容許咱們從內置的PHP網頁服務器模擬Apache的「mod_rewrite」功能。 這提供了一種方便的方式,而沒必要在此安裝一個「真正」的網絡服務器軟件來測試Laravel應用程序。

其實這個文件模擬了web server的rewrite功能,如Apachemod_rewrite模塊,以及Nginx的配置:

好比咱們在web server(本文使用Apache)中設置以下:

<VirtualHost *:80>
    DocumentRoot "F:/workspace"
    ServerName server.laravel.com
</VirtualHost>
<VirtualHost *:80>
    DocumentRoot "F:/workspace/laravel_study/public"
    ServerName self.laravel.com
</VirtualHost>

  此時 http://server.laravel.com/laravel_study/server.php   和  http://self.laravel.com  訪問的都是 public下的index.php,就是說我能夠經過訪問server.php來訪問個人項目,同時若是有須要的話,能夠在裏面對路徑URL等作一些處理,固然了server.php這個文件自己就不常使用,此處僅作了解。

  最後順道說下laravel中的.htaccess文件

  RewriteCond就像咱們程序中的if語句同樣,表示若是符合某個或某幾個條件則執行RewriteCond下面緊鄰的RewriteRule語句,這就是RewriteCond最原始、基礎的功能,爲了方便理解,下面來看看幾個例子

RewriteEngine on
RewriteCond  %{HTTP_USER_AGENT}  ^Mozilla//5/.0.*
RewriteRule  index.php            index.m.php
RewriteCond  %{HTTP_USER_AGENT}  ^Lynx.*
RewriteRule  index.php            index.L.php 
RewriteRule  index.php            index.b.php

  上面語句的做用是當你是用FF瀏覽器訪問index.php這個文件的時候,會自動讓你訪問到index.m.php這個文件,當你是用一些移動終端訪問的 時候,會讓你對index.php這個文件的訪問實際訪問的是index.L.php去,若是你是用其它的瀏覽器訪問的時候,會讓你跳到 index.b.php。在說形象一點,上面的語句就等同於程序裏面的下面語句(依PHP語句爲例):

if($_SERVER['HTTP_USER_AGENT'] == 'Mozilla/5.0')
{
//跳轉到對index.m.php的訪問
}
else if($_SERVER['HTTP_USER_AGENT'] == 'Lynx')
{
//跳轉到對index.L.php的訪問
}
else
//跳轉到對index.b.php的訪問

在看例2:
  RewriteCond %{HTTP_REFERER} (www.test.cn)
  RewriteRule (.*)$ test.php
  上面語句的做用是若是你訪問的上一個頁面的主機地址是www.test.cn,則不管你當前訪問的是哪一個頁面,都會跳轉到對test.php的訪問。
在看例三:

RewriteCond %{REMOTE_HOST} ^host1.* [OR]
RewriteCond %{REMOTE_HOST} ^host2.* [OR]
RewriteCond %{REMOTE_HOST} ^host3.*
RewriteRule (.*)$ test.php

上面語句的做用是若是你的地址是host1或host2或host3的時候,則就跳到對test.php。從這裏能夠看出,RewriteCond語句之間默認的是AND,若是想要OR,則要明確的寫出來。

下面是一些經常使用用的重寫規則:  RewriteCond %{REQUEST_FILENAME} !-f   //若是文件存在,就直接訪問文件,不進行下面的RewriteRule.(不是文件或文件不存在就執行重寫)  RewriteCond %{REQUEST_FILENAME} !-d   //#若是目錄存在就直接訪問目錄不進行RewriteRule  RewriteCond %{REQUEST_URI} !^.*(/.css|/.js|/.gif|/.png|/.jpg|/.jpeg)$ //#若是是這些後綴的文件,就直接訪問文件,不進行Rewrite

相關文章
相關標籤/搜索