Маршрут Laravel передает переменную контроллеру

Как передать жестко закодированную переменную в контроллер?

Мой маршрут:

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

Я хочу сделать что-то вроде:

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

Но это не работает.

Как это можно сделать?


Извините, если я не хорошо объяснил.

Я хочу просто указать hardcode (установленный мной камень) type_id для определенных маршрутов, например:

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

Мои продуктыКонтроллер для справки:

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

}

Ответ 1

Вы можете использовать закрытие для своего маршрута, а затем вызвать действие контроллера:

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

Однако лучше всего будет использовать условие where, а затем выполнить преобразование типа в идентификатор в контроллере... Вы потеряете идею прямого псевдонима и должны будете пройти в продукте как параметр при создании URL-адреса.

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

Ответ 2

Я использовал это для передачи значений контроллеру...

Маршрут:

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

в контроллере:

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

если хотите динамический:

$var    =   "Lists"; 

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

надеюсь, что это поможет...

Ответ 3

Мне кажется, что самый аккуратный способ сделать это, вероятно, с ограничениями маршрута:

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)

У него есть избыточность, но если вы хотите сделать это исключительно с ваших маршрутов, я бы пошел с этим.

Для создания имен, ориентированных на SEO, вы можете использовать Sluggable для создания уникального пула для каждого продукта, а затем создать следующий маршрут

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

И этот фильтр:

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

Ответ 4

Вот как вы на самом деле это делаете, не испортив URL:

Определить маршрут:

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

Теперь в контроллере внутри 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'];
}