mtymek / mini-url
基于PSR-7和中间件的短网址库
Requires
- ircmaxell/random-lib: ~1.1
Requires (Dev)
- ext-pdo: *
- ext-sqlite3: *
- phpunit/dbunit: ~1.4
- phpunit/phpunit: ~4.6
- zendframework/zend-diactoros: ~1.0
Suggests
- zendframework/zend-diactoros: PSR-7 implementation required for bundled middleware
This package is auto-updated.
Last update: 2024-09-05 04:41:26 UTC
README
使用PHP编写的简单URL缩短器,使用PSR-7和中间件。
它可以作为一个免费的开源替代品,用于实现bit.ly的核心功能:创建短链接和重定向用户。
安装
使用composer安装此库
composer require mtymek/mini-url
用法
根据您的需求,使用MiniUrl有多种方式。您可以将其集成到您的应用程序中,并将其作为业务逻辑的一部分使用,或者您可以使用提供的中间件创建一个直接向用户公开链接缩短功能的网站。
在开始之前,您需要创建一个新的ShortUrlService
实例,传递用于生成链接的基础URL(您的短域名)以及负责存储短URL的仓库
$pdo = new PDO("sqlite:links.db"); $service = new ShortUrlService('http://sho.rt', new PdoRepository($pdo));
短URL服务
ShortUrlService
是MiniUrl的基础 - 当您需要在应用程序逻辑中缩短URL时,您想要使用它。
缩短链接
$url = $service->shorten('http://github.com/zendframework/zend-diactoros'); echo $url->getShortUrl(); // example output: http://sho.rt/Wwr3bMu
展开
$url = $service->expand('http://sho.rt/ho3nf1'); header('Location: ' . $url->getLongUrl());
中间件
通常,URL缩短器应公开两种功能:生成短链接和将用户重定向到完整URL。MiniUrl附带方便的中间件,使其非常容易使用。基于PSR-7标准,它们可以轻松地包装在其他处理身份验证或路由的中间件中。
RedirectMiddleware
当用户在浏览器中打开短链接时,他应该被重定向到目标URL。这可以通过使用RedirectMiddleware
轻松完成。它接受传入的请求,从URI中提取path
部分(忽略域名和查询),找到匹配的长URL,并最终重定向用户。如果链接在仓库中找不到,则返回404代码的响应。
示例用法
$redirector = new RedirectMiddleware($service); $server = Zend\Diactoros\Server::createServer( $redirector, $_SERVER, $_GET, $_POST, $_COOKIE, $_FILES ); $server->listen();
ShortenApiMiddleware
ShortenApiMiddleware
提供了缩短链接API的实现。
示例用法
$shortenApi = new ShortenApiMiddleware($service); $server = Zend\Diactoros\Server::createServer( $shortenApi, $_SERVER, $_GET, $_POST, $_COOKIE, $_FILES ); $server->listen();
您可以使用PHP内置的HTTP服务器来测试它
$ cd path-to-api
$ php -S localhost:8080 shorten-api.php
使用CURL创建短链接
$ curl --data "longUrl=http://mateusztymek.pl/lorem-ipsum-dolor/" http://localhost:8080
http://sho.rt/bloq3y
通常,您将希望将ShortenApi
包装在另一个中间件中,以授权您的用户。
ExpandApiMiddleware
ExpandApiMiddleware
提供了扩展短链接API的实现。
示例用法
$expandApi = new ExpandApiMiddleware($service); $server = Zend\Diactoros\Server::createServer( $expandApi, $_SERVER, $_GET, $_POST, $_COOKIE, $_FILES ); $server->listen();
您可以使用PHP内置的HTTP服务器来测试它
$ cd path-to-api
$ php -S localhost:9090 expand-api.php
扩展短链接
$ curl --data "shortUrl=http://sho.rt/bloq3y" http://localhost:9090
http://mateusztymek.pl/lorem-ipsum-dolor
请参阅examples
目录中的示例代码。
仓库
MiniUrl可以通过使用RepositoryInterface
集成到现有应用程序中,该接口处理存储和检索ShortUrl
对象。
interface RepositoryInterface { public function findByLongUrl($longUrl); public function findByShortUrl($shortUrl); public function save(ShortUrl $shortUrl); }
PdoRepository
PdoRepository
是一个通用的仓库,允许您使用任何数据库(查询非常简单...)。为了使用它,您必须将PDO
数据库句柄传递给仓库构造函数。
$pdo = new PDO("sqlite:links.db"); $service = new ShortUrlService('http://mini.me', new PdoRepository($pdo)); $short = $service->shorten('http://google.com'); echo $short->getShortUrl();
仓库将假设它可以访问具有以下结构的short_urls
表
CREATE TABLE short_urls ( long_url VARCHAR(256) PRIMARY KEY NOT NULL, short_url VARCHAR(256) NOT NULL, creation_date INT NOT NULL ); CREATE INDEX short_url_idx ON short_urls(short_url);
您可以使用模式文件创建一个空的SQLite数据库
$ sqlite3 links.db < path/to/miniurl/schema/db-sqlite.sql