PHPackages                             tooyz/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. tooyz/moysklad

ActiveLibrary[API Development](/categories/api)

tooyz/moysklad
==============

Get it here: https://github.com/Tooyz/moysklad

0.7.5(10mo ago)6617.1k↑20%56[22 issues](https://github.com/Tooyz/MoySklad/issues)1MITPHPPHP &gt;=7.2CI failing

Since Jan 31Pushed 10mo ago6 watchersCompare

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

READMEChangelog (10)Dependencies (1)Versions (57)Used By (1)

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". Все ещё далека от завершения.

Установка

----------

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

```
composer require tooyz/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

47

—

FairBetter than 94% of packages

Maintenance47

Moderate activity, may be stable

Popularity42

Moderate usage in the ecosystem

Community29

Small or concentrated contributor base

Maturity62

Established project with proven stability

 Bus Factor1

Top contributor holds 76.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 ~55 days

Recently: every ~170 days

Total

56

Last Release

317d ago

PHP version history (3 changes)0.2PHP &gt;=5.6.0

0.5.0PHP &gt;=7.0

0.6.0PHP &gt;=7.2

### Community

Maintainers

![](https://www.gravatar.com/avatar/8a3a8bddd11d5ee9970d28d3b0294e49f04cbb154cb70eac11581953615ab5b2?d=identicon)[Tooyz](/maintainers/Tooyz)

---

Top Contributors

[![tooyz](https://avatars.githubusercontent.com/u/11355698?v=4)](https://github.com/tooyz "tooyz (127 commits)")[![matiosfree](https://avatars.githubusercontent.com/u/3754984?v=4)](https://github.com/matiosfree "matiosfree (13 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)")[![L00nik](https://avatars.githubusercontent.com/u/117724270?v=4)](https://github.com/L00nik "L00nik (1 commits)")[![lexsmil](https://avatars.githubusercontent.com/u/12720495?v=4)](https://github.com/lexsmil "lexsmil (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)")[![ExsyDev](https://avatars.githubusercontent.com/u/8739197?v=4)](https://github.com/ExsyDev "ExsyDev (1 commits)")[![rik43](https://avatars.githubusercontent.com/u/1737715?v=4)](https://github.com/rik43 "rik43 (1 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)")[![dimaxz](https://avatars.githubusercontent.com/u/6066604?v=4)](https://github.com/dimaxz "dimaxz (1 commits)")[![ufee](https://avatars.githubusercontent.com/u/28390028?v=4)](https://github.com/ufee "ufee (1 commits)")[![breakboyandre](https://avatars.githubusercontent.com/u/13194235?v=4)](https://github.com/breakboyandre "breakboyandre (1 commits)")

---

Tags

apijsonmoyskladphp

### Embed Badge

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

```
[![Health](https://phpackages.com/badges/tooyz-moysklad/health.svg)](https://phpackages.com/packages/tooyz-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)
