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