laravel框架应用和composer扩展包开发
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)站,可以自行g(shù)oogle或者百度。
不過如果看文檔的話,建議查看英文網(wǎng)站官網(wǎng)(如果英語(yǔ)允許的話),官網(wǎng)也有一個(gè)對(duì)應(yīng)的社區(qū),供開發(fā)者問答,不過貌似沒有那么活躍,提問題的話也需要有一定的英文基礎(chǔ),至少可以看懂stackoverflow上的問答。
言歸正傳,這里會(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ā)者來說,先應(yīng)用,后深入,這也是登堂入室的學(xué)習(xí)方式,何樂而不為呢?
Ok, Here we go!!!
前期準(zhǔn)備
創(chuàng)建laravel項(xiàng)目
1. 終端運(yùn)行命令
composer create-project laravel/laravel blog2. 進(jìn)入blog文件夾,運(yùn)行
php -S localhost:80 -t public3. 瀏覽器訪問?http://localhost
4. 運(yùn)行命令?php artisan
如果3、4步驟運(yùn)行成功,則一切無礙,可以進(jìn)行下一步。5. 利用你的編輯工具,以sublime為例,打開blog項(xiàng)目,Ctrl+P?找到web.php,寫入如下代碼,進(jìn)行路由注冊(cè):
Route::get('/test', function () {return "<h1>Hi Sunday.</h1>"; }); 這里簡(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è)本篇略過,需要看的可以查看文檔
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')訪問,app()是一個(gè)輔助方法,這個(gè)輔助方法在vendor\laravel\framework\src\Illuminate\Foundation\helpers.php中,其中也有很多其他好用的輔助方法。app()涉及到容器的思想和facade門面注冊(cè),這里不詳述。
6. 訪問以下剛剛注冊(cè)的路由,http://localhost/test
7. 手動(dòng)在app/Http/Controllers下新建或命令行生成一個(gè)控制器:php artisan make:controller sd/SundayController,這時(shí)你會(huì)看到app/Http/sd下面有一個(gè)SundayController.php,將下面的代碼寫入:
public function sunday(){return "Hi sunday";}8.?web.php注冊(cè)路由,并成功訪問:
Route::prefix('hi')->namespace('sd')->group(function () {Route::get('sunday', 'SundayController@sunday')->name('hi.sunday.get'); })9. 中間件,運(yùn)行命令php artisan make:middleware MyMiddleware,會(huì)生成一個(gè)標(biāo)準(zhǔn)中間件,打開MyMiddleware.php可以看到里面有兩個(gè)方法handle和terminate
public function handle($request, $next) {// 上面兩個(gè)入?yún)?#xff0c;你不用管,這個(gè)是laravel路由分發(fā)時(shí)自動(dòng)注入的參數(shù),$request是laravel封裝的請(qǐng)求對(duì)象,Illuminate\Http\Request,你可以獲取到所有超級(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('再記錄一下日志'); }10. 中間件注冊(cè),打開app/Http/Kernel.php?,在$middleware中加入
app\Http\Middleware\MyMiddleware::class11. 查看?storage/logs/laravel.log(如果你config/app.php配置了日志channel為daily,那么應(yīng)該看到的是日期格式的文件),里面應(yīng)該有上一步中記錄的日志信息,以及對(duì)應(yīng)的日志級(jí)別,laravel的日志使用monolog,可以使用多種驅(qū)動(dòng)去記錄日志,也可以配置上報(bào)策略,實(shí)現(xiàn)了loggerinterface接口,符合psr3的規(guī)范。
12. 視圖層,在剛剛的方法?SundayController@sunday?中,將返回值改為:
return view('test.test', ['name' => 'sunday', 'testArray' => [1,2,3]]);在前端模板所在目錄?resources/views下建一個(gè)目錄test,建一個(gè)blade模板test.blade.php,代碼如:
``` @if ($name ) <h1>{{$name}},你好</h1> @else <h1>無名氏,你好</h1> @endif
@foreach ($testArray as $testNumber)
<li>{{$testNumber}}</li>
@endforeach
// 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,
],
14. 運(yùn)行artisan命令?php artisan make:auth
15. 運(yùn)行artisan命令?php artisan make:migration?創(chuàng)建user表和密碼表,進(jìn)入你的數(shù)據(jù)庫(kù)中查看是否創(chuàng)建成功
16. 這時(shí),打開網(wǎng)站首頁(yè),你會(huì)看到有一個(gè)登錄標(biāo)志,當(dāng)你注冊(cè)成功之后,你會(huì)看到user表中多了一條數(shù)據(jù),表示數(shù)據(jù)庫(kù)連接是成功的。
model可以通過php artisan make:model TestModel來創(chuàng)建,如果你沒有特殊要求的話,它會(huì)出現(xiàn)在app目錄下。進(jìn)入該Model你會(huì)看到它繼承了一個(gè)Eloquent\Model,這個(gè)ORM model可以為你提供多種多樣的CURD方法,具體可見文檔,在Model里面需要自定義一些屬性,例如table、fillable、guards等,支持軟刪除use SoftDeletes,但對(duì)應(yīng)表中必須要有deleted_at字段。
你也可以用DB匿名類或者app('db')來得到一個(gè)比EloquentModel更加原始的模型對(duì)象,這會(huì)讓你對(duì)數(shù)據(jù)庫(kù)的操作更加原生,詳見?文檔
以上就是對(duì)應(yīng)的MVC使用的簡(jiǎn)單介紹
下面,讓我們看看console的使用
之后,在app/Console/Kernel.php?$commands注冊(cè)命令A(yù)pp\Console\Commands\TestCommand::class,運(yùn)行php artisan test:test --op=1,成功輸出1,這條命令算是完工了。
如果你想要加入定時(shí)任務(wù),可以將命令加在schedule()中,?$schedule->cron("0 0 0 0 0")這里填寫crontab的格式。你可以運(yùn)行php artisan schedule:run來執(zhí)行定時(shí)任務(wù)
laravel會(huì)在你項(xiàng)目維護(hù)或迭代時(shí)自動(dòng)完成定時(shí)任務(wù)的重啟
composer擴(kuò)展包
如果你有心,當(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ī)范,通過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": {"Name1\\\Name2\\": "name/src/Name" // 這里表示按照psr4規(guī)范,對(duì)于name/src/Name目錄下的所有文件,加載命名空間以Name1\\\Name2\\為前綴的類。} }3.創(chuàng)建name/src/Name目錄,在Name目錄下創(chuàng)建文件NameServiceProvider.php,代碼如下:
<?php namespace Name1\Name2;use Illuminate\Support\ServiceProvider;class NameServiceProvider extends ServiceProvider {public function boot(){require __DIR__ . '/helpers.php';log_info('我進(jìn)來了');} }由于log_info()這個(gè)方法我們沒有定義過,所以可以在helpers.php中進(jìn)行定義:
<?phpif (!function_exist('log_info')) {function log_info($message) {echo $message . PHP_EOL;} }我們也可以創(chuàng)建一個(gè)更深層次的目錄,如Handlers,在其下創(chuàng)建一個(gè)TestYou.php:
namespace Name1\Name2\Handlers;class TestYou {public function test(){log_info("test");} }創(chuàng)建一個(gè)匿名類Facades/Test.php:
namespace Name1\Name2\Facades;use Illuminate\Support\Facades\Facade;class Test extends Facade {protected static function getFacadeAccessor(){return "test";} }材料已準(zhǔn)備完畢,下面開始切菜:
// NameServiceProviderpublic function register () {$this->app->bind('test', Name1\Name2\Handlers\TestYou::class); } 為什么一定要定義匿名類呢?因?yàn)閘aravel框架本身要求就是少去關(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.
原文地址:https://segmentfault.com/a/1190000015682131
來源:https://www.cnblogs.com/lalalagq/p/9979814.html
總結(jié)
以上是生活随笔為你收集整理的laravel框架应用和composer扩展包开发的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql隔离级别底层实现_1、深入理解
- 下一篇: RESTful简介