web-dev-qa-db-fra.com

Laravel route passe variable au contrôleur

Comment passer une variable codée en dur à un contrôleur?

Mon itinéraire est:

Route::group(array('prefix' => $locale), function() {
    Route::get('/milk', array('as' => 'milk', 'uses' => 'ProductsController@index'));
});

Je veux faire quelque chose comme:

Route::get('/milk', array('as' => 'milk', 'uses' => 'ProductsController@index(1)'));

Mais ça ne marche pas.

Comment cela peut-il être fait?


Désolé si je n'ai pas bien expliqué.

Je souhaite simplement coder en dur le type_id pour certains itinéraires comme ceci:

Route::get('/milk', array('as' => 'milk', 'uses' => 'ProductsController@index(1)'));
Route::get('/cheese', array('as' => 'cheese', 'uses' => 'ProductsController@index(2)'));
...

My ProductsController pour référence:

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));
    }

}
14
imperium2335

Vous pouvez utiliser une fermeture pour votre route puis appeler l'action du contrôleur:

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

Cependant, une méthode plus agréable consisterait à utiliser une condition where, puis à effectuer la conversion de type en id dans le contrôleur. Vous perdrez cependant l'alias direct et devrez transmettre le produit en tant que paramètre lors de la génération de l'URL.

Route::get('{product}', array('as' => 'product', 'uses' => 'ProductsController@index'))
    ->where('product', '(milk|cheese)');
25
lukasgeiter

J'ai utilisé cela pour transmettre des valeurs au contrôleur ...

route:

Route::get('user/{user}/usermanage',  array('as' => 'userdata.usermanage',       'uses' => 'yourController@getUserDetails'));
//{user} - holds some value...

dans le contrôleur:

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

si vous voulez dynamique:

$var    =   "Lists"; 

Route::get('something',        array('as' => 'something',      'uses' => 'yourController@get'.$var));

j'espère que cela t'aides...

3
Ronser

Je pense que la meilleure façon de faire est probablement avec des contraintes de route :

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

Il y a une certaine redondance, mais si vous voulez le faire uniquement à partir de vos itinéraires, je l’accepterai.

Pour créer des noms conviviaux pour le référencement, vous pouvez utiliser Sluggable pour générer un slug unique pour chaque produit, puis créer la route suivante:

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

Et ce filtre:

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
    }
});
2
Joe

Voici comment vous le faites réellement sans foirer l'URL:

Définir itinéraire:

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

Maintenant dans le contrôleur, dans 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'];
}
0
Raheel Hasan