laravel5.5開發composer擴展包

1. 下載laravel框架,並命名(framework)

composer create-project --prefer-dist laravel/laravel framework "5.4.*"

2. 建立相關目錄

app同級目錄建立packages文件夾,而後依照下面目錄層次建立文件夾,文件能夠稍後建立
目錄層次以下:html

|
|—— 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-autoloadreact

4. 在包的根目錄(packages/archerwong/larapackage)下建立composer.json文件

填入下面內容laravel

{
    "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/"
        }   
    }   
}

注意:根據本身的須要增長依賴等。。。git

5. 各類文件中的內容

5.1 facades文件:LaraPackage.php,這樣能夠方便的訪問IOC容器中註冊的類。

文件內容以下github

<?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

內容以下json

<?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文件

文件內容以下:vim

<?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和時間的數組,開發您的腦洞,固然能夠實現各類複雜功能。segmentfault

在控制器中:數組

利用門面得到 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

https://d.laravel-china.org/docs/5.4/providers

https://d.laravel-china.org/docs/5.4/facades

相關文章
相關標籤/搜索