Problema
Ho cercato di ottenere un modello Eloquente dal database, ma continuo ad entrare BadMethodCallExceptionMethod[trova]
non esiste.
Ecco cosa ho provato finora:
spazio dei nomi app;usa Illumina\Database\Eloquent\Model;
usa App\Organizzazione;
class L'utente estende il modello
/**
* La tabella del database utilizzata dal modello.
*
* @var stringa
*/
protetto $table = 'utenti';
/**
* Gli attributi esclusi dal modulo JSON del modello.
*
* @var array
*/
protetto $nascosto = array('password');
organizzazioni di funzione pubblica()
return $this->belongsToMany(Organizzazione::classe);
Questa è una classe utente di base che viene fornita con ogni nuovo progetto Laravel. Dopo aver creato un nuovo utente, posso vedere chiaramente che l'utente con ID3 esiste nel database. Tuttavia, quando faccio quanto segue, finisco con il Il metodo BadMethodCallException [trova] non esiste
funzione pubblica getUser($id)
$my_user = Utente::find($id);
return view('utenti.index', array('user' => $my_user));
I miei percorsi file route\web.php:
Route::get('user/id', '[email protected]');Percorso::get('/', function()
return View::make('test');
);
Soluzione
Ci sono alcuni problemi con questa implementazione che potrebbero farti ricevere Il metodo BadMethodCallException [trova] non esiste
eccezione.
- Dovresti seguire le migliori pratiche nel nominare i tuoi controller come il tuo modello + parola "Controller" in modo da finire con un UserController invece che solo User .
- La classe Utente a cui ti riferisci qui non è in realtà correlata al tuo modello App\Utente. Se lo noti, non hai mai incluso esplicitamente il tuo modello. Quindi supponendo che tu abbia già corretto il punto precedente, dovresti includere la classe User nel tuo UserController . Solo allora puoi creare nuovi oggetti usando quella classe. Quindi nel tuo UserController vai e aggiungi use App\User; in cima. (Nota come ho incluso App\Organizzazione)
- Dopo averlo corretto, dovresti eseguire il dump del compositore -o per rigenerare il compositore.lock file che ti aiuterà ad accelerare il caricamento delle tue classi.
Dopo averlo fatto, dovresti essere in grado di accedere al tuo modello App\Utente come previsto.
Ulteriori spiegazioni (solo per scopi didattici)
Come sai, lo sviluppo web non è mai stato concepito per essere uno spettacolo personale. In genere puoi aspettarti di collaborare con altri sviluppatori circa il 90% delle volte. Affinché il progetto abbia successo, devi assicurarti che tutti seguano le regole generali di codifica.
Una delle regole riguarderà le convenzioni di denominazione e capisco che tenere il passo con una convenzione di denominazione definita richiede molto sforzo e può potenzialmente sprecare molto tempo del team finché tutti non possono capirle e seguirle. Questo è particolarmente difficile per i nuovi sviluppatori che si uniscono al team.
Ti suggerirei di provare a leggere più codice di altre persone prima di iniziare a scrivere il tuo, solo per avere un'idea delle migliori pratiche del settore.
Alcune regole sono obbligatorie e alcune sono lasciate al team per decidere come vogliono avvicinarsi.
Guardando il problema dall'alto, noterai che tutte le classi dovrebbero essere scritte in uno StudlyCaps, quindi UserController e non user_controller .
E questo è un esempio di regola obbligatoria da seguire.
Ora, un esempio di ciò che tu come squadra potresti definire come regola interna è il modo in cui dai un nome alle tue classi, metodi e variabili.
Se ci si aspetta che un progetto cresca nel tempo, puoi certamente aspettarti molte entità diverse che in un modo o nell'altro includono un utente, quindi è importante che non ti vengano in mente nomi vaghi per le tue classi, metodi e variabili.
Il mio consiglio personale qui è; non aver paura di avere una classe più lunga o un nome di metodo. Se hai bisogno di un commento che spieghi il tuo metodo, probabilmente il nome del tuo metodo può essere migliore.
Un esempio di ciò è che se hai bisogno di ottenere utenti da un database con qualche condizione aggiuntiva, forse quelli sono utenti con più di 50 anni, allora non nominare il tuo metodo getUsers . Un modo migliore per chiamarlo è getAllUsersOver50YearsOld .