Я разрабатываю пакет Laravel, который будет генерировать правила запроса на основе блоков EditorJS, присутствующих в запросе. Чтобы обеспечить максимальное удобство для разработчиков, я предлагаю класс EditorJSFormRequest, который расширяет класс FormRequest. Этот класс создает правила для определенных типов блоков, а затем может использоваться как обычный класс FormRequest внутри функции контроллера.
Моя проблемаКласс FormRequest взят из Illuminate\Foundation\Http\FormRequest, который, к сожалению, не является отдельным пакетом, но требует всего пакета laravel/framework. На мой взгляд, требовать всю структуру целиком — это плохая практика, и мне интересно, есть ли другой способ. Если нет, то я уже сомневаюсь, что мое решение закодировано логически, а это означает, что я также задаюсь вопросом, нужно ли мне менять весь код.
Контекст< /p>
Учитывая, что я начинаю сомневаться, на правильном ли я пути, я хочу предложить некоторый контекст, чтобы дать вам представление о том, что я делаю, это код класса EditorJSFormRequest:
p>
Код: Выделить всё
namespace FurisonTech\LaraveditorJS;
use Illuminate\Foundation\Http\FormRequest;
abstract class EditorJSFormRequest extends FormRequest
{
protected array $editorJSFieldRuleBuilders = [];
/**
* EditorJSFormRequest constructor.
* @param array $editorJSFieldRuleBuilders
*/
public function __construct(array $editorJSFieldRuleBuilders = [])
{
parent::__construct();
$this->editorJSFieldRuleBuilders = $editorJSFieldRuleBuilders;
}
/**
* Get the validation rules that apply to the request.
* @return array
*/
final public function rules(): array
{
$rules = [];
// Build rules for each Editor.js field
foreach ($this->editorJSFieldRuleBuilders as $builder) {
$rules = array_merge($rules, $builder->buildRules($this));
}
// Merge with additional rules
return array_merge($rules, $this->additionalRules());
}
/**
* Additional validation rules.
* @return array
*/
abstract protected function additionalRules(): array;
}
Код: Выделить всё
class SaveArticleRequest extends EditorJSFormRequest
{
private const ALLOWED_EMBED_SERVICES = ['youtube', 'twitter', 'instagram', 'facebook', 'imgur'];
public function __construct()
{
parent::__construct([
new EditorJSRequestFieldRuleBuilder('article', [
'table' => new TableBlockRulesSupplier(200, 20, 255, 3),
'header' => new HeaderBlockRulesSupplier(255, null),
'paragraph' => new ParagraphBlockRulesSupplier(2500, null),
'image' => new ImageBlockRulesSupplier(255, 10),
'audioPlayer' => new AudioPlayerBlockRulesSupplier(12),
'embed' => new EmbedBlockRulesSupplier(self::ALLOWED_EMBED_SERVICES, 255, 5),
'list' => new ListBlockRulesSupplier(100, 500, null),
])
]);
}
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return false;
}
protected function additionalRules(): array
{
return [];
}
}
Подробнее здесь: https://stackoverflow.com/questions/790 ... ut-dont-wa
Мобильная версия