laravel5.5開發composer擴展包


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

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM