Sto costruendo un CMS package for Laravel.Laravel Eloquent e Namespaces Issues
Tutti i miei models in questo pacchetto sono vincolati e risolti dal contenitore IoC in modo che possano essere facilmente sovrascritti in ogni singola distribuzione del pacchetto.
Per le relazioni non polimorfiche, questo ha funzionato.
Per esempio, un Page ha molti PageModules, per cui il suo rapporto è cambiato da:
// \Angel\Core\Page
public function modules()
{
return $this->hasMany('PageModule');
}
a:
// \Angel\Core\Page
public function modules()
{
return $this->hasMany(App::make('PageModule'));
}
Ma io non sono stati in grado di capire come fare il stessa cosa con le relazioni polimorfiche.
Ad esempio, i Menu contengono MenuItems e ciascun MenuItem può essere associato a un singolo altro modello, ad esempio una Pagina o BlogPost.
Per fare questo il modo in cui laravel, ho aggiunto la seguente relazione al MenuItem:
// \Angel\Core\MenuItem
public function linkable()
{
return $this->morphTo();
}
E questo rapporto LinkableModel, che tutti i modelli come pagina e BlogPost estendono:
// \Angel\Core\LinkableModel
public function menuItem()
{
return $this->morphOne(App::make('MenuItem'), 'linkable');
}
E la tabella menus_items
ha queste righe:
linkable_type | linkable_id
-------------------|--------------
\Angel\Core\Page | 11
\Angel\Core\Page | 4
Questo funziona benissimo, ma ho bisogno del linkable_type
di dire "Pagina" invece di "\ Angel \ Core \ Page" e di essere risolto dalla "Pagina" di IoC invece di essere codificato in una particolare classe con spazi dei nomi.
che cosa ho provato:
Secondo this question, dovrebbe essere facile come la definizione di una proprietà $morphClass
al collegabile() classi, in questo modo:
// \Angel\Core\Page
protected $morphClass = 'Page';
Ma quando si applica questo e modificare la tabella menus_items
simile al seguente:
linkable_type | linkable_id
---------------|--------------
Page | 11
Page | 4
... Ho semplicemente un errore Class 'Page' not found.
ogni volta che linkable() viene chiamato su MenuItem.
This is the exact line in Eloquent that throws the error.
Così, ho scavato nel eloquente e pensato che avrei potuto essere in grado di farla franca con qualcosa di simile:
// \Angel\Core\MenuItem
public function linkable()
{
return $this->morphTo(null, App::make($this->linkable_type));
}
... questo si sente così vicino, ma ahimè: Eloquente chiama linkabile() prima di riempire il resto degli attributi/colonne di MenuItem, quindi $ this-> linkable_type è null e quindi non risolverà nulla dal IoC.
Grazie mille in anticipo per qualsiasi consiglio si possa avere!
Sei un genio. Grazie mille per il vostro aiuto. Dici che non possiamo passare nulla per nome perché non sarebbe in grado di dedurlo, ma [questo mi ha fatto pensare che potremmo!] (Http://laravel.com/api/source-class- Illuminate.Database.Eloquent.Model.html # 523) – Leng
Anche se sto usando Laravel 4.1 che ha [questo morphTo] (https://github.com/laravel/framework/blob/2f1c6cd51dfd51d573977f07e34ba609cc0bf3ac/src/Illuminate/Database/Eloquent/ model.php # L724). – Leng
Ratti!Quasdunk, quando carico questa relazione, non funziona più perché $ this-> linkable_type è, in effetti, nullo in quella situazione. Suppongo che durante il caricamento ansioso, Eloquent chiama i metodi di relazione prima di riempire le proprietà/colonne. :(Continuerò a cercare una soluzione funzionante – Leng