1. 下載laravel框架,並命名(framework)
composer create-project --prefer-dist laravel/laravel framework "5.4.*"
2. 創建相關目錄
app同級目錄創建packages文件夾,然后依照下面目錄層次創建文件夾,文件可以稍后創建
目錄層次如下:
|
|—— packages
| |—— archerwong
| |—— larapackage 實際我們開發包的根目錄
| |—— src
| |—— ArcherWong
| |—— LaraPackage
| |—— LaraPackage.php 定義facades
| |—— LaraPackageProvider.php 定義服務提供者
| |—— MoreAction.php 定義服務提供者提供的各種服務
| |—— Controllers
| |—— IndexController.php 和下面的包路由配合,實現控制器--路由聯動
| |—— views 視圖文件夾
| |—— message.blade.php
| |—— welcome.blade.php
| |—— routes.php 包路由
| |—— composer.json
3. 項目根目錄下的composer.json文件中聲明命名空間
"autoload": {
"classmap": [
"database"
],
"psr-4": {
"App\\": "app/",
"ArcherWong\\LaraPackage\\":"packages/archerwong/larapackage/src/"
}
},
注意:重新生成autoload文件 ,命令:composer dump-autoload
4. 在包的根目錄(packages/archerwong/larapackage)下創建composer.json文件
填入下面內容
{
"name": "archer-wong/larapackage",
"description": "how to develop a laravel package",
"license": "MIT",
"authors": [
{
"name": "archer-wong",
"email": "wong_chiu@163.com"
}
],
"minimum-stability": "dev",
"require": {
"php": ">=5.6.4"
},
"autoload": {
"psr-0": {
"ArcherWong\\LaraPackage": "src/"
}
}
}
注意:根據自己的需要增加依賴等。。。
5. 各種文件中的內容
5.1 facades文件:LaraPackage.php,這樣可以方便的訪問IOC容器中注冊的類。
文件內容如下
<?php
namespace ArcherWong\LaraPackage;
use Illuminate\Support\Facades\Facade;
class LaraPackage extends Facade
{
public static function getFacadeAccessor()
{
//return 的字符串會在相應的provider中使用
return 'larapackage';
}
}
5.2 定義服務提供者:在該文件夾下創建LaraPackageProvider.php
內容如下
<?php
namespace ArcherWong\LaraPackage;
use Illuminate\Support\ServiceProvider;
class LaraPackageProvider extends ServiceProvider
{
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
//注冊擴展包視圖,並起個名字,方便我們調用該文件夾下的視圖
$this->loadViewsFrom(__DIR__.'/../../views','LaraPackageView');
//注冊擴展包路由,使用php artisan route:list 命令可以查看是否生效
$this->loadRoutesFrom(__DIR__.'/../../routes.php');
//可以將相應的資源(不僅限於views文件夾)發布到laravel項目的某個位置,下面將views文件夾放到了我們常用的視圖文件夾下
$this->publishes([
__DIR__.'/../../views'=>base_path('resources/views/vendor/lara-package'),
]);
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{
//這里使用到了facades中的字符串
$this->app->singleton('larapackage',function(){
//我們可以通過facades的aliase訪問下面的MoreAction
//會在config的app.php文件中進行服務提供者和別名的注冊
return $this->app->make('ArcherWong\LaraPackage\MoreAction');
});
}
}
5.3 創建MoreAction.php文件
文件內容如下:
<?php
namespace ArcherWong\LaraPackage;
class MoreAction
{
public function getInfo()
{
$user_ip = $_SERVER["REMOTE_ADDR"];
$time = date('Y-m-d H:i:s');
return ['user_ip' => $user_ip, 'time' => $time];
}
}
注意:以下內容和上面有個分割,上面其實已經實現一個包最簡單的功能,以上只是返回一個包含ip和時間的數組,開發您的腦洞,當然可以實現各種復雜功能。
在控制器中:
利用門面獲得 LaraPackage::getInfo();
返回包中的視圖 return view('LaraPackageView::welcome',['data' => $data]);
在視圖中:
@include('LaraPackageView::message')
下面內容是為了演示laravel包開發中的控制器,路由,視圖的開發。
5.4 controller文件夾下創建IndexController.php
<?php
namespace ArcherWong\LaraPackage\Controllers;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Support\Facades\View;
use LaraPackage;
class IndexController extends BaseController
{
public function index() {
//$data = 'Hello World';
$data = LaraPackage::getInfo();
//可以直接使用創建的包里的視圖,注意調用是兩個冒號
return view('LaraPackageView::welcome',['data' => $data]);
}
}
5.5 視圖文件
1> welcome.blade.php文件
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Laravel</title>
</head>
<body>
<!--可以直接引入視圖中的其他文件-->
@include('LaraPackageView::message')
<div>
您的ip地址是:{{ $data['user_ip'] }}
</div>
<div>
當前時間是:{{ $data['time'] }}
</div>
</body>
</html>
2> message.blade.php 文件
<div>
<div>
<div>學習laraval擴展包開發</div>
</div>
</div>
5.6 routes.php
<?php
//包中路由配置文件
Route::get('hello','ArcherWong\LaraPackage\Controllers\IndexController@index');
$ vim welcome.blade.php
6. 將包發布到github和packagist上
1> 首先創建一個github項目
拿到對應的倉庫地址 :git@github.com:archer-wong/larapackage.git
2> 然后進入packages/archerwong/larapackage文件夾下(也就是我們開發的包的根目錄),將包內容上傳到github
git init
git add .
git commit -m "first commit"
git remote add origin git@github.com:archer-wong/larapackage.git
git push -u origin master
3>去倉庫的setting => Intergrations&services添加Packagist同步服務,


此時需要你的packagist的賬號信息,所以我們先進入https://packagist.org(使用github賬號登錄,免去麻煩),找到右上角的submit按鈕,輸入我們剛上傳包的github倉庫地址,進行check驗證

審核通過后,類似如下,記下包的packagist地址https://packagist.org/packages/archer-wong/larapackage

然后繼續我們的github和packagist的自動同步設置
用戶信息,請填寫賬號,不要寫郵箱地址
進入個人信息可以拿到token信息
domain地址填寫剛拿到的包packagist地址
此時我們的版本是dev-master

引入的方法是 composer require archer-wong/larapackage “dev-master" 不加版本會報錯
如果后期有人提出了一些issues你去修改了自己的package
那么我們會去增加別的tag 也是就是說你修改package之后 再去添加一個tag:
git tag -a 0.1.1 -m 'first version'
填寫說明信息后 推送這個tag:
git push origin --tags
參考資料
https://segmentfault.com/a/1190000009069449
https://d.laravel-china.org/docs/5.4/packages#public-assets
