Laravel扩展包开发

我们在Laravel的项目都使用过扩展包,扩展包给Laravel提供了很多扩展功能,而且有些包可以运行在任何一个框架中,还有一些包只能用在Laravel下,这些包针对Laravel设计了路由,控制器,视图等等。
平时使用中的大多数第三方扩展包都可以运行很多框架中,大家对针对Laravel的扩展包可能不太熟悉,下面我们就来讲讲。
首先让我们创建一个laravel项目

1
composer create-project laravel/laravel cms

命令执行完成后,在根目录下创建一个目录packages/lwcms/core,在目录下进行初始化

1
composer init

根据提示补充完成会生成一个composer.json文件,如果你觉得有不合适的地方可以继续修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"name": "lwcms/core",
"description": "Lwcms Core Package",
"type": "project",
"license": "GPL",
"authors": [
{
"name": "daidongsheng",
"email": "daids@mail.com"
}
],
"minimum-stability": "stable",
"require": {}
}

然后在这个文件夹下我们创建几个文件夹来放一些配置,数据库迁移,然后将所有的类、服务和模型放在src目录下

配置composer.json中的的autoload

1
2
3
4
5
"autoload": {
"psr-4": {
"Lwcms\\Core\\": "src/"
}
}

上面的配置将Lwcms\Core的命名空间关联到src文件夹
下一步,创建providerssrc文件夹下创建CoreServiceProvider

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

use Illuminate\Support\ServiceProvider;

class CoreServiceProvider entends ServiceProvider
{
protected $defer = false;

public function boot()
{
$this->loadRoutesFrom(__DIR__.'/../routes/web.php');
$this->loadViewsFrom(__DIR__.'/../resources/views', 'lwcmscore');
$this->publishes([
__DIR__.'/../resources/views' => resource_path('views/vendor/lwcmscore')
]);
}

public function register()
{

}
}

在Provider里加载路由和视图,处理视图文件发布到laravel中的视图文件夹下
然后创建一个controller,放在src/Http/Controllers

1
2
3
4
5
6
7
8
9
namespace Lwcms\Core\Http\Controllers;

class HomeController extends Controller
{
public function index()
{
return view('lwcmscore::index');
}
}

此处注意视图的命名空间,接着我们创建路由文件

1
2
3
Route::group([], function () {
Route::get('/test', 'Lwcms\\Core\\Http\\Controllers\\HomeController@index');
});

再创建一个视图文件,就完成了基本部分
要使这个包可以auto-discover的话,再配置一下laravel项目下的composer.json

1
2
3
4
5
6
7
8
9
10
"require": {
...
"lwcms/core": "dev-master"
},
"repositories": [
{
"type": "path",
"url": "./packages/lwcms/core/"
}
]

都配置完成后,运行composer dumpautoload命令,这样再打开/test就可以看到效果了。

最后看一下整个package的结构