laravel
官方地址php
laravel
是目前最流行的php
框架,發展勢頭迅猛,應用很是普遍,有豐富的擴展包能夠應付你能想到的各類應用場景,laravel
框架思想前衛,跟隨時代潮流,提倡優雅代碼,自稱爲「web
工匠」,其中的route
、blade
模板引擎、console
、容器以及compose
r擴展包爲業務的開發提供了極大的便利。html
國內目前已經有衆多的laravel
社區,好比前端
固然還有更多可供開發者學習和交流的網站,能夠自行google
或者百度。mysql
不過若是看文檔的話,建議查看英文網站官網(若是英語容許的話),官網也有一個對應的社區,供開發者問答,不過貌似沒有那麼活躍,提問題的話也須要有必定的英文基礎,至少能夠看懂stackoverflow
上的問答。laravel
言歸正傳,這裏會介紹一下laravel5.5
的簡易上手教程,若是你須要理解laravel
框架總體的設計和實現原理的話,MVC
、設計模式(尤爲是工廠模式)、路由、管道、容器、控制反轉、依賴注入等都是必需要理解的,這裏並不深刻探討,不然本做者寶寶就要吐血寫個系列了,想一想都覺着累(常常加班啊沒時間啦!)。git
本教程可讓你在短期內按照123步驟完成一個網站的應用,貫穿laravel
各個層級,對於一個剛接觸該框架的開發者來講,先應用,後深刻,這也是登堂入室的學習方式,何樂而不爲呢?github
php7
(最好加入環境變量)。能夠上官網或者軟件包管理工具安裝,例如: brew install php7
composer
mysql
laravel
項目composer create-project laravel/laravel blog
blog
文件夾,運行php -S localhost:80 -t public
http://localhost
php artisan
若是三、4步驟運行成功,則一切無礙,能夠進行下一步。
sublime
爲例,打開blog
項目,Ctrl+P
找到web.php
,寫入以下代碼,進行路由註冊:Route::get('/test', function () { return "<h1>Hi Sunday.</h1>"; });
這裏簡單解釋一下,路由在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()
是一個輔助方法,這個輔助方法在vendor\laravel\framework\src\Illuminate\Foundation\helpers.php
中,其中也有不少其餘好用的輔助方法。app()
涉及到容器的思想和facade
門面註冊,這裏不詳述。
http://localhost/test
app/Http/Controllers
下新建或命令行生成一個控制器:php artisan make:controller sd/SundayController
,這時你會看到app/Http/sd
下面有一個SundayController.php
,將下面的代碼寫入:public function sunday() { return "Hi sunday"; }
web.php
註冊路由,併成功訪問:Route::prefix('hi')->namespace('sd')->group(function () { Route::get('sunday', 'SundayController@sunday')->name('hi.sunday.get'); })
php artisan make:middleware MyMiddleware
,會生成一個標準中間件,打開MyMiddleware.php
能夠看到裏面有兩個方法handle
和terminate
public function handle($request, $next) { // 上面兩個入參,你不用管,這個是laravel路由分發時自動注入的參數,$request是laravel封裝的請求對象,Illuminate\Http\Request,你能夠獲取到全部超級變量的數據,也能夠得到對應的一些請求處理方法如session(),getClientIp(). // 這個方法是在進入Controller以前運行的,目的是對本次請求進行預處理或者校驗等。 app('log')->info('記錄一個日誌'); } public function terminate($request, $response) { // 這個方法是在請求即將關閉時運行的,能夠處理一些響應相關的邏輯。 app('log')->info('再記錄一下日誌'); }
app/Http/Kernel.php
,在$middleware
中加入app\Http\Middleware\MyMiddleware::class
storage/logs/laravel.log
(若是你config/app.php
配置了日誌channel
爲daily
,那麼應該看到的是日期格式的文件),裏面應該有上一步中記錄的日誌信息,以及對應的日誌級別,laravel
的日誌使用monolog
,可使用多種驅動去記錄日誌,也能夠配置上報策略,實現了loggerinterface
接口,符合psr3
的規範。SundayController@sunday
中,將返回值改成:return view('test.test', ['name' => 'sunday', 'testArray' => [1,2,3]]);
在前端模板所在目錄 resources/views
下建一個目錄test
,建一個blade
模板test.blade.php
,代碼如:web
@if ($name ) <h1>{{$name}},你好</h1> @else <h1>無名氏,你好</h1> @endif @foreach ($testArray as $testNumber) <li>{{$testNumber}}</li> @endforeach
在控制器返回視圖時,第一個參數是以.
號表示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
層sql
database.php
shell
// 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 #你本身的密碼
artisan
命令 php artisan make:auth
artisan
命令 php artisan make:migration
建立user表和密碼錶,進入你的數據庫中查看是否建立成功model
能夠經過php artisan make:model TestModel
來建立,若是你沒有特殊要求的話,它會出如今app
目錄下。
進入該Model
你會看到它繼承了一個Eloquent\Model
,這個ORM model
能夠爲你提供多種多樣的CURD
方法,具體可見 文檔,在Model裏面須要自定義一些屬性,例如table、fillable、guards
等,支持軟刪除use SoftDeletes
,但對應表中必需要有deleted_at
字段。
你也能夠用DB匿名類或者app('db')來獲得一個比EloquentModel更加原始的模型對象,這會讓你對數據庫的操做更加原生,詳見 文檔
MVC
使用的簡單介紹console
的使用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
註冊命令App\Console\Commands\TestCommand::class
,運行php artisan test:test --op=1
,成功輸出1,這條命令算是完工了。
若是你想要加入定時任務,能夠將命令加在schedule()
中,$schedule->cron("0 0 0 0 0")
這裏填寫crontab
的格式。
你能夠運行php artisan schedule:run
來執行定時任務
laravel
會在你項目維護或迭代時自動完成定時任務的重啓
composer
擴展包若是你有心,當你建立一個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": { "Name1\\\Name2\\": "name/src/Name" // 這裏表示按照psr4規範,對於name/src/Name目錄下的全部文件,加載命名空間以Name1\\\Name2\\爲前綴的類。 } }
3.建立name/src/Name
目錄,在Name
目錄下建立文件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
中進行定義:
<?php if (!function_exist('log_info')) { function log_info($message) { echo $message . PHP_EOL; } }
咱們也能夠建立一個更深層次的目錄,如Handlers
,在其下建立一個TestYou.php
:
namespace Name1\Name2\Handlers; class TestYou { public function test() { log_info("test"); } }
建立一個匿名類Facades/Test.php
:
namespace Name1\Name2\Facades; use Illuminate\Support\Facades\Facade; class Test extends Facade { protected static function getFacadeAccessor() { return "test"; } }
材料已準備完畢,下面開始切菜:
// NameServiceProvider public function register () { $this->app->bind('test', Name1\Name2\Handlers\TestYou::class); }
爲何必定要定義匿名類呢?由於laravel
框架自己要求就是少去關注工具類的實現,多關注業務自己,因此全部的sdk或者擴展包都在接入時儘可能提供便利,其中$this->app->bind()
也體現了一個依賴注入控制反轉的思想,使得定義了匿名類的,能夠在config/app.php
中註冊相應匿名類Test
及NameServiceProvider
以後能夠以極爲便利的方式使用,如:\Test::test()
,或者app('test')->test()
,不須要管他們的命名空間。
上述的擴展包功能已經基本成形,你須要將它放到相應的代碼託管倉庫中,如github
或https://packagist.org
(推薦),你能夠嘗試在laravel
中使用命令composer require {你的package名字}
進行安裝。
本文因爲初次編寫,必然有諸多不合理之處,但願讀者們多多給出優化意見,之後在文章中會考慮到,你們共同成長,一塊兒發財。