打包/分发

Stack PHP 的资产管理中间件


README

Latest Stable Version Total Downloads

PHP 的资源管理

基本安装

以下内容应包含在您的 public/index.php 文件中

$dispatchConfig = new \Packaged\Config\Provider\ConfigSection('dispatch');
$dispatchConfig->addItem('run_on', 'path');
$dispatchConfig->addItem('run_match', 'assets');
$dispatchConfig->addItem('aliases', ['ali' => 'src/res']);
$dispatchConfig->addItem('css_config', ['minify' => 'false']);
$dispatchConfig->addItem('ext_config', [/*Config Options*/]);

$dispatcher = new \Packaged\Dispatch\Dispatch($app, $dispatchConfig);
$dispatcher->setBaseDirectory(dirname(__DIR__));

//By md5 hashing the files based on the project root, runtime hashes are
//not required, and will perform much faster
$dispatcher->setFileHashTable(
  [
    'src/res/css/base.css' => 'd5364e0d4c0174e4a30cea9a03af036d',
    'assets/003.JPG'       => '8c0d1206f71976e45cd138ed30645519'
  ]
);

然后您可以通过以下任一方式将其添加到请求中

Stack PHP 方法

$app = (new \Stack\Builder())
  ->push([$dispatcher, 'prepare'])
  ->resolve($app);

原始调用

$app = $dispatch->handle($request)

使用 Dispatch

您可以使用几种类型的资产管理器来生成静态资源 URI。资产管理器定义了一个路由路径,在搜索指定的资源时,处理应该从该路径开始。

配置选项

run_on / run_match

这些选项确定如何生成资产路径。

资产类型

$am = \Packaged\Dispatch\AssetManager::assetType();

默认情况下,此类型将在 /assets 中搜索,假设您希望将资产存储在该项目的根目录中的该文件夹内。如果您想更改默认的资产路径,可以使用 'assets_dir' 配置项,相对于项目基础目录。

别名类型

$am = \Packaged\Dispatch\AssetManager::aliasType('alias');

别名类型用于常见路径,您可能希望将资产分组,这些资产可能是源或供应商目录中的深路径。别名可以在配置中作为 'aliases' 配置项中的键值数组进行配置。

源类型

$am = \Packaged\Dispatch\AssetManager::sourceType();

源类型将从源文件夹加载数据。默认情况下这是 'src',但如果您将源文件存储在其他目录中,可以使用 'source_dir' 配置项进行更改。

供应商类型

$am = \Packaged\Dispatch\AssetManager::vendorType('vendor','package');

供应商类型将基础设置为 composer 指定的供应商文件夹,这通常是 /vendor/{vendor}/{package}

自动检测

$am = new \Packaged\Dispatch\AssetManager(new Class());

通过将一个类传递给资产管理器的构造函数,dispatch 将自动检测该类是否位于您的源目录中或由供应商包创建。这将为您提供供应商类型或源类型。

生成资源 URI

现在您有了资产管理器对象,您可以在项目中生成资源 URI。您只需要将相对路径(从资产管理器基础目录开始)传递给 'getResourceUri' 方法,即可返回一个完整的 URI。

<!--[if lt IE 9]>
<script src="<?= $am->getResourceUri('javascripts/ie.js'); ?>"></script>
<![endif]-->

CSS & JS 全局存储

为了代码的简洁性,您还可以将 CSS 和 JS 文件添加到存储以进行渲染,可以在需要时检索。这允许您根据子类、控制器、视图等包含相关的 CSS 或 JS 文件,在全局布局中,只需包含已构建的任何文件即可。

要包含您的 CSS 文件,只需在 assetManager 上调用 requireCss 即可

$am->requireCss(
  [
    'stylesheets/bootstrap',
    'stylesheets/theme',
    'stylesheets/widgets',
  ]
);

您还可以带有选项(如延迟 JS 或打印)的 CSS 文件

$am->requireCss('stylesheets/print',['media' => 'print']);

然后渲染 URL 到页面上,您有两个选项。

选项 1. 让 dispatch 为您完成所有操作

<?= $am->generateHtmlIncludes('css'); ?>

选项 2. 获取自己的 URI 和它们的选项,然后渲染它们

$uris = AssetManager::getUrisByType('css');
//Options is a key value array or options sent through by requireCss
foreach($uris as $uri => $options)
{
  echo '<link href="'. $uri .'" rel="stylesheet" type="text/css">';
}

相同的功能也适用于 JavaScript,只需在方法名称和参数中将 CSS 替换为 JS 即可。

我们建议在您的代码中使用 AssetManager::TYPE_CSS 和 AssetManager::TYPE_JS,然而,为了更简洁的示例,字符串版本也是有效的。

自定义资产类型

如果需要将特定 MIME 类型或必须渲染或编译后才能分发的资产进行分发,则使用自定义资产。只需创建一个实现 IAsset(您可以扩展 AbstractAsset)的类,并将其与 AssetResponse 注册即可。

以下示例将使所有具有扩展名'ext'的请求文件以'application/x-my-asset'内容类型提供服务,并返回文件内容的MD5散列值。

class MyAsset extends AbstractAsset
{
  public function getExtension()
  {
    return 'ext';
  }

  public function getContentType()
  {
    return "application/x-my-asset";
  }
  
  public function getContent()
  {
    return md5(parent::getContent());
  }
}

AssetResponse::addAssetType('ext', '\MyAsset');