hkt / psr7-asset
通过 PSR-7 管理资源
Requires
- php: ^5.6 || ^7.0
- psr/http-factory: ^1.0
- psr/http-message: ^1.0
- psr/http-server-middleware: ^1.0
Requires (Dev)
- aura/di: ^3.0
- http-interop/http-factory-diactoros: ^1.0
- phpunit/phpunit: ^6.0
Suggests
- http-interop/http-factory-diactoros: Use zend framework zend-diactoros as the psr7 implementaion
- http-interop/http-factory-guzzle: Use guzzlehttp as the psr7 implementaion
README
PHP 资源管理。此包是基于 Aura.Asset_Bundle 分支的。
前言
要求
安装
composer require hkt/psr7-asset http-interop/http-factory-diactoros
您可以使用任何 psr-17 库。
测试
composer install vendor/bin/phpunit
或者您也可以使用;
composer install composer check
PSR 合规性
此包试图遵守 PSR-1、PSR-2、PSR-4、PSR-7、PSR-15 和 PSR-17。如果您注意到任何合规性问题,请通过拉取请求发送补丁。
包结构
假设您有一个 Vendor.Package
。您的资源可以位于任何地方。假设它在 public
文件夹中。文件夹名称 css
、images
、js
可以根据您的喜好命名。
├── 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'); } }