Ryk Waters
Ryk Waters

Reputation: 677

Laravel 5 setting route parameter from middleware

The problem: I'd like to resolve slugs, if a slug has been used as a route parameter instead of an id.

Attempted Solution: I'm currently getting a parameter from the request in my middleware and trying to set it back to the request. But it seems that this isn't passed to the route (it is passed to subsequent middleware)

Route:

Route::get('view_events/{gid}', array('as' => 'view_events','middleware' => ['auth','resolveGroupSlug','groupAdmin'], function($gid) 
{
    $user = Auth::user();
    $group = Team::find($gid);
    echo $gid;
      //get this user's relationship to group
    $group["team_user"] = Users_team::findComposite($gid,$user["id"]);
    $events = Helpers::getEvents($gid,0);
    return View::make('view_events', array('user' => $user, 'group' => $group, 'events' => $events));
}));

Middleware (resolveGroupSlug):

public function handle($request, Closure $next)
    {
        //convert a string gid to id number
        if (is_string ($request->gid)) {
            $group = Team::where('slug', '=', $request->gid)->firstOrFail();
            $request['gid'] = $group->id;
            echo $request->gid;
        }
        return $next($request);
    }

Any ideas how to set a route parameter in middleware? Or if there is just an easier way of doing this.

(No, i'm not going to copy paste the middleware code into every route i need this in!)

Thanks!!

Upvotes: 0

Views: 1499

Answers (2)

Ryk Waters
Ryk Waters

Reputation: 677

In the end, i didn't use middlewhere, but instead bound a function to routes that have gid as follows

Route::bind('gid', function($gid)
{
    $group = Team::where('slug', '=', $gid)->orWhere('id', '=', $gid)->first();
    $gid = $group->id;
    return $gid;
});

This means that all existing code will continue to work, whether people are linking via ids or slugs.

Any feedback, i'd love to know if i'm doing something silly here?

Obviously i'm now aware that i could be passing the group directly to the controller, but some of my controllers are only after the id, not the whole group, so this gives me the best flexibility.

Upvotes: 1

jensaronsson
jensaronsson

Reputation: 66

The new value wont get passed as a parameter in the route closure. You need to get it from $request->request->get('gid'); Try dd($gid, $request->request->get('gid')); and compare. Or $request->gid will proxy to the same methodcall

Upvotes: 1

Related Questions