Route Model Binding e Soft Deletes – Laravel 4

Quando si utilizzano le eliminazioni software e il path per il collegamento del model, si verifica una circostanza quando non è ansible visualizzare il model iniettato se è stato "eliminato".

per esempio

Ho un model di lavoro. se io "cestino" uno di questi templates e poi apro il cestino e provo a visualizzare il model di lavoro, ottengo una risorsa 404 non trovata. Ho risolto questo problema utilizzando la function Route :: bind () come tale

Route::bind('job', function($id, $route) { return Job::withTrashed()->find($id); }); 

anche se questo sembra superfluo e un po 'sciocco … c'è un modo per aggirare questo, così posso usare la rilegatura a una linea molto eloquente:

 Route::model('job', 'Job'); 

Poiché Route :: model () utilizza il metodo find sul model, puoi semplicemente sovrascrivere il metodo per recuperare gli oggetti cestinati:

 class Job extends Eloquent { public static function find($id, $columns = arrays('*')) { return parent::withTrashed()->find($id, $columns); } } 

Ora puoi usare i bind del model senza chiusure

 Route::model('job', 'Job'); 

Fai attenzione mentre usi il metodo find in cui non vuoi recuperare oggetti cestinati.

Quello che hai delineato nella tua domanda sembra risolverlo.

Una leggera raffinatezza è che potresti voler specificare quale chiave specifica includere nei templates trashed.

Ad esempio, il model di path normale si lega in questo modo:

 Route::model('job', 'Job'); 

E definisci un'altra chiave come 'anyjob' where permetti di interrogare anche i lavori nel cestino:

 Route::bind('anyjob', function($id) { return Job::withTrashed()->find($id); }); 

Quindi, per le rotte in cui non desideri includere i lavori cestinati, fai semplicemente riferimento al job :

 get('/jobs/{job}/edit', ['controller' => '[email protected]']); // We don't want to be able to edit a trashed job. 

E anyjob riferimento solo al binding di anyjob per le rotte in cui un lavoro nel anyjob è accettabile:

 delete('/jobs/{anyjob}', ['controller' => '[email protected]']); // we could then forceDelete the trashed job for example as it'll be correctly injected in out our controller method 

Ciò impedisce di finire con templates eliminati in modo soft nei methods del controller che altrimenti non dovrebbero gestirli. Si specificano i routes esatti che potrebbero accettare qualsiasi lavoro, o anche solo lavori cestinati.

Oltre a questo, se hai creato i tuoi tratti e ambiti, puoi definire la function di ricerca qui. Ad esempio, ho un "approvedTrait" che funziona allo stesso modo ma con una colonna "approvata" per mostrare se qualcosa è stato approvato da un moderatore. Poi ho semplicemente inserito questo nella mia class di Tizio approvata:

 public static function find($id, $columns = arrays('*')) { return self::withUnapproved()->find($id, $columns); }