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.php
、api.php
和console.php
。
web.php
文件包含的路由都會應用web中間件組,具備Session、CSRF防護以及Cookie加密功能,如果應用無需提供無狀態的、RESTful風格的API,所有路由都會定義在web.php
文件。
api.php
文件包含的路由應用了api
中間件組,具備頻率限制功能,這些路由是無狀態的,所以請求通過這些路由進入應用需要通過token進行認證並且不能訪問Session狀態。
console.php
文件用於定義所有基於閉包的控制台命令,每個閉包都被綁定到一個控制台命令並且允許與命令行IO方法進行交互,盡管這個文件並不定義HTTP路由,但是它定義了基於控制台的應用入口(路由)。
storage
文件夾包含了編譯過的Blade模板、基於文件的session、文件緩存,以及其它由框架生成的文件,該文件夾被細分為成app
、framework
和logs
子文件夾,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
功能,如Apache
的mod_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