laravel框架应用和composer扩展包开发
laravel5.5+
laravel官方地址
laravel是目前最流行的php框架,發(fā)展勢頭迅猛,應(yīng)用非常廣泛,有豐富的擴展包可以應(yīng)付你能想到的各種應(yīng)用場景,laravel框架思想前衛(wèi),跟隨時代潮流,提倡優(yōu)雅代碼,自稱為“web工匠”,其中的route、blade模板引擎、console、容器以及composer擴展包為業(yè)務(wù)的開發(fā)提供了極大的便利。
國內(nèi)目前已經(jīng)有眾多的laravel社區(qū),比如
- laravel-china
- golaravel
- laravelacademy
當(dāng)然還有更多可供開發(fā)者學(xué)習(xí)和交流的網(wǎng)站,可以自行g(shù)oogle或者百度。
不過如果看文檔的話,建議查看英文網(wǎng)站官網(wǎng)(如果英語允許的話),官網(wǎng)也有一個對應(yīng)的社區(qū),供開發(fā)者問答,不過貌似沒有那么活躍,提問題的話也需要有一定的英文基礎(chǔ),至少可以看懂stackoverflow上的問答。
言歸正傳,這里會介紹一下laravel5.5的簡易上手教程,如果你需要理解laravel框架整體的設(shè)計和實現(xiàn)原理的話,MVC、設(shè)計模式(尤其是工廠模式)、路由、管道、容器、控制反轉(zhuǎn)、依賴注入等都是必須要理解的,這里并不深入探討,否則本作者寶寶就要吐血寫個系列了,想想都覺著累(經(jīng)常加班啊沒時間啦!)。
本教程可以讓你在短時間內(nèi)按照123步驟完成一個網(wǎng)站的應(yīng)用,貫穿laravel各個層級,對于一個剛接觸該框架的開發(fā)者來說,先應(yīng)用,后深入,這也是登堂入室的學(xué)習(xí)方式,何樂而不為呢?
Ok, Here we go!!!
前期準(zhǔn)備
創(chuàng)建laravel項目
1. 終端運行命令
composer create-project laravel/laravel blog2. 進入blog文件夾,運行
php -S localhost:80 -t public3. 瀏覽器訪問?http://localhost
4. 運行命令?php artisan
如果3、4步驟運行成功,則一切無礙,可以進行下一步。5. 利用你的編輯工具,以sublime為例,打開blog項目,Ctrl+P?找到web.php,寫入如下代碼,進行路由注冊:
Route::get('/test', function () {return "<h1>Hi Sunday.</h1>"; }); 這里簡單解釋一下,路由在routes目錄之下,有三個文件:web.php、console.php、channel.php其中,web.php是負責(zé)網(wǎng)站路由,也就是當(dāng)php是以http請求的方式運行時才會用到,
console.php是在命令行運行模式下運行artisan命令的,這個后續(xù)會講到,
channel.php是廣播消息時會用到,這個本篇略過,需要看的可以查看文檔
get是http請求方式,路由注冊時也可以用post/put/delete/patch等,laravel-router還提供了便利的restful風(fēng)格的路由注冊resource方法,可以對后續(xù)業(yè)務(wù)處理增刪改查等。
上述例子為一個匿名函數(shù),其實一般情況下會有路由分組,前綴,中間件(后面會講到),別名,匹配等的鏈?zhǔn)秸{(diào)用: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路由的注冊風(fēng)格是不是非常友好,非常靈活多變?其中Route也可以使用app('router')訪問,app()是一個輔助方法,這個輔助方法在vendor\laravel\framework\src\Illuminate\Foundation\helpers.php中,其中也有很多其他好用的輔助方法。app()涉及到容器的思想和facade門面注冊,這里不詳述。
6. 訪問以下剛剛注冊的路由,http://localhost/test
7. 手動在app/Http/Controllers下新建或命令行生成一個控制器:php artisan make:controller sd/SundayController,這時你會看到app/Http/sd下面有一個SundayController.php,將下面的代碼寫入:
public function sunday(){return "Hi sunday";}8.?web.php注冊路由,并成功訪問:
Route::prefix('hi')->namespace('sd')->group(function () {Route::get('sunday', 'SundayController@sunday')->name('hi.sunday.get'); })9. 中間件,運行命令php artisan make:middleware MyMiddleware,會生成一個標(biāo)準(zhǔn)中間件,打開MyMiddleware.php可以看到里面有兩個方法handle和terminate
public function handle($request, $next) {// 上面兩個入?yún)?#xff0c;你不用管,這個是laravel路由分發(fā)時自動注入的參數(shù),$request是laravel封裝的請求對象,Illuminate\Http\Request,你可以獲取到所有超級變量的數(shù)據(jù),也可以獲得對應(yīng)的一些請求處理方法如session(),getClientIp().// 這個方法是在進入Controller之前運行的,目的是對本次請求進行預(yù)處理或者校驗等。app('log')->info('記錄一個日志'); }public function terminate($request, $response) {// 這個方法是在請求即將關(guān)閉時運行的,可以處理一些響應(yīng)相關(guān)的邏輯。app('log')->info('再記錄一下日志'); }10. 中間件注冊,打開app/Http/Kernel.php?,在$middleware中加入
app\Http\Middleware\MyMiddleware::class11. 查看?storage/logs/laravel.log(如果你config/app.php配置了日志channel為daily,那么應(yīng)該看到的是日期格式的文件),里面應(yīng)該有上一步中記錄的日志信息,以及對應(yīng)的日志級別,laravel的日志使用monolog,可以使用多種驅(qū)動去記錄日志,也可以配置上報策略,實現(xiàn)了loggerinterface接口,符合psr3的規(guī)范。
12. 視圖層,在剛剛的方法?SundayController@sunday?中,將返回值改為:
return view('test.test', ['name' => 'sunday', 'testArray' => [1,2,3]]);在前端模板所在目錄?resources/views下建一個目錄test,建一個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'), // 主機
'port' => env('DB_PORT', '3306'), // 端口
'database' => env('DB_DATABASE', 'forge'), // 這里需要配置你的數(shù)據(jù)庫
'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. 運行artisan命令?php artisan make:auth
15. 運行artisan命令?php artisan make:migration?創(chuàng)建user表和密碼表,進入你的數(shù)據(jù)庫中查看是否創(chuàng)建成功
16. 這時,打開網(wǎng)站首頁,你會看到有一個登錄標(biāo)志,當(dāng)你注冊成功之后,你會看到user表中多了一條數(shù)據(jù),表示數(shù)據(jù)庫連接是成功的。
model可以通過php artisan make:model TestModel來創(chuàng)建,如果你沒有特殊要求的話,它會出現(xiàn)在app目錄下。進入該Model你會看到它繼承了一個Eloquent\Model,這個ORM model可以為你提供多種多樣的CURD方法,具體可見文檔,在Model里面需要自定義一些屬性,例如table、fillable、guards等,支持軟刪除use SoftDeletes,但對應(yīng)表中必須要有deleted_at字段。
你也可以用DB匿名類或者app('db')來得到一個比EloquentModel更加原始的模型對象,這會讓你對數(shù)據(jù)庫的操作更加原生,詳見?文檔
以上就是對應(yīng)的MVC使用的簡單介紹
下面,讓我們看看console的使用
之后,在app/Console/Kernel.php?$commands注冊命令A(yù)pp\Console\Commands\TestCommand::class,運行php artisan test:test --op=1,成功輸出1,這條命令算是完工了。
如果你想要加入定時任務(wù),可以將命令加在schedule()中,?$schedule->cron("0 0 0 0 0")這里填寫crontab的格式。你可以運行php artisan schedule:run來執(zhí)行定時任務(wù)
laravel會在你項目維護或迭代時自動完成定時任務(wù)的重啟
composer擴展包
如果你有心,當(dāng)你創(chuàng)建一個laravel項目的時候,就會注意到,composer會在項目中創(chuàng)建一個vendor目錄,這個目錄下保存著各式各樣的擴展包,如:laravel/framework、symphony/console、monolog/monolog等,這些擴展包是laravel的寶庫,為你的開發(fā)提供了極大便利。
所有的擴展包都需要符合psr4加載規(guī)范,通過spl_autoload_register()方法自動加在,composer會生成一個autoload_classmap.php你可以找到所有加載到的類和文件。
如何開發(fā)一個composer擴展包呢?
1.新建目錄test,進入運行?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ī)范,對于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('我進來了');} }由于log_info()這個方法我們沒有定義過,所以可以在helpers.php中進行定義:
<?phpif (!function_exist('log_info')) {function log_info($message) {echo $message . PHP_EOL;} }我們也可以創(chuàng)建一個更深層次的目錄,如Handlers,在其下創(chuàng)建一個TestYou.php:
namespace Name1\Name2\Handlers;class TestYou {public function test(){log_info("test");} }創(chuàng)建一個匿名類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); } 為什么一定要定義匿名類呢?因為laravel框架本身要求就是少去關(guān)注工具類的實現(xiàn),多關(guān)注業(yè)務(wù)本身,所以所有的sdk或者擴展包都在接入時盡量提供便利,其中$this->app->bind()也體現(xiàn)了一個依賴注入控制反轉(zhuǎn)的思想,使得定義了匿名類的,可以在config/app.php中注冊相應(yīng)匿名類Test及NameServiceProvider之后可以以極為便利的方式使用,如:\Test::test(),或者app('test')->test(),不需要管他們的命名空間。上述的擴展包功能已經(jīng)基本成形,你需要將它放到相應(yīng)的代碼托管倉庫中,如github或https://packagist.org(推薦),你可以嘗試在laravel中使用命令composer require {你的package名字}進行安裝。
后語
本文由于初次編寫,必然有諸多不合理之處,希望讀者們多多給出優(yōu)化意見,以后在文章中會考慮到,大家共同成長,一起發(fā)財。
stay hungry, stay foolish.
原文地址:https://segmentfault.com/a/1190000015682131
來源:https://www.cnblogs.com/lalalagq/p/9979814.html
總結(jié)
以上是生活随笔為你收集整理的laravel框架应用和composer扩展包开发的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql隔离级别底层实现_1、深入理解
- 下一篇: 人一天喝多少ml的水(人一天喝多少毫升水