hkt/psr7-asset

通过 PSR-7 管理资源

0.5.0 2018-08-08 06:05 UTC

This package is auto-updated.

Last update: 2024-09-07 19:56:06 UTC


README

PHP 资源管理。此包是基于 Aura.Asset_Bundle 分支的。

前言

要求

安装

composer require hkt/psr7-asset http-interop/http-factory-diactoros

您可以使用任何 psr-17 库。

测试

Build Status

composer install
vendor/bin/phpunit

或者您也可以使用;

composer install
composer check

PSR 合规性

此包试图遵守 PSR-1PSR-2PSR-4PSR-7PSR-15PSR-17。如果您注意到任何合规性问题,请通过拉取请求发送补丁。

包结构

假设您有一个 Vendor.Package。您的资源可以位于任何地方。假设它在 public 文件夹中。文件夹名称 cssimagesjs 可以根据您的喜好命名。

├── src
│   ├── Cli
│   └── Web
├── tests
└── public
    ├── css
    │   └── some.css
    ├── images
    │   ├── another.jpg
    │   └── some.png
    └── js
        └── hello.js

假设您有相同的结构,现在在您的模板中,您可以指向 /asset/vendor/package/css/some.css/asset/vendor/package/js/hello.js/asset/vendor/package/images/another.jpg

路由

此库可以与任何框架一起使用。因此,它在内部使用 preg_match。默认的正则表达式是 /\/asset\/([a-zA-Z0-9-_]+)\/([a-zA-Z0-9-_]+)\/(.*)/

您可以在创建 Router 对象时修改正则表达式,该对象作为第三个参数传递给 AssetAction

<?php
$locator   = new Hkt\Psr7Asset\AssetLocator();
$service   = new Hkt\Psr7Asset\AssetService($locator);
$responder = new Hkt\Psr7Asset\AssetResponder(new Http\Factory\Diactoros\ResponseFactory());
$router    = new Hkt\Psr7Asset\Router();
$assetAction = new Hkt\Psr7Asset\AssetAction($service, $responder, $router);

// ... more code
$assetAction->process($request, $requestHandler)

Zend Expressive

如果您正在使用 `zend expressive`,您可以配置:

AuraRouter

<?php
$route = new \Zend\Expressive\Router\Route('/asset/{vendor}/{package}/{file}', 'Hkt\Psr7Asset\AssetAction', ['GET'], 'hkt/psr7-asset:route');
$route->setOptions([
    'tokens' => [
        'file' => '(.*)'
    ]
]);
$router->addRoute($route);

FastRoute

<?php
$router->addRoute(new \Zend\Expressive\Router\Route('/asset/{vendor}/{package}/{file:.*}', 'Hkt\Psr7Asset\AssetAction', ['GET'], 'hkt/psr7-asset:route'));

注意:请确保您已将服务 Hkt\Psr7Asset\AssetAction 设置到 Di 容器中。

从您的视图,您可以使用:

<?php
$this->url('hkt/psr7-asset:route', [
    'vendor' => 'vendor',
    'package' => 'package',
    'file' => '/css/bootstrap.min.css'
]);

这将返回 /asset/vendor/package/css/bootstrap.min.css

映射

通过映射 vendor/package 或直接路径,您可以更改它返回的结果。

例如

$locator->set('vendor/package', '/full/path/to/vendor/package');

覆盖 css、js、图像

类似于 puli,您可以为下载的包覆盖样式表、图像、js 等。您只需要映射它。内部没有任何魔法。

例如

$locator->set('vendor/package', '/full/path/to/vendor/package');
$locator->set('vendor/package/css/style.css', '/full/path/to/vendor/package/public/css/style.css');
// override vendor/package style sheet, same applies for js and images
$locator->set('vendor/package/css/style.css', '/full/path/to/application/specific/public/css/style.css');

缓存

资源文件由 PHP 提供。有一个实验性的仓库 https://github.com/harikt/psr7-asset-cache 可以进行缓存。因此,文件可以由 Web 服务器本身提供。

通过 Aura.Di 进行配置

Hkt\Psr7Asset\Container\AssetConfig 传递给您的 Container Builder。别忘了将服务 Interop\Http\Factory\ResponseFactoryInterface 设置如下。

<?php
namespace Vendor\Package;

use Aura\Di\Container;
use Aura\Di\ContainerConfigInterface;

class AppConfig implements ContainerConfigInterface
{
    public function define(Container $di)
    {
        // add one of the http-interop/http-factory library
        $di->set('Interop\Http\Factory\ResponseFactoryInterface', $di->lazyNew('Http\Factory\Diactoros\ResponseFactory'));
    }

    public function modify(Container $di)
    {
        // Map more paths and location as above.
        $assetLocator = $di->get('Hkt\Psr7Asset\AssetLocator');
        // path to exact location
        $assetLocator->set('vendor/package/css/hello.css', '/path/to/web/css/test.css');
        // path to folder
        $assetLocator->set('vendor/package', dirname(dirname(__DIR__)) . '/public');
    }
}