PHPackages                             enjoys/assets-collector - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. enjoys/assets-collector

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

enjoys/assets-collector
=======================

Assets Collector CSS and JS

3.0.0(1y ago)13.5k↓50%4MITPHPPHP ^8.1CI passing

Since Jan 22Pushed 1y ago1 watchersCompare

[ Source](https://github.com/Enjoyzz/assets-collector)[ Packagist](https://packagist.org/packages/enjoys/assets-collector)[ RSS](/packages/enjoys-assets-collector/feed)WikiDiscussions master Synced 1mo ago

READMEChangelogDependencies (13)Versions (60)Used By (4)

Assets Collector
================

[](#assets-collector)

[![8.1](https://github.com/Enjoyzz/assets-collector/workflows/8.1/badge.svg)](https://github.com/Enjoyzz/assets-collector/workflows/8.1/badge.svg)[![8.2](https://github.com/Enjoyzz/assets-collector/workflows/8.2/badge.svg)](https://github.com/Enjoyzz/assets-collector/workflows/8.2/badge.svg)[![Scrutinizer Code Quality](https://camo.githubusercontent.com/85cdd1e49110baafa8b0a6373141552c9e392fcb93135d7aadf6f6baf131ace7/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f456e6a6f797a7a2f6173736574732d636f6c6c6563746f722f6261646765732f7175616c6974792d73636f72652e706e673f623d6d6173746572)](https://scrutinizer-ci.com/g/Enjoyzz/assets-collector/?branch=master)[![Build Status](https://camo.githubusercontent.com/494336e2e966b60e8fe466195fff75cadb1761ddbb1904dbfa3ec70acea82dfd/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f456e6a6f797a7a2f6173736574732d636f6c6c6563746f722f6261646765732f6275696c642e706e673f623d6d6173746572)](https://scrutinizer-ci.com/g/Enjoyzz/assets-collector/build-status/master)[![Code Coverage](https://camo.githubusercontent.com/f8b834ba23738b2832eccf67f77e3bfb4b7b228b2fb268afb081107ca899b679/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f456e6a6f797a7a2f6173736574732d636f6c6c6563746f722f6261646765732f636f7665726167652e706e673f623d6d6173746572)](https://scrutinizer-ci.com/g/Enjoyzz/assets-collector/?branch=master)

Установка
---------

[](#установка)

```
composer require enjoys/assets-collector

```

Использование
-------------

[](#использование)

**Настройка окружения**

```
use Enjoys\AssetsCollector\Assets;
use Enjoys\AssetsCollector\Environment;

//project directory
$projectDir = __DIR__;
//compile path relative project directory
$assetsDir = $projectDir .'/assets';
//or relative project directory
//$assetsDir = 'assets';

$environment = new Environment($assetsDir, $projectDir);
//Base URL to compile path for Web
$environment->setBaseUrl("/assets-collector/example/assets");
//Set strategy, default \Enjoys\AssetsCollector\Strategy\ManyFilesStrategy
$environment->setStrategy(\Enjoys\AssetsCollector\Strategy\OneFileStrategy::class); //\Enjoys\AssetsCollector\Strategy\ManyFilesStrategy::class
//Cache time for files in strategy STRATEGY_ONE_FILE
$environment->setCacheTime(0); //cache time in seconds
//Adds the output version, for example //example.php/style.css?v=123
$environment->setVersion(123); //int|float|string
//You can change the parameter for the version
$environment->setParamVersion('version');

/**
 * You can add a logger that implements \Psr\Log\LoggerInterface, for example, Monolog
 * @var \Psr\Log\LoggerInterface $logger
 */
$environment->setLogger($logger);
```

[Настройки CSS Minify](#options_cssminify)

[Настройки JS Minify](#options_jsminify)

**Инициализация класса**

```
/** @var \Enjoys\AssetsCollector\Environment $environment */
$assets = new \Enjoys\AssetsCollector\Assets($environment);
```

**Добавление в коллекцию**

*Если третьим параметрам передать $group, то при выводе так же нужно его писать. Своего рода группировка*

```
/** @var \Enjoys\AssetsCollector\Assets $assets */
$assets->add('css', [
    'style/style.css', //относительный путь, относительно текущей рабочей директории
    __DIR__ . '/style/style.css', //полный путь
    '//example.com/style.css', //сокращенная URL ссылка
    'https://example.com/style.css', //URL ссылка
    'url:/assets/css/style.css', // URL ссылка
    'local:/assets/css/style.css', // URL ссылка (local: и url: идентичны)
    ['style.css', \Enjoys\AssetsCollector\AssetOption::MINIFY => false], //попускает минификацию конкретного файла
    ['goods/style.css', \Enjoys\AssetsCollector\AssetOption::REPLACE_RELATIVE_URLS => false], //не заменяет относительные ссылки - оставляет так как есть
]);
```

**Дополнительные параметры**

Можно передать ссылку на ресурс в качестве массива, где 1-й элемент массива — сам путь, а последующие элементы массива — это параметры

```
use Enjoys\AssetsCollector\AssetOption;

/** @var \Enjoys\AssetsCollector\Assets $assets */
$assets->add('css', [
    [
         __DIR__.'/style.css',
         // По-умолчанию все ресурсы минифицируются, если указать явно false, этот ресурс пропустит минификацию
         AssetOption::MINIFY => false,

         // Если нужно создать дополнительные симлинки, то можно указать их в этом параметре, в качества массива,
         // где ключ - сама ссылка, а значение - исходный файл или директория (цель)
         // Это бывает необходимо если в ресурсе есть относительные ссылки, и чтобы был к ним доступ нужно прописать
         // явно все символические ссылки
         AssetOption::SYMLINKS => [
            __DIR__.'/symlink' => __DIR__.'/../../../target',
            //...
        ],

        // При STRATEGY_MANY_FILES будут добавлены html-аттрибуты,
        // примерно это будет выглядеть так
        //
        AssetOption::ATTRIBUTES => [
            'attribute-key' => 'attribute-value',
            'attribute-without-value' => null,
            'attribute-without-value-another-method',
            //...
        ],

        // При STRATEGY_ONE_FILE если будет установлена эта опция в true, то именно этот asset в сборку не попадет,
        // а выведется отдельно
        AssetOption::NOT_COLLECT => true,

        // При false - не заменяет относительные ссылки - оставляет так как есть.
        // По-умолчанию true, все относительные ссылки заменяются на абсолютные
        AssetOption::REPLACE_RELATIVE_URLS => false
    ],
    //...
]);
```

*При сборке assets все собирается по порядку как пришли данные в коллекцию, так было раньше, и так стало сейчас по умолчанию. Но можно выбрать способ вставки assets в коллекцию, изменив последний параметр в `\Enjoys\AssetsCollector\Assets::add` `push` или `unshift`.*

*Это удобно использовать например в шаблонах twig, где например в самом главном шаблоне подключаются общие стили, а потом в дочерних шаблонах подключаются конкретные стили, так вот при push, общие стили будут подключены ниже чем конкретные, при unshift - подключены будут сначала стили общие, потом конкретные, хотя twig все равно их будет обрабатывать в обратном порядке - от дочерних шаблонов до общих*

- `push` - дефолтное значение вставляет данные в конец
- `unshift` - вставляет данные в начало коллекции.

```
/** @var \Enjoys\AssetsCollector\Assets $assets */
$assets->add($type = 'css|js', [], $group, $method = 'push|unshift');
```

**Вывод**

```
/** @var \Enjoys\AssetsCollector\Assets $assets
 */
$assets->get('css'); //get Css with default namespace
$assets->get('js', 'admin_namespace'); //Get Js with namespace `admin_namespace`
```

При *$environment-&gt;setStrategy(\\Enjoys\\AssetsCollector\\Strategy\\OneFileStrategy::class);* происходит чтение всех файлов и запись в один файл. Вернет html строку для подключения стилей или скриптов

```

```

При *$environment-&gt;setStrategy(\\Enjoys\\AssetsCollector\\Strategy\\ManyFilesStrategy::class);* вернет стили или скрипты по отдельности, примерно так, удобно при разработке

```

```

***ДЛЯ JS ВСЕ АНАЛОГИЧНО, ЗА ИСКЛЮЧЕНИЕМ HTML В ВЫВОДЕ***

Twig Extension
--------------

[](#twig-extension)

**Подключение расширения**

```
/**
 * @var \Twig\Environment $twig
 * @var \Enjoys\AssetsCollector\Assets $assets
 */
$twig->addExtension(new \Enjoys\AssetsCollector\Extensions\Twig\AssetsExtension($assets));
```

**Добавление в коллекцию в шаблоне.**

Ниже показаны примеры, как можно подключить ресурсы в шаблоне.

*Стоит обратить внимание, что не полные пути будут относительно текущей рабочей директории, или относительно директории проекта*

```
 {{  asset('css', [{0: 'https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.css', 'minify': false}]) }}
 {{  asset('css', 'https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.css') }}
 {{  asset('js', ['path/script.js', 'script.js'], 'namespace') }}
```

**С версии 2.2.1 поддерживаются пути twig**

Необходимо при инициализации расширения передать загрузчик, который реализует `\Twig\Loader\LoaderInterface`, например `\Twig\Loader\FilesystemLoader`

```
/**
 * @var \Enjoys\AssetsCollector\Extensions\Twig\AssetsExtension $extension
 * @var \Enjoys\AssetsCollector\Assets $assets
 * @var \Twig\Loader\LoaderInterface $loader
 */
$extension = new AssetsExtension($assets, $loader));
```

**Вывод в шаблоне**

```
{{ eCSS() }}
{{ eJS('namespace') }}
```

Настройки Minify
----------------

[](#настройки-minify)

По умолчанию в качестве минификатора CSS и JS ничего не используется, то есть ничего не сжимается. Для настройки минификатора, в Environment используется метод **Environment::setMinifier(AssetsType $type, Minify|\\Closure|null $minifier)**

Проще всего передать в класс анонимную функцию (\\Closure(string): string), но также можно передать объект класса, реализовавший интерфейс *\\Enjoys\\AssetsCollector\\Minify::class* для сложных случаев.

```
/** @var \Enjoys\AssetsCollector\Environment $environment */
use Enjoys\AssetsCollector\AssetType;

// css
$environment->setMinifier(AssetType::CSS, function (string $content): string {
    return (new CSSMin())->run($content);
});

$environment->setMinifier(AssetType::CSS, new class implements \Enjoys\AssetsCollector\Minifier {
    public function minify(string $content): string {
        return (new CSSMin())->run($content);
    }
});
```

Список third-party минификаторов:

- CSS
    - **YUI-CSS-compressor-PHP-port** [tubalmartin/cssmin](https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port)
- JS
    - **JShrink** [tedivm/jshrink](https://github.com/tedious/JShrink)

###  Health Score

43

—

FairBetter than 91% of packages

Maintenance46

Moderate activity, may be stable

Popularity24

Limited adoption so far

Community13

Small or concentrated contributor base

Maturity76

Established project with proven stability

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~27 days

Recently: every ~140 days

Total

58

Last Release

407d ago

Major Versions

0.9.91 → 1.0.02021-02-16

1.x-dev → 2.0.02021-07-30

2.x-dev → 3.0.02025-04-06

PHP version history (3 changes)2.2.2PHP &gt;= 7.4

2.3.0PHP ^7.4 | ^8.0

3.0.0PHP ^8.1

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/25447823?v=4)[enjoys](/maintainers/enjoys)[@enjoys](https://github.com/enjoys)

---

Top Contributors

[![Enjoyzz](https://avatars.githubusercontent.com/u/1448659?v=4)](https://github.com/Enjoyzz "Enjoyzz (265 commits)")

###  Code Quality

TestsPHPUnit

Static AnalysisPsalm

Type Coverage Yes

### Embed Badge

![Health badge](/badges/enjoys-assets-collector/health.svg)

```
[![Health](https://phpackages.com/badges/enjoys-assets-collector/health.svg)](https://phpackages.com/packages/enjoys-assets-collector)
```

###  Alternatives

[cakephp/cakephp

The CakePHP framework

8.8k18.5M1.6k](/packages/cakephp-cakephp)[civicrm/civicrm-core

Open source constituent relationship management for non-profits, NGOs and advocacy organizations.

728272.9k20](/packages/civicrm-civicrm-core)[aedart/athenaeum

Athenaeum is a mono repository; a collection of various PHP packages

245.2k](/packages/aedart-athenaeum)[cognesy/instructor-php

The complete AI toolkit for PHP: unified LLM API, structured outputs, agents, and coding agent control

310107.9k1](/packages/cognesy-instructor-php)[neos/flow

Flow Application Framework

862.0M451](/packages/neos-flow)[shopware/app-php-sdk

Shopware App SDK for PHP

1577.8k1](/packages/shopware-app-php-sdk)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
