㈠ 為什麼 Laravel 會成為最成功最流行的 php 框架
Laravel是一個有著美好前景的年輕框架,它的社區充滿著活力,同時提供了完整而清晰的文檔,而且為快速、安全地開發現代應用提供了必要的功能。
2011年,Taylor Otwell首次將Laravel帶給這個世界,彼時,Laravel就是一個全新且現代的框架。Laravel基於MVC架構,可以滿足諸如事件處理、用戶身份驗證等各種需求,同時通過包管理實現模塊化和可擴展的代碼,並且對資料庫管理有著健壯的支持。
不管是專家還是新手,一旦接觸到Laravel,都會有相見恨晚之感——這正是你在為PHP項目尋找的框架。本文我們將討論為什麼Laravel會成為最成功最流行的PHP框架。
模塊化&可擴展性
Laravel是模塊化和可擴展的,你可以在包含超過5500個程序包的Packalyst中找到你想要添加的任何代碼。
微服務&API
Lumen是一個由Laravel衍生的專注於性能的微框架。使用Lumen提供的高性能API你可以更加簡單快速地開發微型項目。Lumen使用最小的配置集成了Laravel的所有重要特性,你可以通過將代碼復制到Laravel項目來實現框架的完整遷移。
<?php
$app->get('/', function() {
return view('lumen');
});
$app->post('framework/{id}', function($framework) {
$this->dispatch(new Energy($framework));
});
HTTP路由
Laravel擁有類似於Ruby on Rails的快速高效的路由系統。它可以讓用戶通過在瀏覽器上輸入路徑的方式讓應用程序的各部分相關聯。
Route::get('/', function () {
return 'Hello World';
});
HTTP中間件
Route::get('/', function () {
return 'Hello World';
});
Laravel可以通過中間件對應用進行保護——中間件會處理分析和過濾到達伺服器的HTTP請求。你可以使用中間件來驗證注冊用戶、避免跨站腳本攻擊(XSS)以及其它安全問題。
<?php
namespace App\Http\Middleware;
use Closure;
class OldMiddleware {
public function handle($request, Closure $next) {
if ($request->input('age') <= 200) {
return redirect('home');
}
return $next($request);
}
}
緩存
Laravel提供了健壯的緩存系統,使用緩存可以讓應用載入地更加快速,從而帶來更好的用戶體驗。
Cache::extend('mongo', function($app) {
return Cache::repository(new MongoStore);
});
身份驗證
安全是至關重要的。Laravel自帶對本地用戶的身份驗證,並可以使用「remember」 選項來記住用戶。此外你還可以引入一些額外參數,例如是否是活躍用戶。
if (Auth::attempt(['email' => $email, 'password' => $password, 'active' => 1 ], $remember)) {
// The user is being remembered...
}
集成Stripe
Laravel Cashier可以滿足你開發支付系統過程中所需要的任何需求。除此之外,它還同步並集成了用戶身份驗證系統。所以,你不再需要擔心如何將計費系統集成到開發中了。
$user = User::find(1);
$user->subscription('monthly')->create($creditCardToken);
任務自動化
Elixir是一個讓我們可以使用Gulp定義任務的Laravel API,我們可以使用Elixir定義預處理器來壓縮CSS 和JavaScript。
elixir(function(mix) {
mix.browserify('main.js');
});
加密
一個安全的應用應該做到可以對數據進行加密。在Laravel中,可以使用OpenSSL和AES-256-CBC加密演算法來滿足你所有的加密需求。此外,所有的加密值都通過認證碼進行簽名以避免加密信息被篡改。
use Illuminate\Contracts\Encryption\DecryptException;
try {
$decrypted = Crypt::decrypt($encryptedValue);
} catch (DecryptException $e) {
//
}
事件處理
Laravel應用中對事件的定義、記錄和監聽都非常便捷。服務提供者EventServiceProvider中的listen屬性包含了應用中的所有事件列表。
protected $listen = [
'App\Events\PodcastWasPurchased' => [
'App\Listeners\EmailPurchaseConfirmation',
],
];
分頁
在Laravel中分頁非常簡單,因為它能夠根據用戶在瀏覽器中的當前頁生成一系列分頁鏈接。
<?php
namespace App\Http\Controllers;
use DB;
use App\Http\Controllers\Controller;
class UserController extends Controller {
public function index() {
$users = DB::table('users')->paginate(15);
return view('user.index', ['users' => $users]);
}
}
對象關系映射(ORM)
Laravel包含了一個資料庫處理層,其中的對象關系映射被稱作Eloquent。另外這個對象關系映射也適用於PostgreSQL。
$users = User::where('votes', '>', 100)->take(10)->get();
foreach ($users as $user) {
var_mp($user->name);
}
單元測試
單元測試的開發是一個耗費大量時間的任務,但是它卻保證了我們的應用能夠正常工作,不出問題。Laravel使用PHPUnit進行單元測試。
<?php
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseTransactions;
class ExampleTest extends TestCase {
public function testBasicExample() {
$this->visit('/')->see('Laravel 5')->dontSee('Rails');
}
}
待辦事項清單(Queue)
Laravel提供了在後台使用待辦事項清單(to do list)處理復雜、漫長流程的選擇,好吧,其實就是隊列,隊列可以讓我們非同步處理某些流程而不需要用戶在載入頁面時長時間的等待。
Queue::push ( new SendEmail ( $ message ));
㈡ GitHub 上有哪些比較有趣的 PHP 項目
Hprose for php 的加速擴展。其中所包含的 hprose 序列化和反序列化速度秒殺 php 內一切其它序列化擴展的速度,比如 php 序列化,json,msgpack,igbinary等。
㈢ 怎麼樣使用php的laravel框架快速集成微信登錄
1. 安裝php_weixin_provider
在項目下運行composer require thirdproviders/weixin,即可完成安裝。安裝成功後,在項目的vendor目錄下應該能看到php_weixin_provider的庫文件:
image
2. 配置微信登錄的參數
一共有7個參數可以配置,分別是:
client_id:對應公眾號創建的應用appid
client_secret:對應公眾號創建的應用appid
redirect:對應微信授權成功後的回調地址
proxy_url:對應微信授權的代理服務地址(其作用可閱讀這篇文章了解)
device:區別是PC端微信登錄還是移動端微信登錄,默認值為pc,如果是移動端,可設置為空
state_cookie_name:授權鏈接中會包含隨機的state參數,這個參數在微信回調的時候會原封不動的返回來,屆時可通過驗證state參數是否與授權鏈接中傳入的參數相同,來判斷請求是否有效,防止CSRF攻擊。這個方案,會在授權時把state參數先存到cookie裡面,所以這個參數用來指定這個state參數存入的cookie名稱,默認值是wx_state_cookie
state_cookie_time:指定wx_state_cookie的有效時長,默認是5分鍾
這七個參數有2種設置方式。
第一種是把這些參數以大寫的形式配置到.env配置文件裡面:
image
註:1、每個配置項都是大寫,且以WEIXIN_開頭;2、前三個配置項與前面介紹的參數名稱不完全一致,KEY對應client_id,SECRET對應client_secret,REDIRECT_URI對應redirect;3、其它的與前面介紹的參數名稱一致。
第二種是把這些參數配置到config/services.php文件裡面去:
image
這種方式的配置,每個配置項的名稱與前面介紹的一致。
要注意的內容:
由於php_weixin_provider是基於laravel/socialite實現的,它要求必須配置client_id,client_secret和redirect,否則php_weixin_provider實例化過程就會出錯;對於client_id和client_secret,我認為統一配置在一個地方是沒有問題的,但是對於redirect,如果統一配置,不一定符合所有場景的需求,因為不是每一個用到微信登錄的地方,最後的回調地址都是同一個;所以建議把redirect先配置成一個有效或無效非空的回調地址;反正在後面使用php_weixin_provider的時候還可以在調用的時候更改這個參數的值。
proxy_url如果有,也建議配置在公共的地方;
state_cookie_name和state_cookie_time由於都有默認值,基本上無需重新配置;
device可以在使用的時候再指定。
所有配置參數都可以在使用的時候重新指定。
3. 注冊php_weixin_provider
在項目的config/app.php文件裡面,找到providers配置節,把如下代碼加到它的配置數組裡面:
image
4. 注冊第三方登錄事件的監聽
在項目的app/Providers/EventServiceProvider.php裡面加入以下代碼:
image
laravel框架整體上是一種IOC跟事件驅動的思想,熟悉js就會對事件驅動非常熟悉,熟悉設計模式,就會對IOC(控制反轉,也稱為DI:依賴注入)比較熟悉,這個是理解第3步和第4步配置作用的關鍵。
5. 編寫微信登錄的介面
舉例如下:
+ View code
Socialite::with('weixin')會返回php_weixin_provider的實例,也就是它:
image
拿到這個實例之後,就可以採用鏈式的方式調用它提供的所有public方法,比如設置配置參數,setDevice等等。
6. 編寫微信登錄回調的介面
舉例如下:
+ View code
通過Socialite::with('weixin')拿到php_weixin_provider實例後,調用user方法,就會自動跟微信調用相關介面,並把微信的返回值封裝成對象返回。如果在此過程中,有任何錯誤都會以異常的形式拋出,比如state參數校驗失敗,比如code失效等。
返回的$user對象包含的有效屬性有:
image
小結:
這個方案是基於laravel/socialite實現,並發布到composer來使用的。laravel/socialite是laravel官方提供的第三方登錄的模塊,基於它可以很方便的集成大部分第三方平台的認證,目前它官方已經提供很多第三方的登錄實現:https://socialiteproviders.github.io/。除了國外的facebook,google,github等,國內的微信,微博,qq也都有提供。我在一開始也用的是它官方提供的默認的微信登錄provider來做的,但是後來我發現了以下幾個問題:
1. 不支持微信授權的代理;
2. pc端跟移動端竟然還是分兩個項目來做的:
image
3. 它封裝的user對象里竟然不包含unionid
4. 更改配置參數的方式,實在是讓人覺得難以使用:
image
所以我就在它官方的微信登錄provider基礎上,按照自己的想法,重新實現了一個來解決我發現的這些問題
㈣ 開源精粹(二)!22個實用、有趣的開源項目
作為一名開源愛好者,發掘優秀的開源項目是一件非常有趣的事情。在第一期中,我分享了單頁個人網站模板、組裝式 Flutter 應用框架、PHP 客戶端庫、Java 診斷工具等一些實用的庫和工具。本期依舊會為大家分享一些前端、後端、移動開發的相關工具,希望你能「淘」到適合自己的工具。
1.Vue-EasyTable
Vue-EasyTable 是一款基於 Vue2.x 的 table 組件,具備自適應、表頭與列固定、自定義單元格樣式、自定義 Loading 等功能。
2.React-Calendar
這是一款具備原生日期格式的日歷組件。它不依賴 Moment.js,支持日期選擇范圍,涵蓋了各國語言,開箱即用。
3.Matter
CSS 實現的 Material 組件合集項目,作者已將部分作品開源,效果可以在 CodePen 上查看。
4.Revery
Revery 是一款用於構建高性能、跨平台桌面應用的框架。它類似於加速版的原生 Electron,除了擁有類似 React / Rex 的庫,還具備 GPU 加速渲染功能,其內置的編譯器速度也相當快。
5.Web Accessibility Guide
這是一個精選了 Web 可訪問性貼士、技巧和最佳實踐的開源項目,你將會學習到一些改善 Web 可訪問性的實用做法。
1.SOFAJRaft
SOFAJRaft 是螞蟻金服開源的生產級 Java Raft 演算法庫,它基於 Raft 一致性演算法的生產級高性能 Java 實現,支持 MULTI-RAFT-GROUP,適用於高負載低延遲的場景,易於使用。
2. Dragonwell
阿里開源了 OpenJDK 發行版 Dragonwell,它提供長期支持,包括性能增強和安全修復。在數據中心大規模 Java 應用部署情況下,可以大幅度提高穩定性、效率以及性能。
3.Lawoole
Lawoole 是一款基於 Laravel 和 Swoole 的高性能 PHP 框架。它兼具了 Laravel 的特點,還解決了其功能背後的性能問題。同時,你還能感受到與 Laravel 一樣的編碼體驗。
4.AntNest
AntNest 是一個簡潔、快速的非同步爬蟲框架。它僅有 600 行代碼,基於 Python 3.6+.
5.PHP-Awesome
這個倉庫匯集了 PHP 優秀的資源,供你查詢和參考。
1.FlutterBoost
FlutterBoost 是閑魚開源的新一代 Flutter-Native 混合解決方案。它能夠幫你處理頁面的映射和跳轉,你只需要關心頁面的名字和參數即可。
2.MyLayout
MyLayout 是一套 iOS 界面視圖布局框架,可謂 iOS 下的界面布局利器。它集成了 iOS Autolayout、Size Classes、Android 的 5 大布局體系、HTML/CSS 的浮動定位技術以及 Flex-Box 和 Bootstrap 框架等主流的平台的界面布局功能,並提供了一套簡單、完備的多屏幕尺寸適配的解決方案。
3.SegementSlide
SegementSlide 是一個 iOS UI 庫,它具備完整的滑滾及切換組件,旨在解決多層 UIScrollView 嵌套滾動的問題。
1.DevHub
DevHub 是一款跨平台的 GitHub 通知管理客戶端,支持 Android、 iOS、網頁和桌面上使用,幫助你便捷的接收 GitHub 各類通知。
2.Reqman
Reqman 是一個幫助後端工程師進行 API 測試的工具,同時也是一個基於 Node.js 的爬蟲工具。
3.FreeCodeCamp
說到 FreeCodeCamp,或許大家不會陌生,而這個項目就是他們建立的開源課程和相應的代碼庫。網站提供了 6 大認證課程,也涉及了全棧開發認證。如果你感興趣,不妨了解下。
4.Gitter
Gitter 是 GitHub 小程序客戶端,作者採用 Taro 框架 + Taro UI 進行開發,而小程序內數據則來自 GitHub Api V3.
5.Awesome Podcasts
這個項目收集了各類實用的播客,涵蓋了主流的編程語言,希望對你提升技術水平有所幫助。
6.編程圖書大全
書籍不光能在你迷茫的時候,給予你答案,還能在你提升技能的時候,給予你幫助。這個倉庫收集了眾多編程圖書,涉及主流編程語言、人工智慧、演算法、Linux、大數據等。看看,有木有你需要的。
7.VS Code Netease Music
很多開發者喜歡邊寫代碼,邊聽音樂,VS Code Netease Music 這個插件就能滿足你在 VS Code 上聽歌的願望。它使用 Webview 實現,不依賴命令行播放器。
Star-Battle
Star-Battle 是一款使用 JavaScript ES6、Canvas 開發的飛船射擊類 游戲 。來 Enjoy 吧。
註:
如需轉載,煩請按下方註明出處信息,謝謝!
㈤ 如何高效地學習 Laravel 框架
推薦學習路徑
1. 框架的使用知識學習
基於以上的思想,我創建了 《Laravel 實戰課程》,計劃中有三本(也有可能更多),分別是:
第一本 —— 《Laravel 入門教程 - 從零到部署上線》
第二本 —— 《Laravel 進階課程 - 從零開始構建論壇系統》
第三本 —— 《Laravel 高級課程 - 構架 API 伺服器》
第一本書教授如何使用 Laravel 一步一步構建一個類似新浪微博的應用,書中很多技術話題會被一帶而過,這是有意而為之的,我們希望讓讀者保持對編碼線索的專注,不被篇幅悠長的名詞解釋分心。通過閱讀本教程,你將學到如 HTML、CSS、JavaScript、PHP 和 Laravel 等 Web 開發相關的基礎知識。不僅如此,本書還會對這些基礎知識點進行延伸擴展,為你講解一些在 Web 開發中更為專業、實用的技能,如 Git 工作流、Laravel Mix 前端工作流、Bootstrap 框架基本使用等。這些知識將為你未來的編程開發奠定下堅實的基礎。
第二本以構建論壇項目 LaraBBS 為線索,展開對 Laravel 框架的全面學習。編碼規范遵循 Laravel 項目開發規范 ,應用程序架構思路貼近 Laravel 框架的設計哲學。在論壇系統的構建中,我們將學到多角色用戶許可權系統、管理員後台、注冊驗證碼、圖片上傳、圖片裁剪,XSS 防禦、自定義命令行、自定義中間件、任務調度、隊列系統的使用、應用緩存、Redis、模型事件監控、表單驗證、消息通知、郵件通知、模型修改器等知識。在本課程的學習中,你不僅能學到使用 Laravel 開發一個論壇項目,還能學到安全優先、高擴展性的大型項目架構經驗。
第三本將以構建 API 伺服器為目標,來展開。目前本課程正在緊張撰寫中,敬請期待。
2. 框架的底層實現學習
學完了以上三本書,你將擁有一定的項目開發經驗,對框架的功能使用也會有一個比較全面的系統性理解。這時候,會是學習『底層實現』的好時機。
底層實現的知識學習,可以從文檔開始,打開 Laravel 的文檔中心 ——d.laravel-china.org,找到最新版本的 Laravel 文檔,然後仔細閱讀 2、3 遍。因為有了上面的項目經驗,此時的文檔閱讀啃起來會輕松多了。
閱讀文檔後,可以嘗試看下 Laravel 底層的源碼,看看這些框架的功能都是怎麼實現的。
學習過程中可以適當做筆記,例如:
zhangbao同學的Laravel 文檔閱讀筆記
leoyang同學的Laravel 源碼分析筆記
錯誤的學習方法
一上來就開始啃文檔d.laravel-china.org。
如果你是新手,有太多的新概念你需要學習,你會發現學習起來非常艱難,甚至懷疑文檔是不是寫的太爛了(社區里經常出現這種抱怨)。
事實上,不是文檔寫的太爛,而是你把文檔用錯了。文檔的『目的』是快速查閱,一份優秀文檔的標準是語言簡練,釋義,這個 Laravel 的文檔做的很棒。但是,文檔並不適合做入門學習使用,上面我們已經講過,原因是信息量太大。
尋找網路上零散的課程進行學習。
如果你想學習單個概念,這些零散的小課程會很方便。但是,如果是想以閱讀大量課程來達到系統性學習的目的,你將會很失望。很多時候你會感覺 —— 你好像學了很多,學了很久,以為自己學會了,但是心裡還是沒底氣。
你需要的是通過項目,完整的項目,將所有的知識串起來去記憶。你的作品,清清楚楚擺在面前,看著你一步步構建出來的一套系統,自信心也會有所增加。
一開始就學習高級話題,如服務容器、服務提供器、Facades、Contracts、Repository 等
很多時候你會發現這些話題晦澀難懂,很難學習。並且即使你毅力比較好,死記硬背,很快也會忘記,學習效率非常低下。然後最重要的,學會這些概念,並無法使你掌握構建一個完整項目的能力。
㈥ laravel 控制器在哪個文件夾
根目錄/app/http/Controllers
laravel目錄結構:
註:寫本文時參照的是5.1.4版本
目錄或文件 說明
|–app 包含Controller、Model、路由等在內的應用目錄,大部分業務將在該目錄下進行
||–Console 命令行程序目錄
|||–Commands 包含了用於命令行執行的類,可在該目錄下自定義類
|||–Kernel.php 命令調用內核文件,包含commands變數(命令清單,自定義的命令需加入到這里)和schele方法(用於任務調度,即定時任務)
||–Events 事件目錄
||–Exceptions 包含了自定義錯誤和異常處理類
||–Http HTTP傳輸層相關的類目錄
|||–Controllers 控制器目錄
|||–Kernel.php 包含http中間件和路由中間件的內核文件
|||–Middleware 中間件目錄
|||–Requests 請求類目錄
|||–routes.php 強大的路由
||–Jobs 該目錄下包含隊列的任務類
||–Listeners 監聽器目錄
||–Providers 服務提供者目錄
||–User.php 自帶的模型實例,我們新建的Model默認也存儲在該目錄
|–artisan 強大的命令行介面,你可以在app/Console/Commands下編寫自定義命令
|–bootstrap 框架啟動載入目錄
||–app.php 創建框架應用實例
||–autoload.php 自動載入
||–cache 存放框架啟動緩存,web伺服器需要有該目錄的寫入許可權
|–composer.json 存放依賴關系的文件
|–composer.lock 鎖文件,存放安裝時依賴包的真實版本
|–config 各種配置文件的目錄
||–app.php 系統級配置文件
||–auth.php 用戶身份認證配置文件,指定好table和model就可以很方便地用身份認證功能了
||–broadcasting.php 事件廣播配置文件
||–cache.php 緩存配置文件
||–compile.php 編譯額外文件和類需要的配置文件,一般用戶很少用到
||–database.php 資料庫配置文件
||–filesystems.php 文件系統配置文件,這里可以配置雲存儲參數
||–mail.php 電子郵件配置文件
||–queue.php 消息隊列配置文件
||–services.php 可存放第三方服務的配置信息
||–session.php 配置session的存儲方式、生命周期等信息
||–view.php 模板文件配置文件,包含模板目錄和編譯目錄等
|–database 資料庫相關目錄
||–factories 5.1版本的新特性,工廠類目錄,也是用於數據填充
|||–ModelFactory.php 在該文件可定義不同Model所需填充的數據類型
||–migrations 存儲資料庫遷移文件
||–seeds 存放數據填充類的目錄
||–DatabaseSeeder.php 執行php artisan db:seed命令將會調用該類的run方法。該方法可調用執行該目錄下其他Seeder類,也可調用factories方法生成ModelFactory里定義的數據模型
|–.env 環境配置文件。config目錄下的配置文件會使用該文件裡面的參數,不同生產環境使用不同的.env文件即可。
|–gulpfile.js gulp(一種前端構建工具)配置文件
|–package.json gulp配置文件
|–phpspec.yml phpspec(一種PHP測試框架)配置文件
|–phpunit.xml phpunit(一種PHP測試框架)配置文件
|–public 網站入口,應當將ip或域名指向該目錄而不是根目錄。可供外部訪問的css、js和圖片等資源皆放置於此
||–index.php 入口文件
||–.htaccess Apache伺服器用該文件重寫URL
||–web.config IIS伺服器用該文件重寫URL
|–resources 資源文件目錄
||–assets 可存放包含LESS、SASS、CoffeeScript在內的原始資源文件
||–lang 本地化文件目錄
||–views 視圖文件就放在這啦
|–server.php PHP內置的Web伺服器將把這個文件作為入口。以public/index.php為入口的可以忽略掉該文件
|–storage 存儲目錄。web伺服器需要有該目錄及所有子目錄的寫入許可權
||–app 可用於存儲應用程序所需的一些文件?待補充
||–framework 該目錄下包括緩存、sessions和編譯後的視圖文件
||–logs 日誌目錄
|–tests 測試目錄
|–vendor 該目錄下包含Laravel源代碼和第三方依賴包