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

翻译 Summer ⋅ 于 4个月前 ⋅ 最后回复由 largezhou 1周前 ⋅ 2836 阅读 ⋅ 原文地址
这是一篇社区协同翻译的文章,已完成翻译,更多信息请点击 协同翻译介绍

file

我们一般会以扩展包(packages)的形式给Laravel添加新的功能。在这篇文章里,我根据之前的教程 在Laravel5.4中使用MongoDB入门 创建了一个 MongoDB Composer 拓展包 . 并在其中使用了 Laravel5.5扩展包自动发现  这一新特性。


首先让我们看看在提交给Packagist后,如何在一个新的Laravel项目中使用我们提交的Composer扩展包

Kurisu 翻译于 4个月前

查看其他 1 个版本

已发布的扩展包的使用教程

如果没有安装 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 ,那么 http://myproject.dev/mongo 仅返回你添加的 json 文档。

现在知道怎么使用扩展包了吧,让我们从头开始创建这个包。

轻色年华 翻译于 4个月前

查看其他 1 个版本

创建新包

一个包通常由两部分组成:包项目和测试项目. 我个人的建议是将两个项目独立开,当然对于团队共同开发的包,则需要在包项目相同的目录下创建一个公共的目录

例如:单一的目录结构

./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
mojiajuzi 翻译于 4个月前

创建 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"
            }
        }
    }
}
Flyertutor 翻译于 4个月前

包的实现

参阅 Github 中关于包的实现。

file

以上是 Atom 编辑器中包的实现代码

创建一个使用包的应用

创建一个新的 Laravel5.5 应用程序:

composer create-project laravel/laravel mongo-app dev-develop
cd mongo-app

如果你使用 Valet ,请在浏览器中打开 http://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 或者其他项目中使用你的包了。

Kevinvinvin 翻译于 4个月前

最后想说的

我在最近的项目中使用了Laravel passport 认证授权,应用中使用了2种数据库 (MySQL 和 MongoDB). 不是很完美,但是也可以了,毕竟时间有限。

后来我看了一篇关于包自动发现的文章。我想在自己的包里试试,我计划先简单支持MongoDB (版本 1.0.x), 还有认证 (版本 1.1.x) 最后实现授权,看看我的计划能不能实现。

gaohuag 翻译于 4个月前

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

译文地址:https://laravel-china.org/topics/7791/st...


本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

本帖已被设为精华帖!
回复数量: 2
  • matzoh
    4个月前

    高产似...

  • largezhou
    4个月前

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

暂无评论~~
您需要登陆以后才能留下评论!

Composer 中国全量镜像

Top 100 扩展包

Lumen 中文文档

Laravel 速查表

Laravel 中文文档

Laravel 项目开发规范

Laravel 开发环境部署

社区文档撰写指南

TDD 构建 Laravel 论坛笔记

PHP PSR 标准规范

PHP 设计模式全集

Dingo API 中文文档