Laravel Badmethodcallexception -metoden [Find] eksisterer ikke

Laravel Badmethodcallexception -metoden [Find] eksisterer ikke

Problem

Jeg har prøvd å få en veltalende modell fra databasen, men fortsetter å komme inn i BadmethodcallexceptionMethod [finn] eksisterer ikke.

Her er hva jeg prøvde så langt:

namespace -app;
Bruk Illuminate \ Database \ Eloquent \ Model;
Bruk app \ organisasjon;
Klassebruker utvider modellen
/**
* Databasetabellen brukt av modellen.
*
* @var streng
*/
beskyttet $ tabell = 'brukere';
/**
* Attributtene ekskludert fra modellens JSON -skjema.
*
* @var -matrise
*/
beskyttet $ skjult = array ('passord');
Offentlige funksjonsorganisasjoner ()

Returner $ this-> tilhørighetstomany (organisasjon :: klasse);

Dette er en grunnleggende brukerklasse som følger med hvert nytt Laravel -prosjekt. Etter å ha opprettet en ny bruker, kan jeg tydelig se at bruker med ID3 eksisterer i databasen. Men når jeg gjør følgende, ender jeg opp med Badmethodcallexception -metoden [find] eksisterer ikke

Klassebruker utvider basecontroller
offentlig funksjon getUser ($ id)

$ my_user = bruker :: finn ($ id);
Returvis ('Brukere.indeks ', array (' bruker '=> $ my_user));

Rutene mine filer ruter \ web.php:

Rute :: get ('bruker/id', 'bruker@getUser');
Rute :: Get ('/', funksjon ()

Returnvis :: Make ('Test');
);

Løsning

Det er noen få problemer med denne implementeringen som kan føre til at du får Badmethodcallexception -metoden [find] eksisterer ikke unntak.

  • Du bør følge beste praksis for å navngi kontrollerne dine som modell + "kontroller" -ordet slik at du ender opp med en brukerkontroller i stedet for bare bruker .
  • Brukerklassen du henviser til her er faktisk ikke relatert til appen din \ brukermodell. Hvis du merker det, inkluderte du aldri eksplisitt modellen din. Så forutsatt at du allerede fikset det forrige punktet, må du inkludere TheUser -klassen i UserController . Først da kan du lage nye objekter ved å bruke den klassen. Så i UserController GO og legg til bruk app \ bruker; på toppen. (Legg merke til hvordan jeg inkluderte app \ organisasjon)
  • Når du har fikset det, bør du kjøre komponistdump -o for å regenerere komponisten.Låsfil som vil bidra til å fremskynde lasting av klassene dine.

Etter å ha gjort det, bør du kunne få tilgang til appen din \ brukermodell som du hadde tenkt.

Ytterligere forklaring (kun for utdanningsformål)

Som du vet har nettutvikling aldri ment å være et enmannsshow. Du kan generelt forvente å samarbeide med andre utviklere omtrent 90% av tiden. For at prosjektet skal lykkes, må du sørge for at alle følger generelle kodingsregler.

På reglene vil det handle om navnekonvensjoner, og jeg forstår at å følge med en klar navnekonvensjon krever mye krefter og potensielt kan kaste bort mye av teamets tid til alle kan forstå og følge dem. Dette er spesielt tøft for nye utviklere som blir med i teamet.

Jeg vil foreslå at du prøver å lese mer av andres kode før du begynner å skrive din, bare for å få en følelse av den beste bransjepraksisen.

Noen regler er obligatoriske, og noen blir overlatt til teamet for å bestemme hvordan de vil nærme seg.

Når du ser på problemet ovenfra, vil du legge merke til at alle klasser skal skrives i en studiecaps, så UserController og ikke User_Controller .

Og dette er et eksempel på en obligatorisk regel å følge.

Nå, et eksempel på hva du som team kan definere som din interne regel, er hvordan du navngir klasser, metoder og variabler.

Hvis det forventes at et prosjekt skal vokse over tid, kan du absolutt forvente mange forskjellige enheter som på en eller annen måte inkluderer en bruker, så det er viktig at du ikke kommer med vage navn på klasser, metoder og variabler.

Mitt personlige tips her er; Ikke vær redd for å ha en lengre klasse eller et metodenavn. Hvis du trenger å ha en kommentar som forklarer metoden din, kan metodens navn sannsynligvis være bedre.

Et eksempel på dette er at hvis du trenger å hente brukere fra en database med noen tilleggsbetingelser, er det kanskje brukere over 50 år, så ikke navngi metoden din getUsers . En bedre måte å nevne det på er getallusersover50yearsold .