Изменить значение родительского свойства в PHP - PullRequest
2 голосов
/ 11 июня 2019

У меня есть родительский класс с некоторыми свойствами по умолчанию. В дочернем классе я хочу обновить эти свойства напрямую, без использования метода. Зачем? Я считаю, что это чистый способ определения функциональности в дочернем классе.

Итак, вот мой родительский класс:

<?php 

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class BaseFormRequest extends FormRequest 
{
    protected static $NEEDS_AUTHORIZATION = false;
    protected static $FORM_RULES          = [];

    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize() : bool
    {
        //dd($this->authorize);
        return self::$NEEDS_AUTHORIZATION;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules() : array
    {
        return self::$FORM_RULES;
    }
}

В моем детском классе я хотел бы сделать что-то похожее на следующее:

<?php

namespace App\Http\Requests;

use App\Http\Requests\BaseFormRequest;

class RegisterUserRequest extends BaseFormRequest
{

    protected static $NEEDS_AUTHORIZATION = true;
    protected static $FORM_RULES = [ /* specific form rules for this form */];
}

Я не знаю, будет ли это правильным способом сделать это. У меня вопрос, могу ли я сделать что-то подобное? Если у меня есть 5 классов запросов форм, расширяющих BaseFormRequest , мне просто нужно переопределить NEEDS_AUTHORIZATION и FORM_RULES , что выглядит намного чище, чем создание тех же методов (authorize() и rules()) снова и снова в каждом классе.

Ответы [ 2 ]

1 голос
/ 11 июня 2019

Вы можете сделать это. Если это не работает для вас сейчас, это потому, что вы не используете позднюю статическую привязку .

По сути, в ваших методах rules() и authorize() вы ссылаетесь на self, тогда как вы должны ссылаться на static, чтобы это работало так, как вы ожидаете.

например:.

public function rules() : array {
   return static::$FORM_RULES;
}

Вы можете увидеть пример этой работы здесь

0 голосов
/ 11 июня 2019

Вы можете использовать Конструкторы для своих целей.

<?php

namespace App\Http\Requests;

use App\Http\Requests\BaseFormRequest;

class RegisterUserRequest extends BaseFormRequest
{

    public function __construct()
    {
        parent::__construct();
        BaseFormRequest::NEEDS_AUTHORIZATION = true;
        BaseFormRequest::FORM_RULES = [ /* specific form rules for this form */];
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...