webwingscz / skautis-symfony
Symfony bundle pro webové služby skautISu (is.skaut.cz): typovaný SOAP klient, přihlašování a role.
Package info
github.com/webwingscz/skautis-symfony
Type:symfony-bundle
pkg:composer/webwingscz/skautis-symfony
Requires
- php: >=8.2
- ext-soap: *
- psr/log: ^2.0 || ^3.0
- symfony/config: ^6.4 || ^7.0 || ^8.0
- symfony/dependency-injection: ^6.4 || ^7.0 || ^8.0
- symfony/event-dispatcher: ^6.4 || ^7.0 || ^8.0
- symfony/http-foundation: ^6.4 || ^7.0 || ^8.0
- symfony/http-kernel: ^6.4 || ^7.0 || ^8.0
- symfony/routing: ^6.4 || ^7.0 || ^8.0
- symfony/security-bundle: ^6.4 || ^7.0 || ^8.0
- symfony/security-core: ^6.4 || ^7.0 || ^8.0
- symfony/security-http: ^6.4 || ^7.0 || ^8.0
Requires (Dev)
- phpunit/phpunit: ^11.0 || ^12.0 || ^13.0
- symfony/framework-bundle: ^6.4 || ^7.0 || ^8.0
- symfony/yaml: ^6.4 || ^7.0 || ^8.0
Suggests
None
Provides
None
Conflicts
None
Replaces
None
This package is auto-updated.
Last update: 2026-09-22 10:04:20 UTC
README
Symfony bundle pro webové služby skautISu — informačního systému Junáka.
Dává vám typovaný klient nad jejich SOAP API, hotové přihlašování skautISovým účtem a přepínání rolí. A taky režim, ve kterém celá aplikace funguje bez přiděleného AppID, takže se dá vyvíjet dřív, než vám ho správce schválí.
final class TeamController extends AbstractController { #[Route('/oddil')] public function index(PersonApi $people, #[CurrentUser] SkautisUser $user): Response { return $this->render('team.html.twig', [ 'members' => $people->listByUnit($user->getUnitId()), ]); } }
Proč ne skautis/skautis
skautis/skautis je funkční a
běží v produkci — pokud vám vyhovuje jeho tvar, použijte ho. Deklaruje ale
php >=5.6 a celé API jede přes __call, takže statická analýza o něm neví nic
(jejich issue #102). Nemá PSR-3
logování (#70) a integraci má jen
na Nette — skautis/skautis-bundle, na který odkazuje jejich composer.json,
na Packagistu neexistuje.
Tenhle bundle je menší a užší: typované DTO, PSR-3, Symfony DI a security.
Instalace
composer require webwingscz/skautis-symfony
Bez Symfony Flex zaregistrujte bundle ručně v config/bundles.php:
Webwings\SkautisBundle\WebwingsSkautisBundle::class => ['all' => true],
Konfigurace
# config/packages/webwings_skautis.yaml webwings_skautis: base_url: 'https://test-is.skaut.cz' # ostrý provoz: https://is.skaut.cz app_id: '%env(SKAUTIS_APP_ID)%' mock: false # true = odpovídat z fixtures timeout: 30 # timeout SOAP volání v sekundách # fixture_dir: '%kernel.project_dir%/fixtures/skautis' security: login_route: app_login # sem skautIS posílá POST s tokenem success_route: app_dashboard # kam po přihlášení logout_route: app_logout refresh_interval: 600 # jak často nejvýš prodlužovat přihlášení
Přihlašování
skautIS řeší autentizaci sám. Uživatel odejde na {base_url}/Login/?appid=…,
přihlásí se tam a skautIS pošle POST na adresu, kterou jste u AppID
zaregistrovali — pole skautIS_Token, skautIS_IDRole, skautIS_IDUnit
a skautIS_DateLogout.
# config/packages/security.yaml security: providers: skautis: id: Webwings\SkautisBundle\Security\SkautisUserProvider firewalls: main: lazy: true provider: skautis custom_authenticators: - Webwings\SkautisBundle\Security\SkautisAuthenticator entry_point: Webwings\SkautisBundle\Security\SkautisAuthenticator logout: path: app_logout target: app_logged_out
Vaše routy musí odpovídat tomu, co máte zaregistrované ve skautISu:
#[Route('/login', name: 'app_login', methods: ['GET', 'POST'])] // POST bere authenticator #[Route('/logout', name: 'app_logout', methods: ['GET', 'POST'])] // obsluhuje firewall
Odhlášení musí proběhnout i na straně skautISu, jinak se příští návštěva přihlásí
sama — přesměrujte na SkautisConfig::logoutUrl($token), skautIS pak vrátí
uživatele na vaši logout_route.
Token platí 30 minut. Bundle ho na pozadí prodlužuje (LoginUpdateRefresh,
nejvýš jednou za refresh_interval) a když vyprší, pošle uživatele na odhlášení
místo toho, aby spadla pětistovka.
Co je k dispozici
| Služba | K čemu |
|---|---|
Api\UserApi |
detail účtu, seznam rolí, přepnutí role, prodloužení přihlášení |
Api\UnitApi |
detail jednotky, podřízené jednotky |
Api\PersonApi |
členové jednotky, detail osoby, kontakty včetně rodičovských |
Client\SkautisClientInterface |
cokoli dalšího: callAll() / callOne() |
SkautisConfig |
sestavení přihlašovací a odhlašovací URL |
Chyby chodí jako Exception\SkautisAuthenticationException (vypršelý token),
SkautisPermissionException (role nemá právo) a SkautisTransportException
(skautIS neodpovídá) — všechny dědí z SkautisException.
Vývoj bez AppID
webwings_skautis: mock: true
SkautisClientInterface se přepne na FixtureSkautisClient, který odpovídá
z JSON souborů. Bundle veze ukázkovou sadu (středisko, dva oddíly, dvacet členů
s kontakty); vlastní data nasměrujete přes fixture_dir.
Přihlášení projde stejnou cestou jako doopravdy — pošlete na svou login routu POST
s skautIS_Token rovným FixtureSkautisClient::TOKEN. Díky tomu se testuje
skutečný authenticator, ne jeho obejití.
Přidání další metody skautISu
Přehled služeb je na https://test-is.skaut.cz/JunakWebservice, živě se dá
zkoušet na ws.skautis.cz.
Názvy vstupních polí vždy ověřte na …/JunakWebservice/<Služba>.asmx?op=<Metoda> —
stránka ukazuje request i response XML. Odhadovat je nemá cenu: SoapClient
pracuje podle WSDL a neznámé klíče tiše zahodí, takže metoda jen vrátí prázdno.
$rows = $client->callAll('OrganizationUnit', 'PersonAll', ['ID_Unit' => 1002]); $one = $client->callOne('OrganizationUnit', 'UnitDetail', ['ID' => 1002]);
Token do ID_Login a AppID do ID_Application doplňuje klient sám. Pozor na
dvě výjimky: LoginUpdate a LoginUpdateRefresh berou token jako ID.
Požadavky
PHP 8.2+ s ext-soap, Symfony 6.4 / 7.x / 8.x.
Rozsah je deklarovaný podle použitého API; odzkoušeno zatím jen na PHP 8.4 a Symfony 8.1. Pokud narazíte na starší kombinaci, dejte vědět.
Licence
MIT, viz LICENSE.