Skip to content

rocketfirm/mattermost

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

4 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ с Mattermost

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π°

app/                              # Основная дирСктория прилоТСния
│── Console/                      # ΠšΠΎΠ½ΡΠΎΠ»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹
β”‚   └── Mattermost/               # ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Mattermost
β”‚       β”œβ”€β”€ SyncChannelsCommand.php   # Команда для синхронизации ΠΊΠ°Π½Π°Π»ΠΎΠ² (Ρ‡Π°Ρ‚ΠΎΠ²)
β”‚       β”œβ”€β”€ SyncCommandCommand.php    # Команда для синхронизации ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹
β”‚       β”œβ”€β”€ SyncCommandsCommand.php   # Команда для синхронизации ΠΊΠΎΠΌΠ°Π½Π΄
β”‚       β”œβ”€β”€ SyncTeamsCommand.php      # Команда для синхронизации пространств
β”‚       β”œβ”€β”€ SyncUsersCommand.php      # Команда для синхронизации ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Mattermost
│── Contracts/                    # ΠšΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Ρ‹ (интСрфСйсы)
β”‚   └── Mattermost/               # ΠšΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Ρ‹ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Mattermost
β”‚       β”œβ”€β”€ ActionContract.php         # ΠšΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Mattermost Action Hook
β”‚       β”œβ”€β”€ DialogServiceContract.php  # ΠšΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Mattermost Dialog Hook
β”‚       β”œβ”€β”€ CommandContract.php        # ΠšΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ Mattermost
β”‚       β”œβ”€β”€ CommandServiceContract.php # ΠšΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ (CRUD) Mattermost
β”‚       β”œβ”€β”€ PostServiceContract.php    # ΠšΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с постами (сообщСниями) Mattermost
β”‚       β”œβ”€β”€ TeamServiceContract.php    # ΠšΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с пространствами Mattermost
β”‚       β”œβ”€β”€ UserServiceContract.php    # ΠšΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌΠΈ Mattermost
│── DTO/                          # Data Transfer Objects (ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ…)
β”‚   └── Jenkins/                  # DTO для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с запросами Jenkins Webhook
│── Enums/                        # ΠšΠ»Π°ΡΡΡ‹-пСрСчислСния
β”‚   └── Jenkins/                  # ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½ΠΈΡ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Jenkins Webhook
│── Exceptions/                    # Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ
β”‚   └── Mattermost/               # Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Mattermost
β”‚       β”œβ”€β”€ ServiceException.php      # Π‘Π°Π·ΠΎΠ²ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Mattermost
│── Filament/                     # РСсурсы Π°Π΄ΠΌΠΈΠ½ΠΊΠΈ Filament
│── Handlers/                     # ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ событий
β”‚   β”œβ”€β”€ Jenkins/                  # ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Jenkins Webhook
β”‚   └── Mattermost/               # ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Mattermost
β”‚       β”œβ”€β”€ SyncChannelsHandler.php   # ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ для синхронизации ΠΊΠ°Π½Π°Π»ΠΎΠ² (Ρ‡Π°Ρ‚ΠΎΠ²)
β”‚       β”œβ”€β”€ SyncCommandHandler.php    # ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ для синхронизации ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹
β”‚       β”œβ”€β”€ SyncCommandsHandler.php   # ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ для синхронизации ΠΊΠΎΠΌΠ°Π½Π΄
β”‚       β”œβ”€β”€ SyncDataHandler.php       # ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ для синхронизации всСх сущностСй Mattermost
β”‚       β”œβ”€β”€ SyncTeamsHandler.php      # ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ для синхронизации пространств Mattermost
β”‚       β”œβ”€β”€ SyncUsersHandler.php      # ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ для синхронизации ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Mattermost
│── Http/                         # HTTP-слой прилоТСния
β”‚   β”œβ”€β”€ Controllers/              # ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Ρ‹
β”‚   β”‚   β”œβ”€β”€ Commands/             # ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Ρ‹ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ
β”‚   β”‚   β”‚   └── Mattermost/       # ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Ρ‹ для Mattermost
β”‚   β”‚   β”‚       β”œβ”€β”€ CommandController.php # ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ Mattermost
β”‚   β”‚   β”œβ”€β”€ Webhook/              # ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Ρ‹ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Webhook
β”‚   β”‚   β”‚   β”œβ”€β”€ Jenkins/          # ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Ρ‹ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Jenkins Webhook
β”‚   β”‚   β”‚   └── Mattermost/       # ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Ρ‹ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Mattermost Webhook
β”‚   β”‚   β”‚       β”œβ”€β”€ ActionController.php  # ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Mattermost Action Hook
│── Livewire/                     # ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Livewire
│── Models/                       # МодСли Eloquent
β”‚   └── Mattermost/               # МодСли для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Mattermost
β”‚       β”œβ”€β”€ Channel.php           # МодСль для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΊΠ°Π½Π°Π»Π°ΠΌΠΈ (Ρ‡Π°Ρ‚Π°ΠΌΠΈ)
β”‚       β”œβ”€β”€ ChannelProject.php     # МодСль для связи ΠΊΠ°Π½Π°Π»ΠΎΠ² с ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°ΠΌΠΈ
β”‚       β”œβ”€β”€ Command.php           # МодСль для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ
β”‚       β”œβ”€β”€ ProjectUser.php       # МодСль для связи ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ с ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°ΠΌΠΈ
β”‚       β”œβ”€β”€ Team.php              # МодСль для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с пространствами
β”‚       β”œβ”€β”€ User.php              # МодСль для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌΠΈ
│── Policies/                     # ΠŸΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ (доступ) для Π°Π΄ΠΌΠΈΠ½ΠΊΠΈ Filament
│── Providers/                    # БСрвис-ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€Ρ‹
β”‚   └── Mattermost/               # ΠŸΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€Ρ‹ для Mattermost
β”‚       β”œβ”€β”€ ServiceProvider.php       # ΠŸΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с сСрвисами Mattermost
│── Services/                     # БСрвисный слой
β”‚   └── Mattermost/               # БСрвисы для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Mattermost
β”‚       β”œβ”€β”€ ChannelService.php    # БСрвис для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΊΠ°Π½Π°Π»Π°ΠΌΠΈ (Ρ‡Π°Ρ‚Π°ΠΌΠΈ) Mattermost
β”‚       β”œβ”€β”€ CommandService.php    # БСрвис для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ Mattermost
β”‚       β”œβ”€β”€ DialogService.php     # БСрвис для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π΄ΠΈΠ°Π»ΠΎΠ³Π°ΠΌΠΈ (ΠΌΠΎΠ΄Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΎΠΊΠ½Π°ΠΌΠΈ) Mattermost
β”‚       β”œβ”€β”€ PostService.php       # БСрвис для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с постами (сообщСниями) Mattermost
β”‚       β”œβ”€β”€ TeamService.php       # БСрвис для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с пространствами Mattermost
β”‚       β”œβ”€β”€ UserService.php       # БСрвис для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌΠΈ Mattermost
│── Traits/                       # Π’Ρ€Π΅ΠΉΡ‚Ρ‹ (ΠΌΠΎΠ΄ΡƒΠ»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°)
β”‚   β”œβ”€β”€ Mattermost/               # Π’Ρ€Π΅ΠΉΡ‚Ρ‹ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Mattermost
β”‚   β”‚   β”œβ”€β”€ CallEndpointMethod.php # Π’Ρ€Π΅ΠΉΡ‚ для Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² эндпоинтов Mattermost
β”‚   β”œβ”€β”€ ConfigTrait.php           # Π’Ρ€Π΅ΠΉΡ‚ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠ΅ΠΉ
β”‚   β”œβ”€β”€ LocalizationTrait.php     # Π’Ρ€Π΅ΠΉΡ‚ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ
β”‚   β”œβ”€β”€ ResponseTrait.php         # Π’Ρ€Π΅ΠΉΡ‚ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с HTTP-ΠΎΡ‚Π²Π΅Ρ‚Π°ΠΌΠΈ

МодСли

  • Mattermost/Channel.php - Ρ‚Π°Π±Π»ΠΈΡ†Π°: mattermost_channels, МодСль для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΊΠ°Π½Π°Π»Π°ΠΌΠΈ (Ρ‡Π°Ρ‚Π°ΠΌΠΈ)
  • Mattermost/ChannelProject.php - Ρ‚Π°Π±Π»ΠΈΡ†Π°: mattermost_channels_projects, МодСль для связи ΠΊΠ°Π½Π°Π»ΠΎΠ² с ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°ΠΌΠΈ
  • Mattermost/Command.php - Ρ‚Π°Π±Π»ΠΈΡ†Π°: mattermost_commands, МодСль для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ
  • Mattermost/ProjectUser.php - Ρ‚Π°Π±Π»ΠΈΡ†Π°: mattermost_projects_users, МодСль для связи ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ с ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°ΠΌΠΈ
  • Mattermost/Team.php - Ρ‚Π°Π±Π»ΠΈΡ†Π°: mattermost_teams, МодСль для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с пространствами
  • Mattermost/User.php - Ρ‚Π°Π±Π»ΠΈΡ†Π°: mattermost_users, МодСль для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌΠΈ

ΠœΠΎΠ΄ΡƒΠ»ΠΈ Π² Π°Π΄ΠΌΠΈΠ½ΠΊΠ΅

  • Настройки: Π›ΠΎΠ³ дСйствий, ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ, Π ΠΎΠ»ΠΈ

admin_module_settings.png

  • Mattermost: Π§Π°Ρ‚Ρ‹ (Channel), ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ (Command), ΠŸΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ (ChannelProject), ΠŸΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚Π²Π° (Team), ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ (User)

mattermost_module_settings.png

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ Π² Ρ„Π°ΠΉΠ»Π΅ config/mattermost.php

<?php

return [
    /*
    |--------------------------------------------------------------------------
    | Default Mattermost Server Name
    |--------------------------------------------------------------------------
    |
    | Here you cam specify which server you wish to use as your
    | default Mattermost server.
    |
    */

    'default' => env('MATTERMOST_SERVER', 'login'),

    /*
    |--------------------------------------------------------------------------
    | Mattermost Servers
    |--------------------------------------------------------------------------
    |
    | Here you can configure a list of different Mattermost servers
    | to use within your application.
    |
    | You can authenticate in two ways: passing a Bearer Token or
    | passing Username and Password. The allowed values for the "auth"
    | option are: "default", "bearer".
    |
    */

    'servers' => [
        // ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ Mattermost, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹
        'login' => [
            'auth' => env('MATTERMOST_AUTH', 'login'),
            'host' => env('MATTERMOST_HOST', 'localhost'),
            'login' => env('MATTERMOST_LOGIN', 'login'),
            'password' => env('MATTERMOST_PASSWORD', 'password'),
            'api' => env('MATTERMOST_API', '/api/v4'),
            'timeout' => env('MATTERMOST_TIMEOUT', 5),
        ],
    ],
];

Π”Ρ€Π°ΠΉΠ²Π΅Ρ€

Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Mattermost ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π΄Ρ€Π°ΠΈΜ†Π²Π΅Ρ€ MattermostDriver

composer require rocketfirm/mattermost-driver
php artisan vendor:publish

ΠšΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Ρ‹ (Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΡ‹)

Π’ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π°Ρ… Π·Π°Π»ΠΎΠΆΠ΅Π½Ρ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Mattermost. РСализация ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ΠΎΠ² находится Π² Services/Mattermost. Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ΠΎΠ² происходит Π² Providers/Mattermost/ServiceProvider.php

Кнопки Π² постах (ActionContract.php)

action_contract.png

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ дСйствия ΠΊΠ½ΠΎΠΏΠΊΠΈ Π² постах происходит Ρ‡Π΅Ρ€Π΅Π· Π²Π΅Π±Ρ…ΡƒΠΊ ActionController.php, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ ActionContract.php

/** @var \App\Http\Requests\Mattermost\ActionHookRequest $request */
$request = app()->make(\App\Http\Requests\Mattermost\ActionHookRequest::class);

/** @var \App\Contracts\Mattermost\ActionContract $contract */
$contract = app()->make(\App\Contracts\Mattermost\ActionContract::class);

$contract->do($request->getDto());

ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ Ρ‡Π°Ρ‚Π° с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌΠΈ Π² Mattermost (ChannelServiceContract.php)

ΠœΠ΅Ρ‚ΠΎΠ΄ direct Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΠΎΠ²Ρ‹ΠΉ/Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ Ρ‡Π°Ρ‚ с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌΠΈ (senderId - ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚Π΅Π»ΡŒ, receiverId - ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚Π΅Π»ΡŒ)

$senderId = 'senderId'; // ID ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π² Mattermost
$receiverId = 'receiverId'; // ID ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π² Mattermost

/** @var \App\Contracts\Mattermost\ChannelServiceContract $service */
$service = app()->make(\App\Contracts\Mattermost\ChannelServiceContract::class);

$channel = $service->direct($senderId, $receiverId);

$channel->id; // ID Ρ‡Π°Ρ‚Π°

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ (CommandServiceContract.php)

call_command.png

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π² Ρ‡Π°Ρ‚Π΅ происходит Ρ‡Π΅Ρ€Π΅Π· Π²Π΅Π±Ρ…ΡƒΠΊ CommandController.php, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ CommandContract.php

/** @var \App\Http\Requests\Mattermost\CommandRequest $request */
$request = app()->make(\App\Http\Requests\Mattermost\CommandRequest::class);

/** @var \App\Contracts\Mattermost\CommandContract $contract */
$contract = app()->make(\App\Contracts\Mattermost\CommandContract::class);

$contract->call($request->getDto());

Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ (CommandServiceContract.php)

use Rocketfirm\MattermostDriver\Requests\Command\CreateRequest;
use Rocketfirm\MattermostDriver\Enums\Command\Method;
use Rocketfirm\MattermostDriver\Requests\Command\IndexRequest;
use Rocketfirm\MattermostDriver\Requests\Command\UpdateRequest;

/** @var \App\Contracts\Mattermost\CommandServiceContract $service */
$service = app()->make(\App\Contracts\Mattermost\CommandServiceContract::class);

// Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹
$command = $service->createCommand(new CreateRequest(
    teamId: 'teamId', // ID пространства Π² Mattermost
    method: Method::POST, // HTTP ΠΌΠ΅Ρ‚ΠΎΠ΄ Π²Ρ‹Π·ΠΎΠ²Π° ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Ρ‡Π΅Ρ€Π΅Π· Π²Π΅Π±Ρ…ΡƒΠΊ
    trigger: 'command', // Π’Ρ€ΠΈΠ³Π³Π΅Ρ€ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹
    url: 'http://localhost', // URL Π²Π΅Π±Ρ…ΡƒΠΊΠ° для Π²Ρ‹Π·ΠΎΠ²Π° ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹
));

// Π Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹
$service->updateCommand(new UpdateRequest(
    id: $command->id, // ID ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π² Mattermost
    token: $command->token, // Π’ΠΎΠΊΠ΅Π½ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹
    createAt: $command->createAt, // Π”Π°Ρ‚Π° создания ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹
    updateAt: $command->updateAt, // Π”Π°Ρ‚Π° обновлСния ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹
    deleteAt: $command->deleteAt, // Π”Π°Ρ‚Π° удалСния ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹
    creatorId: $command->creatorId, // ID создатСля ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹
    teamId: $command->teamId, // ID пространства Π² Mattermost
    trigger: $command->trigger, // Π’Ρ€ΠΈΠ³Π³Π΅Ρ€ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹
    method: $command->method, // HTTP ΠΌΠ΅Ρ‚ΠΎΠ΄ Π²Ρ‹Π·ΠΎΠ²Π° ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Ρ‡Π΅Ρ€Π΅Π· Π²Π΅Π±Ρ…ΡƒΠΊ
    username: $command->username, // Имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π² Mattermost
    iconUrl: $command->iconUrl, // URL ΠΈΠΊΠΎΠ½ΠΊΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π² Mattermost
    autoComplete: $command->autoComplete, // АвтозаполнСниС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹
    autoCompleteDesc: $command->autoCompleteDesc, // ОписаниС автозаполнСния ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹
    autoCompleteHint: $command->autoCompleteHint, // Подсказка автозаполнСния ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹
    displayName: $command->displayName, // ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΠΎΠ΅ имя ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹
    description: $command->description, // ОписаниС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹
    url: $command->url, // URL Π²Π΅Π±Ρ…ΡƒΠΊΠ° для Π²Ρ‹Π·ΠΎΠ²Π° ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹
));

// ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ пространства
$commands = $service->getCommands(new IndexRequest(
    teamId: 'teamId', // ID пространства Π² Mattermost
    customOnly: false, // ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹
));

// ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹
$command = $service->showCommand($command->id);

// Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹
$service->deleteCommand($command->id);

Π’Ρ‹Π·ΠΎΠ² Π΄ΠΈΠ°Π»ΠΎΠ³Π° (ΠΌΠΎΠ΄Π°Π»ΠΊΠΈ) (DialogServiceContract.php)

open_dialog.png

Π’Ρ‹Π·ΠΎΠ² Π΄ΠΈΠ°Π»ΠΎΠ³Π° происходит Ρ‡Π΅Ρ€Π΅Π· Π²Π΅Π±Ρ…ΡƒΠΊ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ DialogServiceContract.php

/** @var \App\Http\Requests\Mattermost\DialogRequest $request */
$request = app()->make(\App\Http\Requests\Mattermost\DialogRequest::class);

/** @var \App\Contracts\Mattermost\DialogServiceContract $contract */
$contract = app()->make(\App\Contracts\Mattermost\DialogServiceContract::class);

$contract->open($request->getDto());

Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ постами (сообщСниями) (PostServiceContract.php)

post_crud.png

use Rocketfirm\MattermostDriver\Collections\AttachmentCollection;
use Rocketfirm\MattermostDriver\Entities\Props;
use Rocketfirm\MattermostDriver\Requests\Post\CreateRequest;
use Rocketfirm\MattermostDriver\Requests\Post\UpdateRequest;

/** @var \App\Contracts\Mattermost\PostServiceContract $contract */
$contract = app()->make(\App\Contracts\Mattermost\PostServiceContract::class);

// Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ поста
$post = $contract->createPost(new CreateRequest(
    setOnline: true, // Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ статус ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π½Π° ΠΎΠ½Π»Π°ΠΈΜ†Π½
    channelId: 'channelId', // ID ΠΊΠ°Π½Π°Π»Π°
    message: 'Text message', // ВСкст сообщСния
    rootId: 'rootId', // ID Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ сообщСния
    fileIds: ['fileId1', 'fileId2'], // ID Ρ„Π°ΠΈΜ†Π»ΠΎΠ²
    props: new Props(
        props: [ // Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ свойства
            'key1' => 'value1',
            'key2' => 'value2',
        ],
        attachmentCollection: AttachmentCollection::make(), // ΠšΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡ Π²Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ (ΠΊΠ½ΠΎΠΏΠΎΠΊ, Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΎΠΊ)
    )
));

// Π Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ поста
$contract->updatePost(new UpdateRequest(
    id: $post->id, // ID поста Π² Mattermost
    isPinned: true, // Π—Π°ΠΊΡ€Π΅ΠΏΠΈΡ‚ΡŒ пост
    message: 'Updated message', // ВСкст сообщСния
    hasReactions: false, // Π£Π΄Π°Π»ΠΈΡ‚ΡŒ Ρ€Π΅Π°ΠΊΡ†ΠΈΠΈ
    props: new Props(
        props: [ // Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ свойства
            'key1' => 'value1',
            'key2' => 'value2',
        ],
        attachmentCollection: AttachmentCollection::make(), // ΠšΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡ Π²Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ (ΠΊΠ½ΠΎΠΏΠΎΠΊ, Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΎΠΊ)
    )
));

Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ пространствами (TeamServiceContract.php)

use Rocketfirm\MattermostDriver\Requests\Team\ChannelsRequest;
use Rocketfirm\MattermostDriver\Requests\Team\IndexRequest;

/** @var \App\Contracts\Mattermost\TeamServiceContract $service */
$service = app()->make(\App\Contracts\Mattermost\TeamServiceContract::class);

// ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ пространств
$teams = $service->getTeams(new IndexRequest(
    page: 0, // НомСр страницы
    perPage: 60, // ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ элСмСнтов Π½Π° страницС
    includeTotalCount: true, // Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ подсчСт ΠΎΠ±Ρ‰Π΅Π³ΠΎ количСства элСмСнтов
    excludePolicyConstrained: true, // Π˜ΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ пространства, ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹Π΅ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΎΠΉ
));

// ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΊΠ°Π½Π°Π»ΠΎΠ² (Ρ‡Π°Ρ‚ΠΎΠ²)
$publicChannels = $service->getPublicChannels(new ChannelsRequest(
    teamId: 'teamId', // ID пространства
    page: 0, // НомСр страницы
    perPage: 60, // ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ элСмСнтов Π½Π° страницС
));

// ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Ρ… ΠΊΠ°Π½Π°Π»ΠΎΠ² (Ρ‡Π°Ρ‚ΠΎΠ²)
$privateChannels = $service->getPrivateChannels(new ChannelsRequest(
    teamId: 'teamId', // ID пространства
    page: 0, // НомСр страницы
    perPage: 60, // ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ элСмСнтов Π½Π° страницС
));

Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌΠΈ (UserServiceContract.php)

use Rocketfirm\MattermostDriver\Requests\User\IndexRequest;
use Rocketfirm\MattermostDriver\Enums\Post\Sort;

/** @var \App\Contracts\Mattermost\UserServiceContract $service */
$service = app()->make(\App\Contracts\Mattermost\UserServiceContract::class);

// ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ
$users = $service->index(new IndexRequest(
    page: 0, // НомСр страницы
    perPage: 60, // ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ элСмСнтов Π½Π° страницС
    inTeam: 'teamId', // ID пространства
    notInTeam: 'teamId', // ID пространства
    inChannel: 'channelId', // ID ΠΊΠ°Π½Π°Π»Π°
    notInChannel: 'channelId', // ID ΠΊΠ°Π½Π°Π»Π°
    inGroup: 'groupId', // ID Π³Ρ€ΡƒΠΏΠΏΡ‹
    groupConstrained: true, // Π˜ΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹Ρ… Π³Ρ€ΡƒΠΏΠΏΠΎΠΉ
    withoutTeam: false, // Π˜ΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Π±Π΅Π· пространства
    active: true, // АктивныС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ
    inactive: true, // НСактивныС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ
    role: 'role', // Роль
    sort: Sort::CREATE_AT, // Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ°
    roles: ['role1', 'role2'], // Π ΠΎΠ»ΠΈ
    channelRoles: ['channelRole1', 'channelRole2'], // Π ΠΎΠ»ΠΈ ΠΊΠ°Π½Π°Π»Π°
    teamRoles: ['teamRole1', 'teamRole2'], // Π ΠΎΠ»ΠΈ пространства
));

// ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ всСх ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Π² пространствС
$allUsers = $service->all(
    inTeamId: 'teamId', // ID пространства
    notInTeamId: 'teamId', // ID пространства
);

Π˜Π½Ρ„Ρ€Π°ΡΡ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π°

Зависимости

  • PHP 8.2
  • Laravel 11.9
  • PostgreSQL Latest
  • Nginx Latest Alpine

Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Ρ‹

Π›ΠΈΠ½Ρ‚Π΅Ρ€Ρ‹

Laravel Pint для форматирования ΠΈ стандартизации ΠΊΠΎΠ΄Π°

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Laravel Pint ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ Π² pint.json

  • Для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΊΠΎΠ΄Π° запускаСтся ΠΊΠΎΠΌΠ°Π½Π΄Π°:
vendor/bin/pint --test --dirty --config pint.json
  • Для форматирования ΠΊΠΎΠ΄Π°:
vendor/bin/pint --config pint.json
Анализатор ΠΊΠΎΠ΄Π°

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° PHPStan ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ Π² phpstan.neon

  • Для запуска Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π°:
vendor/bin/phpstan analyse -c phpstan.neon

API ДокумСнтация Swagger

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° L5-Swagger

ΠšΠΎΠ½Ρ„ΠΈΠ³ΠΈ Π² Ρ„Π°ΠΉΠ»Π΅ l5-swagger.php

Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ класс ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π° Π² Controller

UI Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ доступСн ΠΏΠΎ ΠΏΡƒΡ‚ΠΈ http://blog.localhost/api/documentation

JSON Ρ„Π°ΠΉΠ» доступСн ΠΏΠΎ ΠΏΡƒΡ‚ΠΈ http://blog.localhost/docs/api-docs.json

Π‘Π°ΠΌΠ° докумСнтация гСнСрируСтся Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ storage/api-docs/api-docs.json

Для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π°:

php artisan l5-swagger:generate

ВСсты

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ стандартная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° PHPUnit

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ Π² Ρ„Π°ΠΉΠ»Π΅ phpunit.xml

Unit тСсты Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ Unit Feature тСсты Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ Feature

Π’Π°ΠΊ ΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΈ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° тСстов ΠΊ запуску (Π»ΠΎΠ³ΠΈΠΊΠ° описана Π² Ρ‚Ρ€Π΅ΠΉΡ‚Π΅ CreatesApplication).

Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ класс тСстов Π² TestCase

Для запуска тСстов ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π°:

vendor/bin/phpunit

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published