laravel框架應用和composer擴展包開發

laravel5.5+


laravel官方地址php

laravel是目前最流行的php框架,發展勢頭迅猛,應用很是普遍,有豐富的擴展包能夠應付你能想到的各類應用場景,laravel框架思想前衛,跟隨時代潮流,提倡優雅代碼,自稱爲「web工匠」,其中的routeblade模板引擎、console、容器以及composer擴展包爲業務的開發提供了極大的便利。html

國內目前已經有衆多的laravel社區,好比前端

固然還有更多可供開發者學習和交流的網站,能夠自行google或者百度。mysql

不過若是看文檔的話,建議查看英文網站官網(若是英語容許的話),官網也有一個對應的社區,供開發者問答,不過貌似沒有那麼活躍,提問題的話也須要有必定的英文基礎,至少能夠看懂stackoverflow上的問答。laravel

言歸正傳,這裏會介紹一下laravel5.5的簡易上手教程,若是你須要理解laravel框架總體的設計和實現原理的話,MVC、設計模式(尤爲是工廠模式)、路由、管道、容器、控制反轉、依賴注入等都是必需要理解的,這裏並不深刻探討,不然本做者寶寶就要吐血寫個系列了,想一想都覺着累(常常加班啊沒時間啦!)。git

本教程可讓你在短期內按照123步驟完成一個網站的應用,貫穿laravel各個層級,對於一個剛接觸該框架的開發者來講,先應用,後深刻,這也是登堂入室的學習方式,何樂而不爲呢?github

Ok, Here we go!!!

前期準備

  1. 安裝php7(最好加入環境變量)。能夠上官網或者軟件包管理工具安裝,例如: brew install php7
  2. 安裝composer
  3. 安裝mysql

建立laravel項目

1. 終端運行命令
composer create-project laravel/laravel blog
2. 進入blog文件夾,運行
php -S localhost:80 -t public
3. 瀏覽器訪問 http://localhost
4. 運行命令 php artisan
若是三、4步驟運行成功,則一切無礙,能夠進行下一步。
5. 利用你的編輯工具,以sublime爲例,打開blog項目,Ctrl+P 找到web.php,寫入以下代碼,進行路由註冊:
Route::get('/test', function () {
    return "<h1>Hi Sunday.</h1>";
});
這裏簡單解釋一下,路由在 routes目錄之下,有三個文件: web.phpconsole.phpchannel.php
其中, web.php是負責網站路由,也就是當 php是以 http請求的方式運行時纔會用到,
console.php是在命令行運行模式下運行 artisan命令的,這個後續會講到,
channel.php是廣播消息時會用到,這個本篇略過,須要看的能夠查看 文檔
gethttp請求方式,路由註冊時也能夠用 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門面註冊,這裏不詳述。
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,會生成一個標準中間件,打開MyMiddleware.php能夠看到裏面有兩個方法handleterminate
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('再記錄一下日誌');
}
10. 中間件註冊,打開app/Http/Kernel.php ,在$middleware中加入
app\Http\Middleware\MyMiddleware::class
11. 查看 storage/logs/laravel.log(若是你config/app.php配置了日誌channeldaily,那麼應該看到的是日期格式的文件),裏面應該有上一步中記錄的日誌信息,以及對應的日誌級別,laravel的日誌使用monolog,可使用多種驅動去記錄日誌,也能夠配置上報策略,實現了loggerinterface接口,符合psr3的規範。
12. 視圖層,在剛剛的方法 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 輪詢數組
其餘語法請參考 官方文檔

以上的步驟,僅僅是完成了從路由到視圖的簡單處理,下面看一下數據模型,Modelsql

13. 配置數據庫

database.phpshell

// 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 #你本身的密碼
14. 運行artisan命令 php artisan make:auth
15. 運行artisan命令 php artisan make:migration 建立user表和密碼錶,進入你的數據庫中查看是否建立成功
16. 這時,打開網站首頁,你會看到有一個登陸標誌,當你註冊成功以後,你會看到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的使用
  1. 終端進入項目目錄,運行php artisan能夠查看全部可執行命令
  2. 運行 php artisan route:list能夠查看已成功註冊的路由列表
  3. php artisan make:command NewCommand建立一個新的命令
  4. 打開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/librarylicense通常選擇 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中註冊相應匿名類 TestNameServiceProvider以後能夠以極爲便利的方式使用,如: \Test::test(),或者 app('test')->test(),不須要管他們的命名空間。

上述的擴展包功能已經基本成形,你須要將它放到相應的代碼託管倉庫中,如githubhttps://packagist.org(推薦),你能夠嘗試在laravel中使用命令composer require {你的package名字}進行安裝。

後語

本文因爲初次編寫,必然有諸多不合理之處,但願讀者們多多給出優化意見,之後在文章中會考慮到,你們共同成長,一塊兒發財。

stay hungry, stay foolish.

相關文章
相關標籤/搜索