一步步带你开发 Laravel 5.5 扩展包(实战教程)
Laravel 主要通过扩展包增加功能。在这篇文章中,依据 Getting Started with Laravel 5.4 and MongoDB 指导创建了 MongoDB composer package 。我推荐在 Laravel 5.5中使用 package auto-discovery feature 。
首先,我们来了解下扩展包在 Packagist 发布之后该怎么在 Laravel 项目中使用。
已发布的扩展包的使用教程
如果没有安装 MongoDB,请先安装。接着创建一个新的 Laravel 项目。
composer create-project laravel/laravel myproject dev-develop\
cd myproject
在 Laravel 5.5版本最终发布之后,你可以使用
laravel new myproject
安装。现在请使用当前的开发分支(dev-develop)。
增加 composer 扩展包 markustripp/mongo
:
composer require markustripp/mongo
从扩展包中复制配置文件到你的项目中(可选):
php artisan vendor:publish
请选择服务提供者:
Markustripp\Mongo\MongoServiceProvider
现在你已经准备好使用 Mongo
facade。编辑 routes/web.php
(仅仅为了测试):
<?php
Route::get('mongo', function(Request $request) {
$collection = Mongo::get()->mydatabase->mycollection;
return $collection->find()->toArray();
});
Route::get('/', function () {
return view('welcome');
});
打开命令行,连接 MongoDB
,创建一个数据库和集合,同时插入一个文档。
mongo
> use mydatabase
> db.mycollection.insert( { "hello": "world" } )
如果你使用 Valet ,那么 myproject.dev/mongo 仅返回你添加的 json 文档。
现在知道怎么使用扩展包了吧,让我们从头开始创建这个包。
创建新包
一个包通常由两部分组成:包项目和测试项目. 我个人的建议是将两个项目独立开,当然对于团队共同开发的包,则需要在包项目相同的目录下创建一个公共的目录
例如:单一的目录结构
./package-1
./package-2
./package-3
./project-1
./project-2
例如:包项目与测试目录相对应
./packages/package-1
./packages/package-2
./packages/package-3
./projects/project-1
./projects/project-2
在这个示例中,我将会使用单一的目录结构,并且将包项目命名projects
创建包目录
原本打算将包命名为markustripp/mongo
(但是github上已经有相同包名称Github repository). 因此将会以 “mongo”作为包的命名
mkdir mongo
创建 Composer 文件
composer 配置文件描述包并且列出所有的依赖关系,composer init 命令会帮助你创建这个文件。
cd mongo
composer init
composer init for markustripp/mongo project
现在我们创建了基本的 composer 配置文件,就让我们使用 PSR-4
自动加载命名空间映射。
"autoload": {
"psr-4": {
"Markustripp\\Mongo\\": "src/"
}
},
Laravel 5.5 介绍了 包自动加载特性 就让我们为 MongoServiceProvider 和 mongofacade 添加配置:
"extra": {
"laravel": {
"providers": [
"Markustripp\\Mongo\\MongoServiceProvider"
],
"aliases": {
"Mongo": "Markustripp\\Mongo\\MongoFacade"
}
}
}
这里是最终的 composer.json 文件:
{
"name": "markustripp/mongo",
"description": "MongoDB driver, auth, passport for Laravel",
"license": "MIT",
"authors": [
{
"name": "Markus Tripp",
"email": "markus@mext.at"
}
],
"require": {
"mongodb/mongodb": "^1.1"
},
"autoload": {
"psr-4": {
"Markustripp\\Mongo\\": "src/"
}
},
"extra": {
"laravel": {
"providers": [
"Markustripp\\Mongo\\MongoServiceProvider"
],
"aliases": {
"Mongo": "Markustripp\\Mongo\\MongoFacade"
}
}
}
}
包的实现
参阅 Github 中关于包的实现。
以上是 Atom 编辑器中包的实现代码
创建一个使用包的应用
创建一个新的 Laravel5.5 应用程序:
composer create-project laravel/laravel mongo-app dev-develop
cd mongo-app
如果你使用 Valet ,请在浏览器中打开 mongo-app.dev/,并确保应用已经安装成功。
用你最喜欢的编辑器打开 mongo-app/composer.json
,并将该包路径添加到 repositories
,如下所示:
"repositories": [
{
"type": "path",
"url": "../mongo",
"options": {
"symlink": true
}
}
],
"require": {
"php": ">=7.0.0",
"fideloper/proxy": "~3.3",
"laravel/framework": "5.5.*",
"laravel/tinker": "~1.0",
"markustripp/mongo": "dev-master"
},
最后执行 composer update.
composer update
在控制台的输出中,你可以看到 composer 已经安装了 mongodb/mongodb 的依赖项,并在 ../mongo 中添加了符号链接。
Package operations: 2 installs, 0 updates, 0 removals
- Installing mongodb/mongodb (1.1.2): Loading from cache
- Installing markustripp/mongo (dev-master): Symlinking from ../mongo
Writing lock file
现在你已经准备好使用 Mongo facade 了。为了测试,只需修改 routes/web.php:
<?php
Route::get('mongo', function(Request $request) {
$collection = Mongo::get()->mydatabase->mycollection;
return $collection->find()->toArray();
});
Route::get('/', function () {
return view('welcome');
});
如果你将文档添加到 mydatabase 的 mycollection 中,则可以通过 http://mongo-app.dev/mongo 在浏览器中访问文档。
现在程序已经完成了,你可以开始在 Laravel 或者其他项目中使用你的包了。
最后想说的
我在最近的项目中使用了Laravel passport 认证授权,应用中使用了2种数据库 (MySQL 和 MongoDB). 不是很完美,但是也可以了,毕竟时间有限。
后来我看了一篇关于包自动发现的文章。我想在自己的包里试试,我计划先简单支持MongoDB (版本 1.0.x), 还有认证 (版本 1.1.x) 最后实现授权,看看我的计划能不能实现。
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
高产似...
虽然我不需要开发扩展包,但是我是来学下怎么向扩展包那样加载各种东西的,,,想试下模块化,,