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

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

最后想说的

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

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


Practice makes perfect.

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

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

本帖已被设为精华帖!
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 2

高产似...

10个月前
largezhou

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

10个月前

  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!