2014-11-10 15 views
13

Jak przekazać zmienną o zmiennym kodowaniu do kontrolera?Zmienna przepustka Laravel do kontrolera

Moja trasa:

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

chcę zrobić coś takiego:

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

Ale to nie działa.

Jak można tego dokonać?


Przepraszam, jeśli nie wyjaśniłem dobrze.

Pragnę po prostu zakodować (wykute w kamieniu przeze mnie) na type_id dla niektórych trasach tak:

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

Moja ProductsController dla odniesienia:

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

Skąd wartość pochodzi? Jeśli zawsze jest taka sama, możesz dodać ją jako własność prywatną do kontrolera. – Jerodev

+1

@Jerodev Jest zakodowany na stałe w trasach. na przykład mleko to 1, sok pomarańczowy to 2, bicuit to 3 itd. Jest tak, że mogę mieć przyjazne dla SEO nazwy, w przeciwnym razie byłoby to łatwe, np. Route :: get ('/ product/{id} ..... – imperium2335

+0

wartości pochodzą z bazy danych? Jeśli tak, to czy nie możesz znaleźć identyfikatora produktów w kontrolerze? – Jerodev

Odpowiedz

23

Można użyć zamknięcia na trasie, a następnie wywołać działania kontrolera:

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

Jednak lepszym sposobem byłoby, Aby użyć warunku where, a następnie wykonaj konwersję typu do identyfikatora w sterowniku ... Utracisz myślnik bezpośredni i będziesz musiał przekazać produkt jako parametr podczas generowania adresu URL.

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

Użyłem tego przekazać wartości do kontrolera ...

trasa:

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

w kontrolerze:

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

jeśli chcesz dynamiczny:

$var = "Lists"; 

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

nadziei, że to pomoże ...

+0

Działa również dla Lumen. – prograhammer

2

czuję się jak tidiest sposób to zrobić to chyba z 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) 

Ma jakieś redundancję, ale jeśli chcesz to zrobić wyłącznie od swoich tras, pójdę z to.

Do tworzenia nazw SEO przyjazne choć można użyć Sluggable wygenerować unikalny ślimak dla każdego produktu, a następnie utworzyć następującą trasę:

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

i ten filtr:

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

Tutaj to sposób, w jaki to robisz bez zniekształcania adresu URL:

Zdefiniuj trasę:

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

Teraz w sterowniku, wewnątrz 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']; 
} 
Powiązane problemy