摘要:官方地址是目前最流行的框架,發展勢頭迅猛,應用非常廣泛,有豐富的擴展包可以應付你能想到的各種應用場景,框架思想前衛,跟隨時代潮流,提倡優雅代碼,自稱為工匠,其中的模板引擎容器以及擴展包為業務的開發提供了極大的便利。
laravel5.5+
laravel官方地址
laravel是目前最流行的php框架,發展勢頭迅猛,應用非常廣泛,有豐富的擴展包可以應付你能想到的各種應用場景,laravel框架思想前衛,跟隨時代潮流,提倡優雅代碼,自稱為“web工匠”,其中的route、blade模板引擎、console、容器以及composer擴展包為業務的開發提供了極大的便利。
國內目前已經有眾多的laravel社區,比如
laravel-china
golaravel
laravelacademy
當然還有更多可供開發者學習和交流的網站,可以自行google或者百度。
不過如果看文檔的話,建議查看英文網站官網(如果英語允許的話),官網也有一個對應的社區,供開發者問答,不過貌似沒有那么活躍,提問題的話也需要有一定的英文基礎,至少可以看懂stackoverflow上的問答。
言歸正傳,這里會介紹一下laravel5.5的簡易上手教程,如果你需要理解laravel框架整體的設計和實現原理的話,MVC、設計模式(尤其是工廠模式)、路由、管道、容器、控制反轉、依賴注入等都是必須要理解的,這里并不深入探討,否則本作者寶寶就要吐血寫個系列了,想想都覺著累(經常加班啊沒時間啦!)。
本教程可以讓你在短時間內按照123步驟完成一個網站的應用,貫穿laravel各個層級,對于一個剛接觸該框架的開發者來說,先應用,后深入,這也是登堂入室的學習方式,何樂而不為呢?
Ok, Here we go!!! 前期準備安裝php7(最好加入環境變量)。可以上官網或者軟件包管理工具安裝,例如: brew install php7
安裝composer
安裝mysql
創建laravel項目composer create-project laravel/laravel blog
php -S localhost:80 -t public
如果3、4步驟運行成功,則一切無礙,可以進行下一步。
Route::get("/test", function () { return "Hi Sunday.
"; });
這里簡單解釋一下,路由在routes目錄之下,有三個文件:web.php、console.php、channel.php
其中,web.php是負責網站路由,也就是當php是以http請求的方式運行時才會用到,
console.php是在命令行運行模式下運行artisan命令的,這個后續會講到,
channel.php是廣播消息時會用到,這個本篇略過,需要看的可以查看文檔
get是http請求方式,路由注冊時也可以用post/put/delete/patch等,laravel-router還提供了便利的restful風格的路由注冊resource方法,可以對后續業務處理增刪改查等。
上述例子為一個匿名函數,其實一般情況下會有路由分組,前綴,中間件(后面會講到),別名,匹配等的鏈式調用:Route::prefix("prefix_example")->middleware(["m_exaple_1","m_example_2"])->group(Route_Closure);
下面給一個完整的示例:
Route::prefix("hi")->middleware(["hi_m"])->namespace("sd")->group(function () { Route::post("sunday", "SundayController@sunday")->name("hi.sunday.post"); Route::put("sunday", "SundayController@sunday")->name("hi.sunday.put"); })
怎么樣?laravel路由的注冊風格是不是非常友好,非常靈活多變?其中Route也可以使用app("router")訪問,app()是一個輔助方法,這個輔助方法在vendorlaravelframeworksrcIlluminateFoundationhelpers.php中,其中也有很多其他好用的輔助方法。app()涉及到容器的思想和facade門面注冊,這里不詳述。
public function sunday() { return "Hi sunday"; }
Route::prefix("hi")->namespace("sd")->group(function () { Route::get("sunday", "SundayController@sunday")->name("hi.sunday.get"); })
public function handle($request, $next) { // 上面兩個入參,你不用管,這個是laravel路由分發時自動注入的參數,$request是laravel封裝的請求對象,IlluminateHttpRequest,你可以獲取到所有超級變量的數據,也可以獲得對應的一些請求處理方法如session(),getClientIp(). // 這個方法是在進入Controller之前運行的,目的是對本次請求進行預處理或者校驗等。 app("log")->info("記錄一個日志"); } public function terminate($request, $response) { // 這個方法是在請求即將關閉時運行的,可以處理一些響應相關的邏輯。 app("log")->info("再記錄一下日志"); }
appHttpMiddlewareMyMiddleware::class
return view("test.test", ["name" => "sunday", "testArray" => [1,2,3]]);
在前端模板所在目錄 resources/views下建一個目錄test,建一個blade模板test.blade.php,代碼如:
@if ($name ){{$name}},你好
@else無名氏,你好
@endif @foreach ($testArray as $testNumber)
在控制器返回視圖時,第一個參數是以.號表示resources/views下的目錄層級的,上面的test.test則表示視圖文件是在test/test.blade.php,第二個參數是一個傳遞給視圖層的數組,里面應當是key => value關聯數組,因為在blade模板引擎中,會直接將對應的key轉化成一個可使用的變量,在返回給視圖之前,如果你定義了視圖綁定,如在ComposerServiceProvider中的boot方法中注冊了對應的視圖綁定的話,那么會先處理這一步,然后再將數據傳給目的文件。
在這個例子中,test.blade.php得到了參數之后,會通過blade引擎分析模板文件,解析語法,轉化成正常的html文本。
{{$name}}或{!!$name!!}語法相當于=$name>,前者為防止xss會過濾掉一些specialchar,后者則會直接輸出文本,不安全。
@if ... @endif則是條件判斷語句,行后面可以跟一個簡短的php邏輯判斷
@foreach ... @endforeach 輪詢數組
其他語法請參考 官方文檔。
以上的步驟,僅僅是完成了從路由到視圖的簡單處理,下面看一下數據模型,Model層
database.php
// config/database.php "mysql" => [ "driver" => "mysql", "host" => env("DB_HOST", "127.0.0.1"), // 主機 "port" => env("DB_PORT", "3306"), // 端口 "database" => env("DB_DATABASE", "forge"), // 這里需要配置你的數據庫 "username" => env("DB_USERNAME", "forge"), // 配置你的用戶名 "password" => env("DB_PASSWORD", ""), // 密碼 "unix_socket" => env("DB_SOCKET", ""), "charset" => "utf8mb4", "collation" => "utf8mb4_unicode_ci", "prefix" => "", "strict" => true, "engine" => null, ],
.env
// .env文件 DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=test #這里需要你手動在數據庫創建一下數據庫 DB_USERNAME=root #你自己的用戶名 DB_PASSWORD=pwd #你自己的密碼
model可以通過php artisan make:model TestModel來創建,如果你沒有特殊要求的話,它會出現在app目錄下。以上就是對應的MVC使用的簡單介紹
進入該Model你會看到它繼承了一個EloquentModel,這個ORM model可以為你提供多種多樣的CURD方法,具體可見文檔,在Model里面需要自定義一些屬性,例如table、fillable、guards等,支持軟刪除use SoftDeletes,但對應表中必須要有deleted_at字段。
你也可以用DB匿名類或者app("db")來得到一個比EloquentModel更加原始的模型對象,這會讓你對數據庫的操作更加原生,詳見 文檔
終端進入項目目錄,運行php artisan可以查看所有可執行命令
運行 php artisan route:list可以查看已成功注冊的路由列表
php artisan make:command NewCommand創建一個新的命令
打開app/Console/Commands/NewCommand.php,在$signature后定義一個命令的名稱如:test:test {--O|op= : 這是我的測試參數},在handle()方法中寫入你的邏輯。如:
$this->info("我第一個命令"); // 會在終端上輸出該文本 $this->error("我的命令錯了"); // 會在終端上輸出該文本 $this->confirm("確認我的命令?"); // 選擇yes/no $this->choice("我還有其他選擇:", ["A", "B"]); // 選擇一個 $this->output->progress(); //進度條 echo $this->option("op"); // 獲取所定義參數值
之后,在app/Console/Kernel.php $commands注冊命令AppConsoleCommandsTestCommand::class,運行php artisan test:test --op=1,成功輸出1,這條命令算是完工了。
如果你想要加入定時任務,可以將命令加在schedule()中, $schedule->cron("0 0 0 0 0")這里填寫crontab的格式。composer擴展包
你可以運行php artisan schedule:run來執行定時任務
laravel會在你項目維護或迭代時自動完成定時任務的重啟
如果你有心,當你創建一個laravel項目的時候,就會注意到,composer會在項目中創建一個vendor目錄,這個目錄下保存著各式各樣的擴展包,如:laravel/framework、symphony/console、monolog/monolog等,這些擴展包是laravel的寶庫,為你的開發提供了極大便利。
所有的擴展包都需要符合psr4加載規范,通過spl_autoload_register()方法自動加在,composer會生成一個autoload_classmap.php你可以找到所有加載到的類和文件。
如何開發一個composer擴展包呢?
1.新建目錄test,進入運行 composer init
這里type一般選擇project/library,license一般選擇MIT協議(一種開源授權協議)
2.打開composer.json,加入psr4規則:
"autoload": { "psr-4": { "Name1Name2": "name/src/Name" // 這里表示按照psr4規范,對于name/src/Name目錄下的所有文件,加載命名空間以Name1Name2為前綴的類。 } }
3.創建name/src/Name目錄,在Name目錄下創建文件NameServiceProvider.php,代碼如下:
由于log_info()這個方法我們沒有定義過,所以可以在helpers.php中進行定義:
我們也可以創建一個更深層次的目錄,如Handlers,在其下創建一個TestYou.php:
namespace Name1Name2Handlers; class TestYou { public function test() { log_info("test"); } }創建一個匿名類Facades/Test.php:
namespace Name1Name2Facades; use IlluminateSupportFacadesFacade; class Test extends Facade { protected static function getFacadeAccessor() { return "test"; } }材料已準備完畢,下面開始切菜:
// NameServiceProvider public function register () { $this->app->bind("test", Name1Name2HandlersTestYou::class); }為什么一定要定義匿名類呢?因為laravel框架本身要求就是少去關注工具類的實現,多關注業務本身,所以所有的sdk或者擴展包都在接入時盡量提供便利,其中$this->app->bind()也體現了一個依賴注入控制反轉的思想,使得定義了匿名類的,可以在config/app.php中注冊相應匿名類Test及NameServiceProvider之后可以以極為便利的方式使用,如:Test::test(),或者app("test")->test(),不需要管他們的命名空間。上述的擴展包功能已經基本成形,你需要將它放到相應的代碼托管倉庫中,如github或https://packagist.org(推薦),你可以嘗試在laravel中使用命令composer require {你的package名字}進行安裝。
后語本文由于初次編寫,必然有諸多不合理之處,希望讀者們多多給出優化意見,以后在文章中會考慮到,大家共同成長,一起發財。
stay hungry, stay foolish.
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/29061.html
摘要:但也因為應有盡有使得框架的性能比其他高性能框架低了些,為此給了幾個解決方案路由緩存經有關部門研究,路由緩存可有效加快訪問速度以上。有朋友說框架最重要的東西是路由,我倒認為最重要的是框架中異于其他框架且能解決痛點的東西,如的。 showImg(https://segmentfault.com/img/remote/1460000006767764); 在程序界的遠古時期,大神們手持鍵盤敲...
摘要:在每一個的項目主頁上,展示了擴展包的介紹版本號倉庫地址如完整的文件,以及其他一些有用的信息。官方文檔給出了總結服務提供者是所有應用程序引導中心。你可以瀏覽位于目錄下的所有應用程序服務提供者。 當你接手一個新項目的時候,可能會感到無從下手,如果不熟悉編程,則更是如此。那么,我們該從哪兒入手呢?項目代碼的哪些部分我們需要著重了解?下面我們看看 Laravel 項目的幾個通用的部分。 項目文...
摘要:在每一個的項目主頁上,展示了擴展包的介紹版本號倉庫地址如完整的文件,以及其他一些有用的信息。官方文檔給出了總結服務提供者是所有應用程序引導中心。你可以瀏覽位于目錄下的所有應用程序服務提供者。 showImg(https://segmentfault.com/img/bV6vPF?w=1200&h=500); 當你接手一個新項目的時候,可能會感到無從下手,如果不熟悉編程,則更是如此。那么...
摘要:流程一新項目流程創建,并添加依賴到的擴展包運行,安裝擴展包并生成提交到代碼版本控制器中,如流程二項目協作者安裝現有項目克隆項目后,根目錄下直接運行從中安裝指定版本的擴展包以及其依賴此流程適用于生產環境代碼的部署。 本文經授權轉自 PHPHub 社區 問題說明 我們經常要往現有的項目中添加擴展包,有時候因為文檔的錯誤引導,如下圖來自 這個文檔 的: showImg(https://dn-...
摘要:自動代碼擴展開發時遵守的代碼風格是項目開發規范。遵照此規范,在實際操作中,有許多重復,接下來推薦一款專為此規范量身定制的代碼生成器。可以利用此擴展來快速構建項目原型。后續還會為大家帶來一些最新的技術擴展。 whoops 錯誤提示擴展 whoops 是一個非常優秀的 PHP Debug 擴展,它能夠使你在開發中快速定位出錯的位置。laravel默認安裝。showImg(https://s...
閱讀 472·2023-04-25 17:26
閱讀 1495·2021-08-05 09:58
閱讀 1959·2019-08-30 13:17
閱讀 943·2019-08-28 17:52
閱讀 1061·2019-08-26 18:27
閱讀 1413·2019-08-26 14:05
閱讀 3608·2019-08-26 14:05
閱讀 1586·2019-08-26 10:45