我有一个带有一些默认属性的父类。在子类中,我想直接更新这些属性,而不使用方法。为什么?我相信这是在子类中定义功能的一种干净方法。
所以这是我的父母班:
<?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()
)在每个课程中反复出现。
答案 0 :(得分:1)
您可以做到。如果它现在对您不起作用,那是因为您没有利用late static binding。
基本上,在您的方法rules()
和authorize()
中,您引用的是self
,而您应该引用static
,以使其按预期工作
例如:
public function rules() : array {
return static::$FORM_RULES;
}
您可以看到here
的工作示例答案 1 :(得分:-1)
您可以出于自己的目的使用构造函数。
<?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 */];
}
}