laravel composer 扩展包开发(超详细)

置顶 2018年02月05日 11:09:16 Simael__Aex 阅读数:10396
 
 版权声明:转载请注明出处:http://blog.csdn.net/m0sh1 http://blog.share345.com/ https://blog.csdn.net/m0sh1/article/details/79257935

原文章写在自己的博客: http://blog.share345.com/2018/02/05/laravel-package-development.html 
文章适用于laravel 包开发,当然如果你理解着完成一遍,就可以发现他也适用于 composer 扩展包开发,不是必须在laravel 下。 
首先在 laravel 根目录创建文件夹 packages 这里放置我们准备创建的扩展包,这个目录只是暂时存放我们的扩展包代码,等我们开发完成配置好了,就不需要他了。 
当然如果你不需要发布你的包,以后也可以就使用这个目录。packages 目录和 laravel 的 app 目录同级 
然后进入packages 创建目录 aex 当然这个名字可以随意起(最好是作者的名之类的), 
接着进入 aex 目录创建目录 packagetest 这个目录的名称最好是你的扩展包名称,有点意义。 我就是为了测试,所以就叫做 packagetest 好了 
然后创建目录 src 这里就是我们放置代码的地方啦。 
接着命令行下进入 packages/aex/packagetest 执行 composer init 他会一步步询问你要填写的信息: 
 
执行完成你会在 packagetest 目录下看到 composer.json 内容和上图一致。 当然其实你也可以直接复制一个 composer.json 不需要 composer init 
我的 composer.json 内容如下:

{
"name": "aex/packagetest-for-laravel",
"authors": [
{
"name": "aex",
"email": "email@email.com"
}
],
"require": {}
}

你也可以根据 composer.json 的规则添加相应的其它配置 
目前目录结构是这样的:

虽然你知道代码都在 src目录下,但是 laravel 不知道,所以你要告诉他,即配置 laravel 根目录的 composer.json 
修改 autoload 改为类似如下:

"autoload": {
"classmap": [
"database"
],
"psr-4": {
"App\\": "app/",
"Aex\\Packagetest\\": "packages/aex/packagetest/src/"
}
},

然后创建服务:使用 artisan 命令

php artisan make:provider PackagetestServiceProvider

执行完成,laravel 在 app/Providers下会生成 PackagetestServiceProvider.php 然后你把他剪切到 你的 src目录:packages/aex/packagetest/src 
同时修改代码的命名空间为你刚刚定义的:namespace Aex\Packagetest; 顺便把注册服务等都写完吧,完成代码如下:

 <?php
namespace Aex\Packagetest;
use Illuminate\Support\ServiceProvider;
class PackagetestServiceProvider extends ServiceProvider
{
/**
* 服务提供者加是否延迟加载.
*
* @var bool
*/
protected $defer = true; // 延迟加载服务
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
$this->loadViewsFrom(__DIR__ . '/views', 'Packagetest'); // 视图目录指定
$this->publishes([
__DIR__.'/views' => base_path('resources/views/vendor/packagetest'), // 发布视图目录到resources 下
__DIR__.'/config/packagetest.php' => config_path('packagetest.php'), // 发布配置文件到 laravel 的config 下
]);
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{
// 单例绑定服务
$this->app->singleton('packagetest', function ($app) {
return new Packagetest($app['session'], $app['config']);
});
}
/**
* Get the services provided by the provider.
*
* @return array
*/
public function provides()
{
// 因为延迟加载 所以要定义 provides 函数 具体参考laravel 文档
return ['packagetest'];
}
}

自问自答:

1.为什么创建的服务要放到src 下? – 你要开发扩展包,放到laravel下面就不算扩展包了,你的包以后要给别人用,别人会统一安装到vendor下的,总不能单独把 service 文件也打包上传吧。 
同理服务定义了 publish , 配置和视图不同系统需求肯定不一样,为了让人家修改,所以我们提供发布到laravel 原始视图和配置路径的方法,总不能让人家下载了你的到 到 vendor下修改吧。 
2.那么 composer.json 里的命名空间为什么修改的是laravel 根目录的? – 啪!多嘴!哦,不对,啪啪啪啪!!! 问的好!,这个我们还没讲完嘛,后面会给他提出来的,我们需要先跑通我们的代码,再完善成可发布的 
接下来注册我们的服务到 config/app.php (你使用别人家的包都需要这步的) 
添加一行 Aex\Packagetest\PackagetestServiceProvider::class 
下一步添加配置文件: 
在 src 目录下添加 config 目录然后添加文件 packagetest.php 内容如下:

<?php
return [
'options' => [] // 只是为了演示
];

下一步创建我们的服务真正逻辑实现的代码: 在src目录下创建文件 Packagetest.php 内容如下:
 <?php
namespace Aex\Packagetest;
use Illuminate\Session\SessionManager;
use Illuminate\Config\Repository;
class Packagetest
{
/**
* @var SessionManager
*/
protected $session;
/**
* @var Repository
*/
protected $config;
/**
* Packagetest constructor.
* @param SessionManager $session
* @param Repository $config
*/
public function __construct(SessionManager $session, Repository $config)
{
$this->session = $session;
$this->config = $config;
}
/**
* @param string $msg
* @return string
*/
public function test_rtn($msg = ''){
$config_arr = $this->config->get('packagetest.options');
return $msg.' <strong>from your custom develop package!</strong>>';
}
}

下一步创建视图文件:在src目录下添加views目录然后添加 packagetest.blade.php

@extends('layouts.app')
@section('content')
<h1>Packagetest Message</h1>
{{$msg}}
@endsection

下一步创建门面(Facades): 在src目录下添加 Facades目录然后添加 Packagetest.php

 <?php
namespace Aex\Packagetest\Facades;
use Illuminate\Support\Facades\Facade;
class Packagetest extends Facade
{
protected static function getFacadeAccessor()
{
return 'packagetest';
}
}

然后命令行执行 :
 composer dump-autoload 

这样就能够使用命名空间 Aex\Packagetest 了,上面在 config/app.php 下添加的服务那行就真正生效了。(如果不执行 dump-autoload 运行程序会报错,说找不到类) 
既然我们定义了门面 那么我们就可以为这个服务添加别名了。在 config/app.php 的 aliases 数组添加一行:

 'Packagetest' => Aex\Packagetest\Facades\Packagetest::class 

现在我们的目录结构类似: 
 
至此代码其实就已经跑通了,但是还没有完全完成。我们先测试下试试,随便找个 controller 当然 route要定义好:例如:TestController.php

 <?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Packagetest;
class TestController extends Controller
{
public function test(Request $request){
$a = Packagetest::test_rtn('Aex');
return view('Packagetest::packagetest',['msg'=>$a]);
}
}

然后根据路由访问就可以看到效果啦。为什么说没有完全完成呢?因为 视图文件和 config 配置文件还在我们的包里定义,以后发布出去,包会在 vendor目录下,这些文件不应该在vendor下修改 

所以命令行执行:

 php artisan vendor:publish --provider="Aex\Packagetest\PackagetestServiceProvider" // --provider 参数指定了要发布的服务 你也可以省略来发布所有 

发布后你就会在 laravel 本身的 config目录 和 views/vendor/packagetest 下看到你的文件了,也就可以按照需求随意修改了。 
最后我们说 修改的laravel 的composer.json ,我们要发布我们的包,让所有人都能使用 composer 安装,那么执行如下步骤 
去掉 添加的 那行 “Aex\Packagetest\”: “packages/aex/packagetest/src/” 然后 修改 packages/aex/packagetest/composer.json 
添加 autoload:

"autoload": {
"psr-4": {
"Aex\\Packagetest\\": "src/"
}
}

这样包就是一个完整独立的包了,然后把他提交到你的 GitHub 上。 
提交到 github 上的我的目录结构是: 
 
我的地址是:https://github.com/ALawating-Rex/packagetest-for-laravel 有需要参考的可以参考下。 
接着就是把包提交到 packagelist了, 网址: https://packagist.org/ 如果没有账户则注册一个 
然后点击 submit ,填写项目URL,点击check 
 
成功后点击 submit 就完成了。 至此你的包就可以像其它人的一样通过 composer require 安装了 
如上图,两个箭头分别代表了包名称 和 版本 
所以安装这个包的时候你的 composer.json 在require可以加这样一行:

"aex/packagetest-for-laravel": "dev-master"

安装之前我们先把我们之前开发的这个包都删除吧,就假设是一个别人的 laravel 框架要用我们的包: 删除 packages 文件夹 
删除 config/packagetest.php 
删除 resources/views/vendor/packagetest 
conifg/app.php 里面删除添加的服务和别名 
controller 里的改动就保留吧,因为安装完还是要这么写一遍 最后执行 composer dump-autoload 
下面安装这个自定义包吧: composer update aex/packagetest-for-laravel 
然后添加服务: 修改 config/app.php 添加 
Aex\Packagetest\PackagetestServiceProvider::class 
和别名的配置: 
‘Packagetest’ => Aex\Packagetest\Facades\Packagetest::class 
执行 composer dump-autoload 
发布资源文件: php artisan vendor:publish –provider=”Aex\Packagetest\PackagetestServiceProvider” 
测试通过 大功告成! 
额外的: 
1.在 packagelist 你的这个包页面可以看到提示了 Set Up GitHub Service Hook 你可以按照提示办法安装,安装完成后,一旦你的项目有push,这里就会跟着更新。 
2.还是 packagelist 页面,可以看到目前你只有 dev-master 版本,假设你需要其它的版本 你可以去你的 github 项目添加 tag 
git tag 1.0.0 && git push –tags 
这样composer require 就可以指定别的版本了。 
3.为了别人能够更加清晰的使用你的包,完善你的 Readme 吧 
4.不是必须laravel 框架,单纯的 composer 扩展包开发也是按照这个步骤来,只不过需要你摘出 laravel 结合的部分。

laravel composer 扩展包开发(超详细)的更多相关文章

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

    laravel5.5+ laravel官方地址 laravel是目前最流行的php框架,发展势头迅猛,应用非常广泛,有丰富的扩展包可以应付你能想到的各种应用场景,laravel框架思想前卫,跟随时代潮 ...

  2. 基于Composer的Laravel扩展包开发工作流

    使用场景 在引用第三方包的时候,对第三方包有改动需求,需要将代码放在自己的仓库:并且自己的其他项目也有需求引用自定义的第三方包:甚至自己会发布修改后的第三方包: 读完本文你讲获得: Git Submo ...

  3. 基于Composer的Laravel扩展包开发工作流 ,实现laravle项目的文件管理(记录成长)

    PHP Composer包开发 基于Composer的Laravel扩展包开发工作流 实现laravle项目的文件管理,添加文件/文件夹,删除文件,查看代码/文件(代码支持缩进,支持语法高亮) com ...

  4. laravel5.5开发composer扩展包

    目录 1. 下载laravel框架,并命名(framework) 2. 创建相关目录 3. 项目根目录下的composer.json文件中声明命名空间 4. 在包的根目录(packages/arche ...

  5. laravel扩展包开发步骤总结

    1. 创建包 php artisan workbench vendor/package --resources     注:  vendor:开发商名   package:包名   2.修改下包里co ...

  6. Laravel图表扩展包推荐:Charts

     2016年11月15日 ·  2283次 ·  4条 ·  laravel,package,charts 介绍 在项目开发中,创建图表通常是一件痛苦的事情.因为你必须将数据转换为图表库支持的格式传输 ...

  7. Laravel 调试利器 —— Laravel Debugbar 扩展包安装及使用教程

    1.简介 Laravel Debugbar 在 Laravel 5 中集成了 PHP Debug Bar ,用于显示调试及错误信息以方便开发.该扩展包包含了一个 ServiceProvider 用于注 ...

  8. 正确的 Composer 扩展包安装方法

    问题说明 我们经常要往现有的项目中添加扩展包,有时候因为文档的错误引导,如下图来自 这个文档 的: composer update 这个命令在我们现在的逻辑中,可能会对项目造成巨大伤害. 因为 com ...

  9. 【转】正确的 Composer 扩展包安装方法

    简单解释 composer install - 如有 composer.lock 文件,直接安装,否则从 composer.json 安装最新扩展包和依赖: composer update - 从 c ...

随机推荐

  1. BZOJ_1441_Min_数学+裴蜀定理

    BZOJ_1441_Min_数学+裴蜀定理 Description 给出n个数(A1...An)现求一组整数序列(X1...Xn)使得S=A1*X1+...An*Xn>0,且S的值最小 Inpu ...

  2. J2ee的SSM和SSH的小结

    1.介绍SSM框架: SSM是指由Spring.SpringMVC.Mybatis三个开源框架整合的开发框架. a).Spring是一个轻量级的容器框架,核心是控制反转(IoC)和面向切面(AOP). ...

  3. HDU5110:Alexandra and COS(分块+容斥)

    传送门 题意 给出\(n*m\)的矩阵,'X'代表treasure.\(q\)个询问,每次询问(x,y)且频率为d的潜艇能探索到多少财富.探索范围要求abs(x1-x)>=abs(y1-y),也 ...

  4. poj2389 普通的大数乘法

    = =.每次这种题目说只有40位 然而要开到100位,心里总是一万匹草泥马在奔腾: #include <iostream> #include <stdio.h> #includ ...

  5. CF487E Tourists【圆方树+tarjan+multiset+树剖+线段树】

    圆方树不仅能解决仙人掌问题(虽然我仙人掌问题也没用过圆方树都是瞎搞过去的),还可以解决一般图的问题 一般图问题在于缩完环不是一棵树,所以就缩点双(包括双向边) 每个方点存他所在点双内除根以外的点的最小 ...

  6. Codeforces732F Tourist Reform

    求出无向图的所有边双联通分量,然后缩点就成了一颗树. 然后我们选取最大的那个边双联通分量作为根,这样我们就可以确定所有割边的方向了. 对于边双联通分量里面的边,我们随便dfs一下就可以把它变成强连通分 ...

  7. hdu 1558 Segment set 计算几何+并查集★

    #include <cstdio> #include <iostream> #include <string.h> using namespace std; ; # ...

  8. HDFS Java API

    HDFS Java API 搭建Hadoop客户端与Java访问HDFS集群

  9. (四)python自带解释器(IDLE)的使用

    什么是IDE? Integrated Development Environment(集成开发环境) 打个不恰当的比方,如果说写代码是制作一件工艺品,那IDE就是机床.再打个不恰当的比方,PS就是图片 ...

  10. URAL 1890 . Money out of Thin Air (dfs序hash + 线段树)

    题目链接: URAL 1890 . Money out of Thin Air 题目描述: 给出一个公司里面上司和下级的附属关系,还有每一个人的工资,然后有两种询问: 1:employee x y z ...