一步步带你开发 Laravel 5.5 扩展包(实战教程)

file

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

file

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 中关于包的实现。

file

以上是 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 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://medium.com/@markustripp/laravel-...

译文地址:https://learnku.com/laravel/t/7791/step-...

本帖已被设为精华帖!
本文为协同翻译文章,如您发现瑕疵请点击「改进」按钮提交优化建议
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 2

高产似...

6年前 评论

虽然我不需要开发扩展包,但是我是来学下怎么向扩展包那样加载各种东西的,,,想试下模块化,,

6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!