PHPackages                             eljump/moysklad - 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. [API Development](/categories/api)
4. /
5. eljump/moysklad

ActiveLibrary[API Development](/categories/api)

eljump/moysklad
===============

v0.2(2y ago)016MITPHPPHP &gt;=7.2

Since Dec 4Pushed 2y agoCompare

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

READMEChangelogDependencies (1)Versions (6)Used By (0)

Moysklad PHP
------------

[](#moysklad-php)

[![SensioLabsInsight](https://camo.githubusercontent.com/964effbc746a112aad22acbe7f0e4ce79d3899abbeea571ee51094b58cddb7fd/68747470733a2f2f696e73696768742e73656e73696f6c6162732e636f6d2f70726f6a656374732f35356563383666392d643532372d346262372d386534652d6364633330323639373238622f736d616c6c2e706e67)](https://insight.sensiolabs.com/projects/55ec86f9-d527-4bb7-8e4e-cdc30269728b)

Библиотека для сервиса "Мой склад" JSON API 1.1. Некоторые примеры можно найти в "tests". Все ещё далека от завершения.

**В данном форке изменен базовый поддомен по умолчанию (с 'online' на 'api'), а так же есть изменения в маршрутах (с '1.1' на '1.2'). Возможны ошибки**

Установка

----------

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

```
composer require eljump/moysklad

```

**Запуск тестов:**
1\) composer global require phpunit/phpunit
2\) cd tests
3\) composer update
4\) Отредактировать Config.php
5\) phpunit --configuration="./phpunit.xml" &lt;ИЛИ&gt; npm run test

Класс MoySklad
--------------

[](#класс-moysklad)

Используется для авторизации, явно передается параметром в большинство компонентов т.к. возможно использование нескольких аккаунтов моегосклада одновременно.

`$sklad = MoySklad::getInstance($login, $password);`

Сущности
--------

[](#сущности)

**Основной объект библиотеки**

```
$product = new Product($sklad, [
    "name" => "Банан"
]);

```

**Можно, например, сделать так**

```
$product = new Product($sklad, [
    "id" => "12345-654321-123456-54321",
    "name" => "Банан"
]);
$product->fresh(Expand::create(['country']));

```

**Или так**

`$product->transformToClass(Counterparty::class);`

**Или не сделать. Большая часть логики делегирована другим классам.**

Получение сущностей
-------------------

[](#получение-сущностей)

**Получение всех сущностей:**

`$list = Product::query($sklad)->getList();`

**Можно добавить параметры запроса. Описание параметров в описании класса QuerySpecs.**

```
$list = Product::query($sklad, QuerySpecs::create([
    "offset" => 15,
    "maxResults" => 50,
]))->getList();

```

**Фильтрация. Описание методов FilterQuery в комментариях.**

```
$filteredList = Product::query($sklad)->filter(
    (new FilterQuery())
        ->eq("article", 12345)
);

```

**Поиск по строке. К Query-объекту можно прицепить expand для получения связей с указанными названиями**

`$searchedList = Product::query($sklad)->withExpand(Expand::create(['owner']))->search("трусы");`

**Функции выше возвращают объект EntityList.**

**Получение по id.**

`$product = Product::query($sklad)->byId("12345-654321-123456-54321");`

Создание, обновление
--------------------

[](#создание-обновление)

```
$counterparty = (new Counterparty($sklad, [
    "name" => "Васян"
]))->create();

```

**Некоторым сущностям нужно указать связи при создании. Например для customerorder нужно указание counterparty и organization, и опционально массив позиций**

```
$order = (new CustomerOrder($this->sklad))->buildCreation()
    ->addCounterparty($counterparty)
    ->addOrganization($organization)
    ->addPositionList($positions)
    ->execute();

```

**Для обновления то-же самое**

`$product->buildUpdate()->addCountry($country)->execute();`

Удаление
--------

[](#удаление)

`$product->delete()`;

Связи
-----

[](#связи)

**Чаще всего сущность полученная через api имеет какие-то связи**

`$product->relations;`

**Зная что, к примеру, у продукта есть связанный employee, но не зная название этого поля можно получить его так**

`$employee = $product->relations->find(Employee::class)`

**Так как связи обычно приходят в формате meta-объекта для получения полного объекта можно сделать так**

`$group = $product->relations->group->fresh()`

**А если связь - массив объектов типо такого, то на нем можно сделать операции описанные в разделе "Получение сущностей"**

`$products = $order->relationListQuery("positions")->getList()`

Список сущностей
----------------

[](#список-сущностей)

**EntityList - обертка для массива для работы с апи**

**Например получение assortment и превращение элементов в нужный тип**

`$differentProductsAndStuff = Assortment::query($sklad)->getList()->transformItemsToMetaClass();`

**Или массовое создание сущностей**

```
$neko = new Product($sklad, ["name" => "Кот"]);
$doge = new Product($sklad, ["name" => "Пёс"]);
$el = new EntityList($sklad, [$neko, $doge])->each(function($e) use($vasyan){
    $e->buildCreation()->addEmployee($vasyan);
})->massCreate();

```

**Можно превратить в массив**

`$el->toArray()`;

Работа с картинками
-------------------

[](#работа-с-картинками)

**Прицепление изображений к сущности**

```
$product->attachImage(ImageField::createFromUrl(
    "http://url.ru/img.jpg"
));

```

или

```
$product->attachImage(ImageField::createFromPath(
    "images/123.jpg",
    "renamed_image.jpg"
));

```

**Скачивание изображения**

```
$product->image->download('/usr/images/cat.jpg', 'normal');
/* normal, miniature, tiny - размеры изображений */

```

Specs
-----

[](#specs)

**Классы для конфигурации различных действий**

```
    ::create(["field"=>"value"]);

```

В метод create передаются поля конфигурации

**LinkingSpecs** используется для описания связывания сущности и других сущностей учавствующих в обновлении/создании первой

Имеет следующие поля:

**name** - имя, которое получит новая связь. Если не указано - будет использоваться имя сущности в моемскладе

**multiple** - связь будет массивом сущностей, то есть можно указать несколько связей с одинаковым именем

**fields** - взять только указанные поля для создания связи

**excludedFields** - взять все поля, кроме указанных

Пример добавления доп. поля к контрагенту

```
$specs = LinkingSpecs::create([
                 "name" => "attributes", //в апи доп поля хранятся в поле attributes
                 "multiple" => true //и являются массивом
             ]);
$counterparty = $counterparty->buildUpdate()
    ->addAttribute($attribute, $specs)
    ->addAttribute($attribute2, $specs)
    ->execute();

```

**QuerySpecs** конфигурация EntityQuery и RelationQuery объектов

Поля:

**limit** - количество результатов в одном отправляемом запросе (100 по умолчанию)

**offset** - сдвиг результатов

**maxResults** - максимальное возвращаемое количество результатов

**expand** - возможность получить результат с указанными связями (Expand объект)

**updatedFrom** - объекты, момент обновления которых меньше или равен значению, указанному в параметре (CommonDate объект)

**updatedTo** - объекты, момент обновления которых меньше или равен значению, указанному в параметре (CommonDate объект)

**updatedBy** - В выборку попадут все объекты, автором последних изменений которых является пользователь с uid, указанным в значении параметра.

```
Product::query($sklad, QuerySpecs::create([
            'maxResults' => 25,
            'expand' => Expand::create([Employee::$entityName]),
            'updatedFrom' => new CommonDate("2017-01-01"),
            'updatedBy' => "admin@admin"
        ]))->getList();

```

Публикации
----------

[](#публикации)

**Документные сущности поддерживают публикации**

**Получение**

```
$publications = $customerOrder->getPublications(QuerySpecs::create())

```

**Создание**

```
$publication = $customerOrder->createPublication($customTemplate)

```

**Удаление**

```
$customerOrder->deletePublication($publication)

```

**Получение публикации по id**

```
$publication = $customerOrder->getPublicationById("123-456")

```

Печать документов
-----------------

[](#печать-документов)

**Документные сущности поддерживают печать**

**Создание**

При создании запроса на печать можно передать либо AbstractTemplate либо EntityList&lt;AbstractTemplate&gt;

```
$export = $demand->createExport($templateEntity, 'xls');
$exports = $demand->createExport($templateList);

```

**Получение стандартных шаблонов**

```
$templates = $demand->getExportEmbeddedTemplates();

```

**Получение пользовательских шаблонов**

```
$templates = $demand->getExportCustomTemplates();

```

**Получение стандартного шаблона по id**

```
$templates = $demand->getExportEmbeddedTemplateById(123);

```

**Получение пользовательского шаблона по id**

```
$templates = $demand->getExportCustomTemplateById(123);

```

Отчеты
------

[](#отчеты)

**Содержат статические методы для получения отчетов.**

```
$report = DashboardReport::day($sklad);

```

**Некоторым можно указать особые поисковые запросы типо CounterpartyReportQuerySpecs**

```
$report = SalesReport::byEmployee($sklad, SalesReportQuerySpecs::create([
    "counterparty.id" => $cpId
]));

```

Аудит
-----

[](#аудит)

**История событий системы**

**Получить последние 5 контекстов по заказам покупателей**

```
$audits = Audit::query($this->sklad, QuerySpecs::create([
                  'maxResults' => 5
              ]))->filter((new FilterQuery())
                             ->eq("entityType", "customerorder")
                          );

```

**Получить события по контексту**

```
$events = $audit->getAuditEvents();

```

**Получить события по сущности**

```
$events = $customerOrder->getAuditEvents();

```

**Получить список фильтров**

```
$filters = Audit::getFilters($this->sklad);

```

Отладка
-------

[](#отладка)

Статический класс **RequestLog** содержит ограниченную историю запросов/ответов в апи.

Можно получить последний запрос/ответ

```
RequestLog::getLast()

```

Или все

```
RequestLog::getList()

```

По умолчанию для ограничения потребления памяти хранится 50 последних запросов, по достижению лимита старые запросы удаляются. Изменить лимит можно так:

```
RequestLog::setStorageSize(500); // 500 запросов
RequestLog::setStorageSize(0); //Без лимита

```

Для остановки логирования можно вызвать

```
RequestLog::setEnabled(false);

```

Другие библиотеки
-----------------

[](#другие-библиотеки)

- Ruby
- JavaScript/nodejs

###  Health Score

19

—

LowBetter than 10% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity6

Limited adoption so far

Community16

Small or concentrated contributor base

Maturity31

Early-stage or recently created project

 Bus Factor1

Top contributor holds 74.5% 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 ~0 days

Total

5

Last Release

888d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/e3113662b9ba0d4b991634d6c74b704e98629ed82cc9d307b83cf2783ace20fd?d=identicon)[eljump](/maintainers/eljump)

---

Top Contributors

[![tooyz](https://avatars.githubusercontent.com/u/11355698?v=4)](https://github.com/tooyz "tooyz (123 commits)")[![matiosfree](https://avatars.githubusercontent.com/u/3754984?v=4)](https://github.com/matiosfree "matiosfree (13 commits)")[![eljump](https://avatars.githubusercontent.com/u/45133615?v=4)](https://github.com/eljump "eljump (6 commits)")[![valeriu-dev](https://avatars.githubusercontent.com/u/14403446?v=4)](https://github.com/valeriu-dev "valeriu-dev (5 commits)")[![max-kut](https://avatars.githubusercontent.com/u/12911259?v=4)](https://github.com/max-kut "max-kut (3 commits)")[![artzavod](https://avatars.githubusercontent.com/u/42677958?v=4)](https://github.com/artzavod "artzavod (3 commits)")[![made-22](https://avatars.githubusercontent.com/u/13472763?v=4)](https://github.com/made-22 "made-22 (2 commits)")[![exhang](https://avatars.githubusercontent.com/u/3288418?v=4)](https://github.com/exhang "exhang (2 commits)")[![schursin](https://avatars.githubusercontent.com/u/980845?v=4)](https://github.com/schursin "schursin (1 commits)")[![Shusev](https://avatars.githubusercontent.com/u/14294305?v=4)](https://github.com/Shusev "Shusev (1 commits)")[![ufee](https://avatars.githubusercontent.com/u/28390028?v=4)](https://github.com/ufee "ufee (1 commits)")[![dimaxz](https://avatars.githubusercontent.com/u/6066604?v=4)](https://github.com/dimaxz "dimaxz (1 commits)")[![AnikanovD](https://avatars.githubusercontent.com/u/8023434?v=4)](https://github.com/AnikanovD "AnikanovD (1 commits)")[![Konata69](https://avatars.githubusercontent.com/u/9109997?v=4)](https://github.com/Konata69 "Konata69 (1 commits)")[![breakboyandre](https://avatars.githubusercontent.com/u/13194235?v=4)](https://github.com/breakboyandre "breakboyandre (1 commits)")[![rik43](https://avatars.githubusercontent.com/u/1737715?v=4)](https://github.com/rik43 "rik43 (1 commits)")

### Embed Badge

![Health badge](/badges/eljump-moysklad/health.svg)

```
[![Health](https://phpackages.com/badges/eljump-moysklad/health.svg)](https://phpackages.com/packages/eljump-moysklad)
```

###  Alternatives

[tencentcloud/tencentcloud-sdk-php

TencentCloudApi php sdk

3731.2M42](/packages/tencentcloud-tencentcloud-sdk-php)[convertkit/convertkitapi

Kit PHP SDK for the Kit API

2167.1k1](/packages/convertkit-convertkitapi)[mapado/rest-client-sdk

Rest Client SDK for hydra API

1125.9k2](/packages/mapado-rest-client-sdk)

PHPackages © 2026

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