Laravel MVC的基本流程

航空母艦發表於2016-02-24

Laravel MVC框架

http://laravelacademy.org/resources-download

下載映象優化版:基於Laravel 官方 GitHub 倉庫原始碼的基礎上安裝了依賴庫(vendor),頁面開啟巨慢的問題我們把所有引用的google字型全部刪掉了等。

 

初始化配置

應用key

接下來要做的事情就是將應用的 key(APP_KEY)設定為一個隨機字串,如果你是通過 Composer 或者 Laravel 安裝器安裝的話,該 key 的值已經通過 php artisan key:generate 命令生成好了。通常,該字串應該是 32 位長,通過 .env 檔案中的 APP_KEY 進行配置,如果你還沒有將 .env.example 檔案重新命名為 .env,現在立即這樣做。如果應用 key 沒有被設定,使用者 Session 和其它加密資料將會有安全隱患!執行php artisan key:generate前提是你有個.env檔案.然後把根路徑下的.env.example的內容複製進去,再執行 php artisan key:generate

目錄許可權

安裝完 Laravel 後,需要配置一些目錄的讀寫許可權

chmod -R 777 bootstrap/cache
chmod -R 777 storage
開啟錯誤日誌:.env 開啟 debug,在app/storage/logs/laravel.log中找到具體錯誤

 

我們說說Laravel中Model,Controller,Views的工作流程,也就是下面這個順序:

1.註冊路由 ---> 2.建立控制器 ---> 3. 控制器中獲取資料庫資料 ---> 4.在檢視中展示資料

1註冊路由

我們在app/Http/routes.php中註冊了我們首頁的路由:

Route::get('/', 'ArticleController@index'); //首頁
Route::get('articles/{id}', 'ArticleController@show'); //get路由
Route::post('article/update', 'ArticleController@update'); //post路由
Route::resource('photo', 'PhotoController'); //restful

可以直接使用這個路由,所以我們可以進入下一步。

2建立控制器

建立控制器的時候你可以手動建立,不過還是推薦使用artisan這個命令列工具,在專案目錄之下(專案中的artisan檔案對應的目錄),命令列執行

php artisan make:controller ArticleController --plain
//php artisan make:controller PhotoController --resource //5.2 restful

這裡需要說明的是--plain這個參數列明只要一個簡單的controller,裡面不需要生成一堆如show(),create()等方法。

3控制器中獲取資料庫資料

建立模型,首先我們要新建一張表來儲存 Article,命令列執行

php artisan make:model Models/Article

成功以後,修改 migration 檔案database/migrations/***_create_articles_table.php 的相應位置為:

Schema::create('articles', function(Blueprint $table)
{
    $table->increments('id');
    $table->string('url')->comment('回撥通知地址');
    $table->integer('times')->default(0)->index()->comment('通知次數');
    $table->string('params')->comment('通知引數');
    $table->tinyInteger('is_success')->default(0)->index()->comment('是否通知成功');
    $table->timestamps();
});

之後執行:

php artisan migrate
在laravel框架ORM模型中預設會有三個時間欄位,created_at,updated_at,deleted_at,這三個時間欄位是框架預設操作,不用另加程式碼去處理,非賞方便:
ORM模型會自動新增上create_at欄位但寫入當前時間,而不用我們自己去新增這個欄位,在修改時會加上updated_at,預設情況下,Eloquent期望created_at和updated_at已經存在於資料表中,如果你不想要這些Laravel自動管理的列,在模型類中設定$timestamps屬性為false.當使用軟刪除時,框架不會直接刪除資料庫裡的資料,而是直接寫deleted_at指定當前刪除時間.如果我們想修改這三個欄位的名稱可以在對應的MODEL類中新增以下程式碼
const DELETED_AT='delete_at';
const UPDATED_AT='update_at';
const CREATED_AT = 'create_at';
去資料庫裡瞧瞧,articles 表已經躺在那兒啦。模型中加入
<?php namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Article extends Model {
    protected $table = 'articles'; //新增資料庫表名
    public $timestamps = false;  //關掉laravel內建時間戳
}
 然後再呼叫模型
class ArticleController extends Controller
{
    public function index()
    {
        $articles = Article::all();
        return $articles;
    }
}

如果你直接返回查詢到得資料,因為laravel可能是出於這樣的考慮:一般這種情況下地返回,通常都是在建立api功能,比如你為你的一個手機App寫的api一樣,json資料無疑是很好的選擇

 

在檢視中展示資料

這裡我們首先需要修改的是ArticleController中的index()方法:

<?php
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Routing\Controller; //不驗證時使用 2選1
//use App\Http\Controllers\Controller; 
//use ValidatesRequests validate
class ArticleController extends Controller
{
    /**
     * 顯示列表資料
     *
     * @param Request $request
     * @return Response
     */
    public function index(Request $request)
    {
        //$id = $request->input('id');
        $articles = Article::all();
        return view('articles.index', compact('articles'));
    }

    /**
     * Update the specified article.
     *
     * @param  Request $request
     * @param  int $id 路由引數傳入的輸入資料,只需要將路由引數置於其他依賴之後
     * @return Response
     */
    public function update(Request $request, $id)
    {
    }
}

我們只是修改了return這一行的程式碼,使用view()方法載入檢視,這個檢視就是位於resources/views/articles/中的index.blade.php(用的是blade模板引擎),最後使用compact('articles')將資料傳給檢視檔案。

 

路由直接訪問view,套靜態頁用

Route::get('/', function () {
    return view('welcome');
});

當使用者傳送一個get請求訪問我們站點的根目錄的時候,直接訪問這個試圖檔案位於resources/views/welcome.blade.php

 

laravel專案下面有4個資料夾:appbootstrappublicvendor,這4個資料夾下面又有很多個子資料夾,當你第一次看到這麼豐富的資料夾內容時,是不是覺得很有壓力?沒關係,我們會逐一的來了解不同的資料夾。
  1. app 包含了站點的controllers(控制器),models(模型),views(檢視)和assets(資源)。這些是網站執行的主要程式碼,你會將你大部分的時間花在這個目錄裡。
  2. bootstrap 用來存放系統啟動時需要的檔案,這些檔案會被如index.php這樣的檔案呼叫。
  3. public 這個資料夾是唯一外界可以看到的web伺服器的目錄。它含有laravel框架核心的引導檔案index.php,這個目錄也可用來存放任何可以公開的靜態資源,如css,Javascript,images等
  4. vender 包含Composer命令相關管理檔案,包含了許多PHP相關的app應用程式

laravel 獲取最後一條sql的小函式,放在第三方函式庫裡面就行了

function lastSql()
{
    $queries = DB::getQueryLog();
    $a = end($queries);
    $tmp = str_replace('?', '"' . '%s' . '"', $a["query"]);
    return vsprintf($tmp, $a['bindings']);
}

方法欺騙:讓HTML表單實現RESTFUL

HTML表單沒有支援 PUT 、PATCH 或 DELETE 請求。所以當定義 PUT 、PATCH 以及 DELETE 路由並在 HTML 表單中被呼叫的時候,您將需要新增隱藏 _method 欄位在表單中。傳送的 _method 欄位對應的值會被當做HTTP請求方法。舉例來說:

<form action="/foo/bar" method="POST">
    <input type="hidden" name="_method" value="PUT">
    <input type="hidden" name="_token" value="<?php echo csrf_token(); ?>">
</form>

測試在專案根目錄下簡單執行 phpunit 命令即可

Middleware是原來的路由filter的一個升級版,現在不用在filters.php裡定義過濾器,取而代之的是在 Middleware目錄中建立類,並在Kernel.php中配置全域性還是可選,全域性的Middleware在每個請求都會執行,而可選的就相當於原來的filter,可以在路由中使用,也可以在控制器中使用。

Laravel5常用的包 github.com

illuminate/html
nonfu/awesome-laravel //github Laravel精選資源大全
mccool/laravel-auto-presenter //MVP模式
swiggles/laravel-memcache //memcache擴充套件
Xethron/migrations-generator //從現有資料庫生成表遷移,包括索引和外來鍵!
nWidart/DbExporter //整個資料庫生成遷移,包括資料

 


 

相關文章