日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

laravel框架应用和composer扩展包开发

發(fā)布時(shí)間:2024/9/20 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 laravel框架应用和composer扩展包开发 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)備

  • 安裝php7(最好加入環(huán)境變量)。可以上官網(wǎng)或者軟件包管理工具安裝,例如:?brew install php7
  • 安裝composer
  • 安裝mysql
  • 創(chuàng)建laravel項(xiàng)目

    1. 終端運(yùn)行命令

    composer create-project laravel/laravel blog

    2. 進(jìn)入blog文件夾,運(yùn)行

    php -S localhost:80 -t public

    3. 瀏覽器訪問?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::class

    11. 查看?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

    <blockquote>在控制器返回視圖時(shí),第一個(gè)參數(shù)是以<code>.</code>號(hào)表示<code>resources/views</code>下的目錄層級(jí)的,上面的<code>test.test</code>則表示視圖文件是在<code>test/test.blade.php</code>,第二個(gè)參數(shù)是一個(gè)傳遞給視圖層的數(shù)組,里面應(yīng)當(dāng)是<code>key =&gt; value</code>關(guān)聯(lián)數(shù)組,因?yàn)樵?lt;code>blade</code>模板引擎中,會(huì)直接將對(duì)應(yīng)的<code>key</code>轉(zhuǎn)化成一個(gè)可使用的變量,在返回給視圖之前,如果你定義了視圖綁定,如在<code>ComposerServiceProvider</code>中的<code>boot</code>方法中注冊(cè)了對(duì)應(yīng)的視圖綁定的話,那么會(huì)先處理這一步,然后再將數(shù)據(jù)傳給目的文件。<br>在這個(gè)例子中,<code>test.blade.php</code>得到了參數(shù)之后,會(huì)通過<code>blade</code>引擎分析模板文件,解析語(yǔ)法,轉(zhuǎn)化成正常的<code>html</code>文本。<br><code>{{$name}}</code>或<code>{!!$name!!}</code>語(yǔ)法相當(dāng)于<code>&lt;?=$name&gt;</code>,前者為防止xss會(huì)過濾掉一些<code>specialchar</code>,后者則會(huì)直接輸出文本,不安全。<br><code>@if ... @endif</code>則是條件判斷語(yǔ)句,行后面可以跟一個(gè)簡(jiǎn)短的<code>php</code>邏輯判斷<br><code>@foreach ... @endforeach</code> 輪詢數(shù)組<br>其他語(yǔ)法請(qǐng)參考 <a href="https://laravel.com/docs/5.6/blade" rel="nofollow noreferrer">官方文檔</a>。</blockquote> <p>以上的步驟,僅僅是完成了從路由到視圖的簡(jiǎn)單處理,下面看一下數(shù)據(jù)模型,<code>Model</code>層</p> <h5>13. 配置數(shù)據(jù)庫(kù)</h5> <p><code>database.php</code></p>

    // 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,
    ],

    <p><code>.env</code></p> ```// .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 #你自己的密碼

    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的使用

  • 終端進(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-&gt;info('我第一個(gè)命令'); // 會(huì)在終端上輸出該文本 $this-&gt;error('我的命令錯(cuò)了'); // 會(huì)在終端上輸出該文本 $this-&gt;confirm('確認(rèn)我的命令?'); // 選擇yes/no $this-&gt;choice('我還有其他選擇:', ["A", "B"]); // 選擇一個(gè) $this-&gt;output-&gt;progress(); //進(jìn)度條 echo $this-&gt;option('op'); // 獲取所定義參數(shù)值

    之后,在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,代碼如下:

    &lt;?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)行定義:

    &lt;?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-&gt;app-&gt;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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。