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


composer下載Laravel 5.4(由於PHP版本僅7.0,故未下載5.6)

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

        composer下載后已經生成APP_KEY,如果需要改變 使用命令 php artisan key:generate ,需要把php命令設置為全局

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

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

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

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

   database 文件夾包含了數據遷移及填充文件,如果你喜歡的話還可以將其作為 SQLite 數據庫存放文件夾;

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

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

   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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM