2014-11-10 2 views
13

Come si passa una variabile codificata su un controller?Laravel route passa la variabile al controller

Il mio percorso è:

Route::group(array('prefix' => $locale), function() { 
    Route::get('/milk', array('as' => 'milk', 'uses' => '[email protected]')); 
}); 

voglio fare qualcosa di simile:

Route::get('/milk', array('as' => 'milk', 'uses' => '[email protected](1)')); 

Ma questo non funziona.

Come si può fare?


Scusate se non ho spiegato bene.

desidero hardcode semplicemente (scolpito nella pietra da me) la type_id per determinati percorsi in questo modo:

Route::get('/milk', array('as' => 'milk', 'uses' => '[email protected](1)')); 
Route::get('/cheese', array('as' => 'cheese', 'uses' => '[email protected](2)')); 
... 

mio ProductsController per riferimento:

class ProductsController extends BaseController { 

    public function index($type_id) { 
     $Products = new Products; 
     $products = $Products->where('type_id', $type_id)->get(); 
     return View::make('products.products', array('products' => $products)); 
    } 

} 
+0

Da dove viene il valore viene? Se è sempre lo stesso, puoi aggiungerlo come proprietà privata nel tuo controller. – Jerodev

+1

@Jerodev È difficile codificare nei percorsi. per esempio. il latte è 1, il succo d'arancia è 2, bicuits è 3 ecc. Questo è così posso avere nomi SEO friendly altrimenti sarebbe facile ie Route :: get ('/ product/{id} ..... – imperium2335

+0

Do questi i valori provengono dal database? Se sì, non riesci a trovare l'id dei prodotti nel controller? – Jerodev

risposta

23

È possibile utilizzare una chiusura per il percorso e quindi chiamare l'azione di controllo:

Route::get('/milk', array('as' => 'milk', function(){ 
    return App::make('ProductsController')->index(1); 
})); 

Tuttavia, un modo migliore sarebbe probabilmente, per utilizzare una condizione where e quindi eseguire la conversione da tipo a id nel controller ... Allenterai l'alias diretto pensato e dovresti passare il prodotto come parametro durante la generazione dell'URL.

Route::get('{product}', array('as' => 'product', 'uses' => '[email protected]')) 
    ->where('product', '(milk|cheese)'); 
3

Ho usato questo per passare i valori al controller ...

percorso:

Route::get('user/{user}/usermanage', array('as' => 'userdata.usermanage',  'uses' => '[email protected]')); 
//{user} - holds some value... 

controller:

public function getUserDetails($id) 
{ 
    ... 
} 

se vuole dinamica:

$var = "Lists"; 

Route::get('something',  array('as' => 'something',  'uses' => '[email protected]'.$var)); 

speranza che questo aiuta ...

+0

Funziona anche per Lumen. – prograhammer

2

mi sento come il modo più ordinata per farlo è probabilmente con route constraints:

Route::get('{milk}', [ 'as' => 'milk', 'uses' => '[email protected]' ]) 
    ->where('milk', 'milk'); // matches the named arg {milk} (param 1) 
           // to the regex literal 'milk' (param 2) 

Ha una certa ridondanza, ma se si vuole fare è puramente da tuoi percorsi, mi piacerebbe andare con Questo.

Per fare i nomi di SEO-friendly, però, è possibile utilizzare Sluggable per generare una lumaca unico per ogni prodotto, quindi creare il seguente percorso:

Route::get('{product}', [ 'as' => 'product', 'before' => 'product-slug', 'uses' => '[email protected]' ]) 
    ->where('product', '[a-z0-9]+[a-z0-9\-]*'); // valid slug syntax 

E questo filtro:

Route::filter('product-slug', function($route) { 
    $slug = $route->getParameter('slug'); 
    if (is_numeric($slug)) { // if the slug is an ID 
     $product = Product::findOrFail($slug); // try to find the product 
     return Redirect::route('product', $product->slug); // and redirect to it 
    } 
}); 
0

Qui è come si fa effettivamente senza rovinare l'url:

Definire percorso:

Route::match(['GET', 'POST'], 'my-url', ['var_1'=>'hello', 'var_2'=>'world', 'prefix'=>'my-prefix', 'middleware'=>['web', 'mid2', 'mid3'], 'as'=>"my-route-name", 'uses'=>'[email protected]']); 

Ora nel controller, all'interno function __construct(Request $request):

$req_action = @$request->route()->getAction(); 

$var_1 = $var_2 = ''; 
if(is_array($req_action) && !empty($req_action['var_1'])){ 
$var_1 = (int)@$req_action['var_1']; 
} 

if(is_array($req_action) && !empty($req_action['var_2'])){ 
$var_2 = @$req_action['var_2']; 
}