Puncte:2

Poate rutarea să folosească parametrii deja din adresa URL?

drapel cn

De fapt, folosesc D9 pentru a construi un sistem cu entități care folosesc subentități. Sistemul principal de entități utilizează următoarea cale: /item/{item} Fiecare subentitate este legată de o entitate principală și folosește această cale: /item/{item}/sub_item/{sub_item}

Deci, pentru a accesa formularul de editare sau ștergere, sunt necesare următoarele căi:

/item/{item}/sub_item/{sub_item}/edit /item/{item}/sub_item/{sub_item}/delete

De exemplu: /item/1/sub_item/4/edit

Am declarat urmatoarea ruta:

entity.sub_item.edit_form:
  cale: „/item/{item}/sub_item/{sub_item}/edit”
  implicite:
    _entity_form: „sub_item.edit”
    _title: „Editați elementul secundar”
  Opțiuni:
    _admin_route: ADEVĂRAT
    parametri:
      articol:
        tip: entitate: articol
        with_config_overrides: TRUE
      sub_element:
        tip: entitate:sub_item
        with_config_overrides: TRUE
  cerinte:
    _permission: „administrați configurația site-ului”

Linkurile Editare și ștergere sunt generate de generatorul de liste din getOperations. Generatorul de liste se află pe următorul traseu: /item/1/sub_items (aceasta este „colecția” pentru a afișa sub-articolele atașate articolului principal).

Speram că faptul că adresa URL curentă conține element/{item} poate fi reutilizat direct de generatorul de linkuri, dar nu este faptul...

Symfony\Component\Routing\Exception\MissingMandatoryParametersException: Unii parametri obligatorii lipsesc ("articol") pentru a genera o adresă URL pentru ruta "entity.sub_item.edit_form".în Drupal\Core\Routing\UrlGenerator->doGenerate() (linia 181 din /core/lib/Drupal/Core/Routing/UrlGenerator.php).

Am încercat să construiesc o anumită clasă htmlRouteProvider pentru clasa mea de entitate sub-element, dar și în acest caz, rutele sunt construite când memoria cache este șters și nu am acces la elementul din URL pentru a-l seta...

Deci... Întrebarea mea este: îmi lipsește ceva pentru a o face cu ușurință sau trebuie să reimplementez metoda „toUrl()” a clasei mele de entități sub-element pentru a include noul parametru „articol” „din zbor "?

Multumesc anticipat pentru orice sugestie.

PS: este soluția pe care o am de fapt în clasa mea de entitate sub-articol:

  funcția publică toUrl($rel = 'canonic', matrice $opțiuni = []) {
    $uri = parent::toUrl($rel, $opțiuni);
    $uri->setRouteParameter('item', \Drupal::routeMatch()->getRawParameter('item'));
    return $uri;
  }

Dar poate se poate găsi o soluție mai bună?

Jaypan avatar
drapel de
Nu ați afișat codul pe care îl utilizați pentru a genera adresa URL care cauzează eroarea.
Jaypan avatar
drapel de
Ar trebui să adaug, probabil că nu m-aș încurca cu calea către elementul secundar și mai degrabă aș crea un alias pentru calea pe care o doriți.
drapel cn
Fără cod, acesta este EntityListBuilder::getDefaultOperations care construiește automat legăturile afișate în coloana „operațiuni” a listei. Așa că o pot suprascrie sau o submetodă cum ar fi Entity::toUrl sau Entity::urlRouteParameters, cum ar fi sugerat de @4k4. M-am întrebat dacă există o altă „modalitate magică”, cum ar fi declararea unui anumit element în fișierul routing.yml, adică: Opțiuni: parametri: articol: tip: entitate:{item} #
Puncte:2
drapel cn

I would override SubItem::urlRouteParameters() and make this independent from the current route match so that the entity can build links on all pages:

  protected function urlRouteParameters($rel) {
    $parameters = parent::urlRouteParameters($rel);
    // assuming the parent relationship is a reference field
    $parameters['item'] = $this->parent->target_id;
    // if the reference field is in the parent you have to run an entity query
    return $parameters;
  }
drapel cn
Bine. entity->toUrl() apelează entity->urlRouteParameters() pentru a prelua parametrii rutei. Este doar un nivel mai înalt. Dar dacă nu există altă cale, sunt în regulă să anulez una dintre aceste două metode. Mulțumesc pentru sugestie.
4uk4 avatar
drapel cn
IMHO, această metodă protejată există doar pentru a fi anulată în astfel de cazuri de utilizare.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.