Я пишу код:
class File extends Resource {
public function fields(Request $request) {
return [
MorphTo::make('Fileable')->types([
User::class,
])
];
}
class File extends Model {
public function fileable() {
return $this->morphTo();
}
class CreateFilesTable extends Migration {
public function up() {
Schema::create('files', function (Blueprint $table) {
$table->bigIncrements('id');
$table->morphs('fileable');
$table->timestamps();
});
}
Отображается так:
Но дляпользователям этот дисплей будет удобен:
Как вы можете сделать такой дисплей?
Или дисплей MorphTo
как MorphOne
:
class User extends Resource {
public function fields(Request $request) {
return [
MorphOne::make('File'),
];
}
Могу ли я сделать что-то подобное?
Lifehack # 1:
protected function panel(): array {
$fs = [];
foreach($this->model()->fileable->getAttributes() as $k => $v) {
$fs[] = Text::make($k, null, function() use($v) { return $v;});
}
return $fs;
}
public function fields(Request $request) {
return [
ID::make()->sortable(),
new Panel('Information', $this->panel()),
];
}
Но отображаются все поля модели:
Но я хочу отображать только те поля, которые описаны в ресурсе.
Lifehack # 2:
protected function panel(Request $request): array {
$fs = [];
$name = (new \ReflectionClass(get_class($this->model()->detailable)))->getShortName();
$res = "App\Nova\\{$name}";
$r = new $res($this->model()->detailable);
foreach($r->fields($request) as $k => $v) {
$v->attribute = 'detailable->' . $v->attribute;
$v->onlyOnDetail();
$fs[] = $v;
}
return $fs;
}
public function fields(Request $request) {
return [
new Panel('Information', $this->panel($request) ),
];
}