Laravel5 开发 package 实例教程

经过一阵摸索,终于学会了开发 Laravel 的 package,在此做做笔记备忘:-)

本文将以一个简单的实例:文本转图片,做一篇 package 开发教程。主要功能就是把文本转成图片,再输出到浏览器显示。

课前预备

  1. 熟悉 Laravel 开发
  2. 了解 Laravel 运行机制(IoC、DI 等
  3. 了解服务提供者(Service Providers
  4. 了解服务容器(Service Container
  5. 了解 Facade

以上几点务必要弄懂,不然本文可能会看的不明不白。

测试环境

  • CentOS 7.0
  • Nginx 1.8.0
  • PHP 5.6.13
  • Laravel 5.2

开发步骤

安装最新版的 Laravel

目前最新版的是 5.2,按步骤安装就行了。

创建 package 目录

在 Laravel 的根目录下创建文件夹结构:laravel-package-develop-1
如图中所示,dreamlike 文件夹指 package 的创建者,可以自定义;text2image 文件夹指 package 的名字,可以自定义。

初始化 composer.json

进入终端,然后进入目录 packages/dreamlike/text2image,初始化 composer.json,然后按提示操作即可:

1
composer init

laravel-package-develop-2
然后在目录 packages/dreamlike/text2image 下可以找到 composer.json,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
{
"name": "dreamlike/text2image",
"description": "Convert Text to Image",
"license": "MIT",
"authors": [
{
"name": "Broly",
"email": "broly8@qq.com"
}
],
"minimum-stability": "dev",
"require": {}
}

修改主 composer.json

注意了,这里指的 composer.json 是 Laravel 根目录下的,不是刚刚生成的那个(我就在这里吃过亏,搞错了)。在节点 "autoload" 的子节点 "psr-4" 下增加内容,如下:

1
"Dreamlike\\Text2Image\\": "packages/dreamlike/text2image/src"
1
2
3
4
5
6
7
8
9
"autoload": {
"classmap": [
"database"
],
"psr-4": {
"App\\": "app/",
"Dreamlike\\Text2Image\\": "packages/dreamlike/text2image/src"
}
},

其中,这句话的意思是把命名空间 Dreamlike\Text2Image\ 指向目录 packages/dreamlike/text2image/src
然后在终端,Laravel 根目录输入:

1
composer dump-autoload

创建服务提供者 Service Providers

在 packages/dreamlike/text2image/src/ 目录下创建文件夹 Providers 在终端,Laravel 根目录输入:

1
php artisan make:provider Text2ImageServiceProvider

这样 Artisan 就会自动帮我们生成一个服务提供者的模板。其中,Text2ImageServiceProvider 是服务提供者的名字。该文件会生成在 app/Providers 目录下,找到这个文件,把它移动到 packages/dreamlike/text2image/src/Providers 目录。

创建 Facades

在 packages/dreamlike/text2image/src/ 目录下创建文件夹 Facades,然后创建文件 Text2Image.php,编辑内容为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php

namespace Dreamlike\Text2Image\Facades;

use Illuminate\Support\Facades\Facade;

class Text2Image extends Facade
{
/**
* Get the registered name of the component.
*
* @return string
*/
protected static function getFacadeAccessor()
{
return 'text2image';
}
}

创建实例类

在 packages/dreamlike/text2image/src/ 目录下创建 T2I.php,并编辑内容为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php

namespace Dreamlike\Text2Image;

class T2I {
public function __construct() {}

public function make($text) {
// 建立一幅 100X30 的图像
$im = imagecreate(200, 30);

// 白色背景和蓝色文本
$bg = imagecolorallocate($im, 255, 255, 255);
$textcolor = imagecolorallocate($im, 0, 0, 255);

// 把字符串写在图像左上角
imagestring($im, 5, 0, 0, $text, $textcolor);

// 输出图像
header("Content-Type: image/jpeg");
imagejpeg($im);
imagedestroy($im);
}
}

绑定实例类

编辑文件 packages/dreamlike/text2image/src/Providers/Text2ImageServiceProvider.php,修改内容为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php

// 此处改为实际的命名空间
//namespace App\Providers;
namespace Dreamlike\Text2Image\Providers;

use Illuminate\Support\ServiceProvider;

use Dreamlike\Text2Image\T2I;

class Text2ImageServiceProvider extends ServiceProvider {
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot() {
//
}

/**
* Register the application services.
*
* @return void
*/
public function register() {
//
$this->app->singleton('text2image', function($app) {
return new T2I();
});
}
}

config/app.php 中添加服务提供者

安装过 Laravel 三方包的应该都知道该怎么操作:

1
2
3
4
5
6
7
8
9
10
11
'providers' => [
// ...
// Broly: add custom providers
Dreamlike\Text2Image\Providers\Text2ImageServiceProvider::class,
],

'aliases' => [
// ...
// Broly: add custom facades
'T2I' => Dreamlike\Text2Image\Facades\Text2Image::class,
],

在 controller 中测试

新建一个 controller,在配置路由,测试我们刚刚开发的 package 是否可用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;

use T2I;

class HomeController extends Controller {
/**
* Broly: Home Index
*
* @param Request $request
* @return Response
*/
public function getIndex(Request $request) {
return T2I::make("Dreamlike Blog");
}
}

测试结果:laravel-package-develop-3

发布到 Github 和 Packagist

这个读者自己摸索吧,不是很难的。

参考资料