摘要:一般的包開發(fā)過程是這樣的,開發(fā)好以后打包到,然后在上提交下面我們就來一步一步實(shí)現(xiàn)這個(gè)過程。在新建的項(xiàng)目中建立如下目錄目錄和目錄同級(jí)。我們開發(fā)包的代碼都放在這個(gè)目錄中和完全自定義。
本文最早發(fā)表于本人博客: Laravel Composer Package 開發(fā)實(shí)戰(zhàn) toastr-for-laravel5
在Laravel的文檔中有Package Development,對(duì)于入門開發(fā)人員來說還是比較抽象,因?yàn)殚_發(fā)一個(gè)包需要了解 Service Providers,Service Providers 和 Facade 已經(jīng)夠抽象的了對(duì)剛接觸Laravel的開發(fā)人員來說,所以我來寫一個(gè)簡單的Laravel 包開發(fā)的實(shí)例教程吧。
toastr.js是一個(gè)很方便的通知效果,最近剛發(fā)布了laravel 5.2,所以就來開發(fā)一個(gè)toastr for laravel 5的包吧,主要用toastr結(jié)合laravel的flash session來實(shí)現(xiàn)頁面的一次性消息提醒,其實(shí)這個(gè)在我們?nèi)粘i_發(fā)中頁面操作提醒還是很常用到的業(yè)務(wù)。
一般的laravel 包開發(fā)過程是這樣的,開發(fā)好以后打包push到gitlab,然后在packagist上提交,下面我們就來一步一步實(shí)現(xiàn)這個(gè)過程。
1.在新建的laravel項(xiàng)目中建立如下目錄 packages/yuansir/toastr/src ,packages 目錄和 app 目錄同級(jí)。我們開發(fā)包的代碼都放在這個(gè)src目錄中,yuansir和toastr完全自定義。
2.修改項(xiàng)目的composer.json,設(shè)定PSR-4命名空間:
"autoload": { "classmap": [ "database" ], "psr-4": { "App": "app/", "YuansirToastr": "packages/yuansir/toastr/src/" } },
別忘了執(zhí)行autoload
$ composer dump-autoload
3.為我們的包初始化一個(gè)composer.json文件,熟悉composer的應(yīng)該都知道這玩意是干嘛的了
$ cd pacages/yuansir/toastr/src $ composer init
按照提示填寫相關(guān)信息,有些信息可以不用填寫,后面自己在composer.json中添加就可以了,生成的示例如下:
{ "name": "ryan/toastr-for-laravel", "description": "toastr.js for laravel5", "authors": [ { "name": "Ryan", "email": "yuansir@live.cn" } ], "require": {} }
4.開始開發(fā),新建Service Provider
$ php artisan make:provider ToastrServiceProvider
將生成的app/Providers/ToastrServiceProvider.php文件移動(dòng)到我們的packages/yuansir/toastr/src目錄下面,并注冊(cè)ToastrServiceProvider到config/app.php 的providers 中。
"providers" => [ /* * Laravel Framework Service Providers... */ ...... /* * Application Service Providers... */ ...... YuansirToastrToastrServiceProvider::class, ],
5.新建packages/yuansir/toastr/src/config/toastr.php 來保存toastr.js的options,options配置還蠻多的,具體可以看它的demo。
[] ];
關(guān)于這個(gè)配置在我們包中如何調(diào)用的,我們過會(huì)來說.
6.新建Toastr類,來實(shí)現(xiàn)toastr 的info,success,error,warning的相關(guān)實(shí)現(xiàn),代碼還是很簡單的,packages/yuansir/toastr/src/Toastr.php:
session = $session; $this->config = $config; } public function render() { $notifications = $this->session->get("toastr:notifications"); if(!$notifications) { return ""; } foreach ($notifications as $notification) { $config = $this->config->get("toastr.options"); $javascript = ""; $options = []; if($config) { $options = array_merge($config, $notification["options"]); } if($options) { $javascript = "toastr.options = " . json_encode($options) . ";"; } $message = str_replace(""", """, $notification["message"]); $title = $notification["title"] ? str_replace(""", """, $notification["title"]) : null; $javascript .= " toastr.{$notification["type"]}("$message","$title");"; } return view("Toastr::toastr", compact("javascript")); } /** * Add notification * @param $type * @param $message * @param null $title * @param array $options * @return bool */ public function add($type, $message, $title = null, $options = []) { $types = ["info", "warning", "success", "error"]; if(!in_array($type, $types)) { return false; } $this->notifications[] = [ "type" => $type, "title" => $title, "message" => $message, "options" => $options ]; $this->session->flash("toastr:notifications", $this->notifications); } /** * Add info notification * @param $message * @param null $title * @param array $options */ public function info($message, $title = null, $options = []) { $this->add("info", $message, $title, $options); } /** * Add warning notification * @param $message * @param null $title * @param array $options */ public function warning($message, $title = null, $options = []) { $this->add("warning", $message, $title, $options); } /** * Add success notification * @param $message * @param null $title * @param array $options */ public function success($message, $title = null, $options = []) { $this->add("success", $message, $title, $options); } /** * Add error notification * @param $message * @param null $title * @param array $options */ public function error($message, $title = null, $options = []) { $this->add("error", $message, $title, $options); } /** * Clear notifications */ public function clear() { $this->notifications = []; } }
7.我們看到view(‘Toastr::toastr’, compact(‘javascript’));,那么就是需要一個(gè)視圖文件了,關(guān)于Toastr::toastr是什么鬼我們過會(huì)來說,新建 packages/yuansir/toastr/src/views/toastr.blade.php 視圖文件:
就是引入了tastr插件,輸出我們r(jià)ender方法中的$javascript
8.建立Facade,新建packages/yuansir/toastr/src/Facades/Toastr.php
9.修改ToastrServiceProvider:
loadViewsFrom(__DIR__ . "/views", "Toastr"); $this->publishes([ __DIR__."/views" => base_path("resources/views/vendor/toastr"), __DIR__."/config/toastr.php" => config_path("toastr.php"), ]); } /** * Register the application services. * * @return void */ public function register() { $this->app["toastr"] = $this->app->share(function ($app) { return new Toastr($app["session"], $app["config"]); }); } /** * Get the services provided by the provider. * * @return array */ public function provides() { return ["toastr"]; } }$this->loadViewsFrom(__DIR__ . ‘/views’, ‘Toastr’); 就是表示Toastr命名空間的視圖文件沖當(dāng)前目錄的views目錄中渲染,所以我們上面用 return view(‘Toastr::toastr’, compact(‘javascript’));
$this->publishes 在執(zhí)行php artisan vendor:publish 時(shí)會(huì)將對(duì)應(yīng)的目錄和文件復(fù)制到對(duì)應(yīng)的位置
10.測試下是否可行,修改 config/app.php 添加如下:
/* |-------------------------------------------------------------------------- | Class Aliases |-------------------------------------------------------------------------- | | This array of class aliases will be registered when this application | is started. However, feel free to register as many as you wish as | the aliases are "lazy" loaded so they don"t hinder performance. | */ "aliases" => [ ...... "Toastr" => YuansirToastrFacadesToastr::class, ],寫個(gè)控制器放進(jìn)去試試:
反正我測試是OK了,就不截圖了??!
11.修改命名空間到包的composer.json,因?yàn)閯e人安裝這個(gè)包的時(shí)候不可能也去改項(xiàng)目composer.json的PSR-4的autoload,所以我們把PSR-4的命名空間加到這個(gè)包的composer.json中去,修改packages/yuansir/toastr/src/composer.json 如下:
{ "name": "ryan/toastr-for-laravel", "description": "toastr.js for laravel5", "authors": [ { "name": "Ryan", "email": "yuansir@live.cn" } ], "require": {}, "autoload": { "psr-4": { "YuansirToastr": "src/" } } }12.建立Github項(xiàng)目
將代碼push到項(xiàng)目中去:
$ cd packages/yuansir/toastr/ $ git init $ git add . $ git commit -m "add package source files." $ git remote add origin git@github.com:yuansir/toastr-for-laravel5.git $ git push -u origin master $ git tag -a 1.0.0 -m "version 1.0.0" $ git push --tags13.提交到Packagist,打開到packagist.org,登陸后點(diǎn)擊右邊上角的 submit,并填入git的項(xiàng)目地址git@github.com:yuansir/toastr-for-laravel5.git 點(diǎn)擊check 就OK了
到此結(jié)束,大功告成,這樣一個(gè)Laravel 的 composer 包就開發(fā)完成了。
這個(gè)教程的源碼和這個(gè)包的安裝使用方法詳見github?https://github.com/yuansir/toastr-for-laravel5
如有問題歡迎指正!轉(zhuǎn)載請(qǐng)注明:?轉(zhuǎn)載自Ryan是菜鳥 | LNMP技術(shù)棧筆記
如果覺得本篇文章對(duì)您十分有益,何不 打賞一下
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/30324.html
使用場景 在引用第三方包的時(shí)候,對(duì)第三方包有改動(dòng)需求,需要將代碼放在自己的倉庫;并且自己的其他項(xiàng)目也有需求引用自定義的第三方包;甚至自己會(huì)發(fā)布修改后的第三方包; 讀完本文你講獲得: Git Submodule的基本使用 從本地加載第三方包 從自定義倉庫地址獲取擴(kuò)展包 快速創(chuàng)建第三方包 本文是在我自己想要?jiǎng)?chuàng)建一個(gè)基礎(chǔ)第三方包的時(shí)候記錄下的操作步驟 1、利用git submoudle在已有項(xiàng)目中使...
摘要:流程一新項(xiàng)目流程創(chuàng)建,并添加依賴到的擴(kuò)展包運(yùn)行,安裝擴(kuò)展包并生成提交到代碼版本控制器中,如流程二項(xiàng)目協(xié)作者安裝現(xiàn)有項(xiàng)目克隆項(xiàng)目后,根目錄下直接運(yùn)行從中安裝指定版本的擴(kuò)展包以及其依賴此流程適用于生產(chǎn)環(huán)境代碼的部署。 本文經(jīng)授權(quán)轉(zhuǎn)自 PHPHub 社區(qū) 問題說明 我們經(jīng)常要往現(xiàn)有的項(xiàng)目中添加擴(kuò)展包,有時(shí)候因?yàn)槲臋n的錯(cuò)誤引導(dǎo),如下圖來自 這個(gè)文檔 的: showImg(https://dn-...
摘要:本文參考超哥寫的基于的模塊化開發(fā)的詳細(xì)實(shí)踐版。包本地開發(fā)本地開發(fā)一個(gè)包做法基本與包開發(fā)一樣,簡單過一下吧。首先創(chuàng)建一個(gè)新的項(xiàng)目在項(xiàng)目中創(chuàng)建如下目錄為我們要發(fā)布的包,對(duì)應(yīng)為,對(duì)應(yīng)為項(xiàng)目名。 showImg(https://segmentfault.com/img/remote/1460000010891977); 本文參考超哥寫的 基于 Composer 的 PHP 模塊化開發(fā) 的詳細(xì)實(shí)...
摘要:但也因?yàn)閼?yīng)有盡有使得框架的性能比其他高性能框架低了些,為此給了幾個(gè)解決方案路由緩存經(jīng)有關(guān)部門研究,路由緩存可有效加快訪問速度以上。有朋友說框架最重要的東西是路由,我倒認(rèn)為最重要的是框架中異于其他框架且能解決痛點(diǎn)的東西,如的。 showImg(https://segmentfault.com/img/remote/1460000006767764); 在程序界的遠(yuǎn)古時(shí)期,大神們手持鍵盤敲...
摘要:加了代理,而對(duì)這個(gè)配置默認(rèn)執(zhí)行操作,導(dǎo)致了連接錯(cuò)誤。失敗的執(zhí)行時(shí)候會(huì)報(bào)錯(cuò)這是因?yàn)橥ㄟ^調(diào)用自身的方法,使用根據(jù)主鍵去重復(fù)的邏輯覆蓋了的邏輯。 emoji utf8 編碼問題 https://laravel-china.org/top... function nickname_encode($s){ $chars = preg_split(//u, $s, null, ...
閱讀 3006·2023-04-26 02:22
閱讀 2353·2021-11-17 09:33
閱讀 3247·2021-09-22 16:06
閱讀 1160·2021-09-22 15:54
閱讀 3597·2019-08-29 13:44
閱讀 2020·2019-08-29 12:37
閱讀 1373·2019-08-26 14:04
閱讀 1976·2019-08-26 11:57