Slack API Laravel с использованием ошибок форматирования пакета spatie/laravel-slack-slash-command

Я использую пакет spatie/laravel-slack-slash-command, и приведенный ниже код работает нормально, за исключением этого условия: если пользователь не вводит аргумент, возникает ошибка, потому что есть Exceptions\InvalidInput. php в пакете, я просто хотел бы знать, как отформатировать эту ошибку или как переопределить метод getResponse(), который выводит вот так, спасибо!

InvalidInput.php

public function getResponse(Request $request): Response
{
    return parent::getResponse($request)
        ->withAttachment(
            Attachment::create()
                ->setText($this->handler->getHelpDescription())
        );
}

Ошибка

Вот как я хотел бы отформатировать ошибку

 if (empty($slack_request))
    {
       return $this->respondToSlack("Argument Missing")
            ->withAttachment(Attachment::create()
            ->setColor('warning')
            ->setText("You must provide two digits between 00 and 13 after ex : /tasks day {00}")
        );
    }

Вот мой класс

<?php

namespace App\SlashCommandHandlers;

use Spatie\SlashCommand\Attachment;
use Spatie\SlashCommand\AttachmentField;
use Spatie\SlashCommand\Handlers\SignatureHandler;
use Spatie\SlashCommand\Request;
use Spatie\SlashCommand\Response;
use App\Models\Retry42\Project;

class Projects extends SignatureHandler
{
    protected $signature = 'tasks day {day}';

  public function handle(Request $request): Response
  {

    $slack_request = $this->getArgument('day');

    if (empty($slack_request))
    {
       return $this->respondToSlack("Argument Missing")
            ->withAttachment(Attachment::create()
            ->setColor('warning')
            ->setText("You must provide two digits between 00 and 13 after ex : /tasks day {00}")
        );
    }

    if(!preg_match("/^(0[0-9]|1[0-3])$/", $slack_request))
    {
        return $this->respondToSlack("Invalid argument, two digits between 00 and 13")
            ->withAttachment(Attachment::create()
            ->setColor('warning')
            ->setText("Project day must be two digits between 00 and 13")
        );
    }

    $day =  $slack_request;

    $project = 'Day '.$day;

    $project = Project::where('name', '=', $project)->firstOrFail();

    $tasks = $project->tasks->toArray();

    if (!count($tasks)) {
         return $this->respondToSlack("Sorry we could not get you any tasks for Day {$day}")
            ->withAttachment(Attachment::create()
            ->setColor('warning')
            ->setText("Try another day!")
        );
    }

     $attachmentFields = collect($tasks)->reduce(function (array $attachmentFields, array $task) {
        $value = $task['description'] ?? '';

        if($task['visible'] == 1)
        {    
            $attachmentFields[] = AttachmentField::create('Name', $task['name'])->displaySideBySide();
            $attachmentFields[] = AttachmentField::create('Description', $value)->displaySideBySide();            
        }

        return $attachmentFields;
    }, []);

    return $this->respondToSlack("Here are the tasks for Day {$day}")
            ->withAttachment(Attachment::create()
            ->setColor('good')
            ->setFields($attachmentFields)
        ); 
  }
}

Я попытался, как и предложил, отредактировать SignatureHandler.php с $foo на этот

public function getArgument($foo = null)
{
    if($foo == null) return [];
    return $this->input->getArgument($foo);
}

а затем пытаюсь проверить, пусто ли, но это тоже не сработало

 if (empty($slack_request))
    {
       return $this->respondToSlack("Argument Missing")
            ->withAttachment(Attachment::create()
            ->setColor('warning')
            ->setText("You must provide two digits between 00 and 13 after ex : /tasks day {00}")
        );
    }

Извините, я забыл поздороваться с вами!


person David Dacruz    schedule 31.12.2017    source источник


Ответы (3)


где возникает ошибка? когда вы не передаете «день» в функцию getArgument ()?

person Giorgi Lagidze    schedule 31.12.2017
comment
да, вывод ошибки, когда я использую такую ​​​​команду /tasks day, намеренно опуская аргумент «день» - person David Dacruz; 31.12.2017
comment
что вам нужно сделать: найдите функцию getArgument(), где бы она ни находилась. может быть что-то вроде этой публичной функции getArgument($variable), и вы должны изменить ее как публичную функцию getArgument($variable = null), и как только в этой функции в первой строке вы скажете, if($variable == null) return []; тогда, когда вы набрали if(empty($slack_request)) будет работать. следуйте логике, она приведет вас к решению. не могу дать вам больше информации, потому что я сам не вижу функцию getargument в этом коде - person Giorgi Lagidze; 31.12.2017
comment
Я думаю, я понимаю, что ваш метод достаточно прост, все, что мне нужно сделать, это изменить в SignatureHandler.php getargument() на public function getArgument($foo == null) { return $this->input->getArgument($foo); } правильно? есть ли способ защитить эту модификацию при обновлении пакетов? - person David Dacruz; 31.12.2017

Можете ли вы создать трейт, а затем включить и использовать этот трейт для переопределения метода? Таким образом, пакет по-прежнему будет обновляться, и ваша черта возьмет на себя функциональность, которую вы хотите присвоить.

person jeremykenedy    schedule 31.12.2017
comment
Это, безусловно, способ сделать это, но я еще не создал черты, я должен изучить это и следовать этому учебник о том, как использовать пакет, автор использует пустой метод для отправки ответа в slack if (empty($domain)) { return $this->respondToSlack("You must provide a domain name."); } - person David Dacruz; 31.12.2017
comment
Смотрится весело! Я уверен, что вы нашли это... docs.spatie.be/ laravel-slack-slash-command/v1/введение - person jeremykenedy; 31.12.2017
comment
Я думаю, вам нужно создать свой собственный обработчик - person jeremykenedy; 31.12.2017
comment
Эти документы привели меня к следующему: api.slack.com/docs/message-attachments - person jeremykenedy; 31.12.2017
comment
На самом деле это довольно весело, и я нашел эти ссылки, также класс SignatureHandler уже существует в этом потрясающем пакете, спасибо за ваше время, чтобы помочь @developernator - person David Dacruz; 31.12.2017

Нашел, как получить ожидаемый результат, изменив метод validate() в SignatureHandler.php, комментируя исключение, возвращающее вместо этого пустой массив, и проверьте, работает ли сейчас пустой в методе дескриптора. Спасибо за помощь. Хотя это не лучший способ сделать это, это самый быстрый способ выполнить то, что я хотел для этого.

 public function validate()
{
    try {
        $this->input->validate();
    } catch (RuntimeException $exception) {
     //throw new InvalidInput($exception->getMessage(), $this, $exception);
            return [];
    }
}

Формированный вывод

person David Dacruz    schedule 01.01.2018