2014-11-10 1 views
13

Wie übergebe ich eine fest codierte Variable an einen Controller?Laravel Route Passvariable zum Controller

Mein Weg ist:

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

Ich möchte wie etwas tun:

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

Aber das funktioniert nicht.

Wie kann das gemacht werden?


Sorry, wenn ich nicht gut erklärt habe.

Ich möchte einfach codieren (Satz in Stein von mir) die type_id für bestimmte Strecken wie so:

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

Mein Products Referenz:

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

Wenn der Wert herkommt ist? Wenn es immer dasselbe ist, können Sie es als private Eigenschaft in Ihrem Controller hinzufügen. – Jerodev

+1

@ Jerodev Es ist hart in die Routen codiert. z.B. Milch ist 1, Orangensaft ist 2, Bicuits ist 3 usw. Das ist so, dass ich SEO freundliche Namen wirklich haben kann, sonst wäre es einfach, dh Route :: get ('/ product/{id} ..... – imperium2335

+0

Tun Sie diese Wenn ja, können Sie die ID der Produkte in Ihrem Controller nicht finden? – Jerodev

Antwort

23

Sie einen Verschluss für Ihre Route und rufen dann die Controller-Aktion verwenden können:

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

Aber ein schöner Weg wäre wahrscheinlich, um eine where Bedingung zu verwenden und dann die Typ-zu-ID-Konvertierung in der Steuerung durchzuführen ... Sie verlieren den direkten Aliasgedanken und müssten das Produkt als Parameter beim Generieren der URL übergeben.

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

ich verwendet habe, diese Werte zu übergeben an die Steuerung ...

Route:

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

in Controller:

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

wenn dynamische wollen:

$var = "Lists"; 

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

hoffe, das hilft ...

+0

Funktioniert auch für Lumen. Schön! – prograhammer

2

Ich mag die sauberste Art und Weise das Gefühl, dies zu tun, ist wahrscheinlich mit 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) 

Es hat eine gewisse Redundanz, aber wenn man es rein von Ihrem Routen tun wollen, würde ich gehen mit Dies.

Denn obwohl SEO-freundliche Namen zu machen, könnten Sie Sluggable verwenden, um einen einzigartigen Slug für jedes Produkt zu erzeugen, erstellen Sie die folgende Route:

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

Und diese Filter:

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

Hier ist, wie Sie es tatsächlich tun, ohne die URL zu verwirren:

Route definieren:

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]']); 

nun in der Steuerung innerhalb 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']; 
} 
Verwandte Themen