Problém
Snažil jsem se získat výmluvný model z databáze, ale stále se dostat do BadMethodCallExceptionMethod [najít]
neexistuje.
Tady jsem se zatím snažil:
jmenný prostor App;použijte Illuminate \ Database \ Eloquent \ Model;
používat App \ Organization;
třída Uživatel rozšiřuje Model
/ **
* Databázová tabulka používaná modelem.
*
* @var řetězec
* /
protected $ table = 'users';
/ **
* Atributy vyloučené z formuláře JSON modelu.
*
* @var pole
* /
protected $ hidden = array ('password');
veřejné funkční organizace ()
vrátit $ this-> patříToMany (organizace :: třída);
Toto je základní třída User, která je součástí každého nového projektu Laravel. Po vytvoření nového uživatele vidím jasně, že v databázi existuje uživatel s ID3. Když však udělám následující, skončím s BadMethodCallException Metoda [find] neexistuje
veřejná funkce getUser ($ id)
$ my_user = Uživatel :: najít ($ id);
zpětný pohled („uživatelé.index ', array (' user '=> $ my_user));
Trasy souborů My Routes \ web.php:
Route :: get ('user / id', '[email protected]');Route :: get ('/', function ()
návrat View :: make ('test');
);
Řešení
Existuje několik problémů s touto implementací, které mohou způsobovat, že budete dostávat BadMethodCallException Metoda [find] neexistuje
výjimka.
- Měli byste postupovat podle osvědčených postupů při pojmenovávání řídicích jednotek jako slova Model + „Řídicí jednotka“, abyste místo User pouze získali UserController .
- Třída User, na kterou zde odkazujete, ve skutečnosti nesouvisí s vaším modelem App \ User. Pokud si toho všimnete, nikdy jste výslovně nezahrnuli svůj model. Takže za předpokladu, že jste již opravili předchozí bod, budete muset do svého UserController zahrnout třídu User . Teprve potom můžete pomocí této třídy vytvářet nové objekty. Takže ve svém UserController přejděte a přidejte use App \ User; Nahoře. (Všimněte si, jak jsem zahrnoval App \ Organization)
- Jakmile to opravíte, měli byste spustit skladatelský výpis -o pro regeneraci skladatele.soubor zámku, který pomůže urychlit načítání vašich tříd.
Poté byste měli mít přístup k vašemu modelu App \ User, jak jste zamýšleli.
Další vysvětlení (pouze pro vzdělávací účely)
Jak víte, vývoj webových aplikací nikdy neměl být přehlídkou pro jednoho člověka. Obecně můžete očekávat, že budete spolupracovat s dalšími vývojáři asi 90% času. Aby byl projekt úspěšný, musíte se ujistit, že všichni dodržují obecná pravidla kódování.
Jedno z pravidel bude o konvenci pojmenování a chápu, že dodržování definitivní konvence pojmenování vyžaduje hodně úsilí a může potenciálně plýtvat spoustou času týmu, dokud jim každý nebude rozumět a nebude se jimi řídit. To je obzvláště těžké pro nové vývojáře, kteří se připojí k týmu.
Navrhoval bych, abyste se pokusili přečíst více kódu jiných lidí, než začnete psát svůj, jen abyste získali představu o nejlepších praktikách v oboru.
Některá pravidla jsou povinná a některá jsou ponechána na týmu, aby se rozhodl, jak chce přistupovat.
Při pohledu na problém shora si všimnete, že všechny třídy by měly být psány v StudlyCaps, takže UserController a ne user_controller .
A toto je příklad povinného pravidla, které je třeba dodržovat.
Příklad toho, co byste jako tým mohli definovat jako své interní pravidlo, je, jak pojmenujete své třídy, metody a proměnné.
Pokud se očekává, že projekt v průběhu času poroste, můžete určitě očekávat mnoho různých entit, které tak či onak zahrnují uživatele, takže je důležité, abyste pro své třídy, metody a proměnné nepřicházeli s neurčitými názvy.
Můj osobní tip je zde; nebojte se mít delší třídu nebo název metody. Pokud potřebujete komentář, který vysvětluje vaši metodu, může být název vaší metody pravděpodobně lepší.
Příkladem toho je, že pokud potřebujete získat uživatele z databáze s nějakou další podmínkou, možná jsou to uživatelé starší 50 let, pak nepojmenujte svou metodu getUsers . Lepší způsob, jak to pojmenovat, je getAllUsersOver50YearsOld .