This session would cover the basic and some advanced Routing concepts in Laravel.
Citation preview
Mindfire Solutions 1 Laravel - Routing : Basic and some
advanced concepts -By Pallavi Dhanuka
Mindfire Solutions 2 Routing: Introduction Basic Routing
Routing with Parameters Named Routing Route filters Route groups
and prefixing Handling Errors Controller routing
Mindfire Solutions 3 Introduction Routing: the coolest feature
of Laravel Very flexible All the routes can be defined in one file:
app/routes.php
Mindfire Solutions 4 Basic Route Can be used for static pages
and no need to add any controller ! Yes, just the view file is
enough :) Route::get('/', function(){ return 'hi'; //or return
View::make('login'); }); Url: http://Localhost/ o/p: Hi (or the
login page of your app)
Mindfire Solutions 5 Secured routing
Route::get('myaccount',array('https', function(){ return 'My https
secured page'; })); Url: https://localhost/myaccount o/p: My https
secured page Url: http://localhost/myaccount o/p: Not found
exception
Mindfire Solutions 6 Route parameters
Route::get('profile/{name}', function($name) { return 'Hey there '.
$name.' ! Welcome to whatsapp !'; }); Url:
http://localhost/profile/john o/p : Hey there john! Welcome to
whatsapp!
Mindfire Solutions 7 Optional parameter
Route::get('profile/{name?}', function($name = null) { return 'Hey
there '. $name.' ! Welcome to whatsapp !'; }); Url:
http://localhost/profile/ o/p : Hey there ! Welcome to
whatsapp!
Mindfire Solutions 8 Route constraints
Route::get('profile/{name?}', function($name = null) { return 'Hey
there '. $name.' ! Welcome to whatsapp !'; }) ->where('name',
'[A-Za-z]+'); Url: http://localhost/profile/p45 o/p: Redirected to
missing page
Mindfire Solutions 9 Global patterns The same constraint is
applied to route parameters all across the routes.php
Route::pattern('id', '[0-9]+'); Route::get('profile/{id}',
function($id){ // Only called if {id} is numeric. });
Mindfire Solutions 10
Route::get('messages/{type?}',function($type = 'inbox'){ return
'Showing the '.$type.' messages!'; }); Url:
http://localhost/messages o/p: Showing the inbox messages!
Route::get('user/{id}/{name}', function($id, $name){ return 'Hey
there '. $name.' ! Welcome to whatsapp !'; }) ->where(array('id'
=> '[0-9]+', 'name' => '[a-z]+')); Url:
http://localhost/user/768/jim o/p: Hey there jim! Welcome to
whatsapp ! Wake up!
Mindfire Solutions 12 Named Routes
Route::get('long/route/user/profile', array('as' => 'profile',
function(){ return 'User profile' ; })); Url :
http://localhost/long/route/user/profile Call : {{ route('profile')
}} or Redirect::route('profile') $name = Route::currentRouteName();
// gives current route name Or : Route::get('user/profile',
array('as' => 'profile', 'uses'
=>'UserController@showProfile'));
Mindfire Solutions 13 Route Filters Limit the access to a given
route Useful in authentication and authorization Define a filter
(in app/filters.php) Route::filter('sessionCheck', function(){ if(
! Session::has('user')){ return Redirect::to('/'); } });
Mindfire Solutions 14 Attaching a filter Route::get('user',
array('before' => 'sessioncheck', function(){ return 'Welcome
user!'; })); Route::get('user', array('before' =>
'sessioncheck', 'uses' => 'UserController@showProfile'));
Route::get('user', array('before' => array('auth', 'old'),
function(){ return 'You are authenticated and over 200 years old!';
}));
Mindfire Solutions 15 # To allow the user to access only the
screens fetched from the database Route::filter('userAccess',
function(){ $accessList = Session::get('user.accessList'); $screen
= Request::segment(1); $subScreen = Request::segment(2); // the
subscreens' name should be present in the access list fetched from
db // the main screen's name should be present in the access list
if( !$isAdmin && ( ($subScreen != '' && !
in_array($subScreen, $accessList)) || ( $subScreen == '' &&
! in_array($screen, $accessList)) ) ){ return
Redirect::to('dashboard'); } });
Mindfire Solutions 16 Route groups Wouldnt it be great if we
could encapsulate our routes, and apply a filter to the container?
Route::group(array('before' => 'auth'), function(){
Route::get('user/accounts', function() { // Has Auth Filter });
Route::get('user/profile', function(){ // Has Auth Filter });
});
Mindfire Solutions 17 Route prefixing If many of your routes
share a common URL structure, you could use a route prefix
Route::group(array('prefix' => 'user'), function(){
Route::get('/accounts', function() { return 'User account'; });
Route::get('profile', function(){ return 'User profile'; }); });
Url : http://localhost/user/accounts
http://localhost/user/profile
Mindfire Solutions 18 Wake up! Wake up! What will be the
outcome of the below code snippet? Route::group(array('prefix'
=> 'user', 'before' => 'auth'), function(){
Route::get('/accounts', function() { return 'User accounts' });
Route::get('/profile', function(){ return 'User profile'; }); });
Url: http://localhost/user/profile o/p: User profile (after getting
authenticated by the 'auth' filter)
Mindfire Solutions 19 Handling errors in Laravel Its very easy
to handle errors or missing files/routes with Laravel Handled in
app/start/global.php /* handles the 404 errors, missing route
errors etc*/ App::missing(function($exception){ return
Redirect::to('/'); }); App::error(function(Exception $exception,
$code){ Log::error($exception); });
App::fatal(function($exception){ Log::error($exception); });
Mindfire Solutions 20 Routing with Controllers Controllers are
registered in the composer.json Route declarations are not
dependent on the location of the controller class file on disk. The
best way to handle routing for large applications is to use RESTful
Controllers
Mindfire Solutions 21 Basic Controller class UserController
extends BaseController { public function showProfile($id){ $user =
User::find($id); return View::make('user.profile',
compact('user')); } } In the routes.php :
Route::get('user/{id}','UserController@showProfile');
Mindfire Solutions 22 Using Namespace Define the namespace
before the controller class namespace mynamesp; Define the route as
below: Route::get('foo','mynamespMycontroller@method');
Mindfire Solutions 23 Filters in Controllers class
UserController extends BaseController { public function
__construct(){ $this->beforeFilter('auth', array('except' =>
'getLogin')); $this->beforeFilter('csrf', array('on' =>
'post')); $this->afterFilter('log', array('only' =>
array('fooAction','barAction'))); } }
Mindfire Solutions 24 RESTful Controllers Easily handle all the
actions in a Controller Avoid numerous routes and business logic in
routes.php Syntax: Route::controller('users', 'UserController');
Url: http://localhost/users/index o/p: goes to the getIndex action
of the UserController Form posted to : {{ Url('users') }} o/p: form
posted to the postIndex action of the UserController
Mindfire Solutions 25 Find the outcome ! # Named RESTful
Controllers In my routes.php I have a named route to getIndex
action: Route::controller('blog', 'BlogController',
array('getIndex' => 'home')); And in the BlogController the
method getIndex is as follows: public function getIndex(){ return
View::make('blog.home'); } Url: http://localhost/home O/p: Gives a
not found exception. Please note here that 'home' is the route name
to be used within the application. The uri 'blog' needs to be given
in the url to access the getIndex action of the BlogController