I'm using Laravel 4, I'm trying to create a cms pages which the urls look like : domain.tld/en/how-it-works. they are created using a backoffice and I fetch it using the slug how-it-works and the current language . The problem is that if I want to access to domain.tld/login (which is a static page) it shows me a 404 page, of course because the page is not found in the database. So I'm looking for a solution which looks in the other routes if the given slug is not found.
Please any help.
And sorry for my english.
This my routes.php file
$languages = array('fr', 'en');
$locale = Request::segment(1);
if(in_array($locale, $languages)){
\App::setLocale($locale);
}else{
$locale = null;
}
Route::group(array('prefix' => $locale), function()
{
Route::get('/', array('before' => 'loginCookie', 'uses' => 'HomeController#getIndex', 'as' => '/'));
Route::get('{slug}',array('uses' => 'ArticleController#getArticle', 'as' => 'articles.show'));
Route::group(array('prefix' => 'login'), function() {
Route::get('/', array('before' => 'guest', 'after' => 'reflashPool', 'uses' => 'UserController#getLogin'));
Route::post('/',array('before' => 'guest|csrf','after' => 'reflashPool', 'uses' => 'UserController#postLogin'));
Route::get('remind-password',array('uses' => 'UserController#getRemind'));
Route::post('remind-password','UserController#postRemind');
Route::get('reset-password/{token}','UserController#getReset');
Route::post('reset-password','UserController#postReset');
});
To be as fast as possible, Laravel process routes in the order you write them and the first one which met the requirement is the one it choses.
So, you just have to make your most generic route the last one:
Route::group(array('prefix' => $locale), function()
{
Route::get('/', array('before' => 'loginCookie', 'uses' => 'HomeController#getIndex', 'as' => '/'));
Route::group(array('prefix' => 'login'), function() {
Route::get('/', array('before' => 'guest', 'after' => 'reflashPool', 'uses' => 'UserController#getLogin'));
Route::post('/',array('before' => 'guest|csrf','after' => 'reflashPool', 'uses' => 'UserController#postLogin'));
Route::get('remind-password',array('uses' => 'UserController#getRemind'));
Route::post('remind-password','UserController#postRemind');
Route::get('reset-password/{token}','UserController#getReset');
Route::post('reset-password','UserController#postReset');
});
Route::get('{slug}',array('uses' => 'ArticleController#getArticle', 'as' => 'articles.show'));
});
Related
In my Laravel 5.8 app when there are no data in session I need to redirect to some default control.
I do
return redirect()->route('admin.oauthAdminCallback/' . $form_action);
When in routes/web.php defined :
Route::group(['middleware' => ['auth', 'isVerified', 'CheckUserStatus'], 'prefix' => 'admin', 'as' => 'admin.'], function () {
Route::get('oauthAdminCallback/{form_action}', [ 'uses' => 'Admin\EventsController#oauthAdminCallback']);//->name('oauthAdminCallback');
But I got error :
Route [admin.oauthAdminCallback/calendarActionUpdate] not defined.
If in first line $form_action has value : “calendarActionUpdate”.
Which is correct way ?
MODIFIED :
I tried this way
return redirect()->route('admin.oauthAdminCallback',$form_action);
and this way
return redirect()->route('admin.oauthAdminCallback')->with([
'form_action' => $form_action,
]);
But in both cases I do not have amy error but method was not called!
In my routes/web.php :
Route::group(['middleware' => ['auth', 'isVerified', 'CheckUserStatus'], 'prefix' => 'admin', 'as' => 'admin.'], function () {
Route::get('oauthAdminCallback', [ 'as' => 'oauthAdminCallback', 'uses' =>'Admin\EventsController#oauthAdminCallback']);
// The method below is not called!
public function oauthAdminCallback()
{
session_start();
die("-1 XXZ oauthAdminCallback");
return redirect( is ignored and I can not understand why?
So you're calling the route by its name so
try this
return redirect()->route('admin.oauthAdminCallback',$form_action);
Mention your route as
Route::group(['middleware' => ['auth'], 'prefix' => 'admin', 'as' => 'admin.'], function () {
Route::get('oauthAdminCallback', [ 'as' => 'oauthAdminCallback', 'uses' => 'Admin\EventsController#oauthAdminCallback']);
});
And your callback as below
return redirect()->route('admin.oauthAdminCallback', $form_action);
Tried and tested.
Please I need help with how my links to the chatter forum are truncated when I click on discussions or any other link on the forum homepage.
A quick solution would be very much appreciated.Kindly Check the URL
Here's an example:
instead of;
localhost/apps/school/forums/discussions
it shows as:
localhost/forums/discussions
Below is the Route/web.php
<?php
/**
* Helpers.
*/
// Route helper.
$route = function ($accessor, $default = '') {
return $this->app->config->get('chatter.routes.'.$accessor, $default);
};
// Middleware helper.
$middleware = function ($accessor, $default = []) {
return $this->app->config->get('chatter.middleware.'.$accessor, $default);
};
// Authentication middleware helper.
$authMiddleware = function ($accessor) use ($middleware) {
return array_unique(
array_merge((array) $middleware($accessor), ['auth'])
);
};
/*
* Chatter routes.
*/
Route::group([
'as' => 'chatter.',
'prefix' => $route('home'),
'middleware' => $middleware('global', 'web'),
'namespace' => 'DevDojo\Chatter\Controllers',
], function () use ($route, $middleware, $authMiddleware) {
// Home view.
Route::get('/', [
'as' => 'home',
'uses' => 'ChatterController#index',
'middleware' => $middleware('home'),
]);
// Single category view.
Route::get($route('category').'/{slug}', [
'as' => 'category.show',
'uses' => 'ChatterController#index',
'middleware' => $middleware('category.show'),
]);
/*
* Auth routes.
*/
// Login view.
Route::get('login', [
'as' => 'login',
'uses' => 'ChatterController#login',
]);
// Register view.
Route::get('register', [
'as' => 'register',
'uses' => 'ChatterController#register',
]);
/*
* Discussion routes.
*/
Route::group([
'as' => 'discussion.',
'prefix' => $route('discussion'),
], function () use ($middleware, $authMiddleware) {
// All discussions view.
Route::get('/', [
'as' => 'index',
'uses' => 'ChatterDiscussionController#index',
'middleware' => $middleware('discussion.index'),
]);
// Create discussion view.
Route::get('create', [
'as' => 'create',
'uses' => 'ChatterDiscussionController#create',
'middleware' => $authMiddleware('discussion.create'),
]);
// Store discussion action.
Route::post('/', [
'as' => 'store',
'uses' => 'ChatterDiscussionController#store',
'middleware' => $authMiddleware('discussion.store'),
]);
// Single discussion view.
Route::get('{category}/{slug}', [
'as' => 'showInCategory',
'uses' => 'ChatterDiscussionController#show',
'middleware' => $middleware('discussion.show'),
]);
// Add user notification to discussion
Route::post('{category}/{slug}/email', [
'as' => 'email',
'uses' => 'ChatterDiscussionController#toggleEmailNotification',
]);
/*
* Specific discussion routes.
*/
Route::group([
'prefix' => '{discussion}',
], function () use ($middleware, $authMiddleware) {
// Single discussion view.
Route::get('/', [
'as' => 'show',
'uses' => 'ChatterDiscussionController#show',
'middleware' => $middleware('discussion.show'),
]);
// Edit discussion view.
Route::get('edit', [
'as' => 'edit',
'uses' => 'ChatterDiscussionController#edit',
'middleware' => $authMiddleware('discussion.edit'),
]);
// Update discussion action.
Route::match(['PUT', 'PATCH'], '/', [
'as' => 'update',
'uses' => 'ChatterDiscussionController#update',
'middleware' => $authMiddleware('discussion.update'),
]);
// Destroy discussion action.
Route::delete('/', [
'as' => 'destroy',
'uses' => 'ChatterDiscussionController#destroy',
'middleware' => $authMiddleware('discussion.destroy'),
]);
});
});
/*
* Post routes.
*/
Route::group([
'as' => 'posts.',
'prefix' => $route('post', 'posts'),
], function () use ($middleware, $authMiddleware) {
// All posts view.
Route::get('/', [
'as' => 'index',
'uses' => 'ChatterPostController#index',
'middleware' => $middleware('post.index'),
]);
// Create post view.
Route::get('create', [
'as' => 'create',
'uses' => 'ChatterPostController#create',
'middleware' => $authMiddleware('post.create'),
]);
// Store post action.
Route::post('/', [
'as' => 'store',
'uses' => 'ChatterPostController#store',
'middleware' => $authMiddleware('post.store'),
]);
/*
* Specific post routes.
*/
Route::group([
'prefix' => '{post}',
], function () use ($middleware, $authMiddleware) {
// Single post view.
Route::get('/', [
'as' => 'show',
'uses' => 'ChatterPostController#show',
'middleware' => $middleware('post.show'),
]);
// Edit post view.
Route::get('edit', [
'as' => 'edit',
'uses' => 'ChatterPostController#edit',
'middleware' => $authMiddleware('post.edit'),
]);
// Update post action.
Route::match(['PUT', 'PATCH'], '/', [
'as' => 'update',
'uses' => 'ChatterPostController#update',
'middleware' => $authMiddleware('post.update'),
]);
// Destroy post action.
Route::delete('/', [
'as' => 'destroy',
'uses' => 'ChatterPostController#destroy',
'middleware' => $authMiddleware('post.destroy'),
]);
});
});
});
/*
* Atom routes
*/
Route::get($route('home').'.atom', [
'as' => 'chatter.atom',
'uses' => 'DevDojo\Chatter\Controllers\ChatterAtomController#index',
'middleware' => $middleware('home'),
]);
You need to set the root directory to point to the public folder in laravel for the url rewriting to work and this won't happen when you're using xampp/wamp and accessing the url like folder structure. Only the index page of laravel app would work and other pages would throw errors. Also the links generated would not be accurate since laravel uses the base app url.
You should run php artisan serve and access your app with http://localhost:8000. This solves your routing and url generating issues. The other option would be to modify the virtual hosts in your local installation which isn't as easy.
My application works in local smoothly,but in online live server it always create a new session file in storage/framework/sessions . It shows always token mismatch. I can't find out where is my fault? Actually it works fine in my local server.
My Routes are:
Route::get('/', ['as'=>'dashboardRoute','uses'=>'DashboardController#index']);
//imports
Route::get('import/emails', ['as' => 'importEmailFormRoute', 'uses' => 'ImportController#getEmailImport']);
Route::post('import/emails', ['as' => 'importEmailPostRoute', 'uses' => 'ImportController#postEmailImport']);
Route::get('import/contacts', ['as' => 'importContactFormRoute', 'uses' => 'ImportController#getContactImport']);
Route::post('import/contacts', ['as' => 'importContactPostRoute', 'uses' => 'ImportController#postContactImport']);
//end imports
Route::get('user/profile', 'UserController#profile');
Route::post('user/profile', 'UserController#profileUpdate');
Route::resource('email', 'EmailController');
Route::resource('contacts', 'ContactController');
Route::resource('email-group', 'EmailGroupController');
Route::resource('contact-groups', 'ContactGroupController');
Route::resource('group-data', 'GroupDataController');
Route::resource('contact-group-datas', 'ContactGroupDataController');
Route::resource('user', 'UserController');
Route::resource('mail-log', 'EmailLogController');
Route::resource('sms-log', 'SmsLogController');
Route::get('send-form', 'SendMailController#sendEmailForm');
Route::get('group-mail-form', 'SendMailController#groupMailForm');
Route::post('send', 'SendMailController#sendMail');
Route::post('send-to-group', 'SendMailController#sendMailToGroup');
Route::get('sms/custom-send', ['as' => 'sendCustomSmsFormRoute', 'uses' => 'SmsController#getSendCustomSms']);
Route::post('sms/custom-send', ['as' => 'sendCustomSmsPostRoute', 'uses' => 'SmsController#postSendCustomSms']);
Route::get('sms/send-to-group', ['as' => 'sendGroupSmsFormRoute', 'uses' => 'SmsController#getSendGroupSms']);
Route::post('sms/send-to-group', ['as' => 'sendGroupSmsPostRoute', 'uses' => 'SmsController#postSendGroupSms']);
// api
Route::group(['prefix' => 'api'], function () {
Route::get('email', ['as' => 'tagEmailListRoute', 'uses' => 'ApiController#tagEmailList']);
Route::get('contact', ['as' => 'tagContactListRoute', 'uses' => 'ApiController#getTagContactList']);
Route::group(['prefix' => 'data-table'], function () {
Route::get('emails', ['as' => 'emailListDataTableRoute', 'uses' => 'ApiController#emailListDataTable']);
});
});
//end api
Route::controllers([
'auth' => 'Auth\AuthController',
'password' => 'Auth\PasswordController',
]);
My session config:
'driver' => env('SESSION_DRIVER', 'file'),
'lifetime' => 120,
'expire_on_close' => false,
what is the difference between:
Route::post('insert/{slug}/{page_number}/{person_type_id}/{user_id}', function($slug) {
return Response::json(
[
'success' => false,
'slug' => $slug
]);
});
and this:
Route::post(
'{slug}/users/page/{page_number}/insert-ben/{person_type_id}/user/{user_id}',
'PersonsController#insertBen'
);
The first one works. The latter used to work but it's no longer working now. I tried stepping through the code and the latter ends up going to the UsersController#login rather than to PersonsConroller#insertBen. So odd. This was working about a month ago. I'm trying to see what I changed with my version control but it's so strange that it's not working all of a sudden.
My posts are working fine as I can login and the post call to UsersController#doLogin is being called.
I even tested with this call:
Route::post(
'{slug}/users/page/{page_number}/insert-ben/{person_type_id}/user/{user_id}',
'UsersController#insertTest'
);
/controllers/UsersController.php
public function insertTest($slug)
{
if ( Request::ajax() ) {
return Response::json( [
'success' => false,
'slug' => $slug
] );
}
}
But the PersonsController#insertBen doesn't work. My PersonsController is working fine as I can update using this controller. So what could be the problem? Anyone encounter something similar? Why does the route.php call the post on some of Controller#method but not on others? Why does the closure function work but not the Controller#method?
UPDATE
Here's the entire file. I even tested by putting that line close to the top of the file too.
/** ------------------------------------------
* Route binding
* ------------------------------------------
*/
App::bind('Acme\Repositories\Interfaces\IPersonRepository', 'Acme\Repositories\Person\DbPersonRepository');
App::bind('Acme\Repositories\Interfaces\IUserRepository', 'Acme\Repositories\User\DbUserRepository');
App::bind('Acme\Repositories\Interfaces\IPage15Repository', 'Acme\Repositories\Pages\Page15Repository');
/** ------------------------------------------
* Route model binding
* ------------------------------------------
*/
Route::model('user', 'User');
Route::model('comment', 'Comment');
Route::model('post', 'Post');
Route::model('role', 'Role');
/** ------------------------------------------
* Route constraint patterns
* ------------------------------------------
*/
Route::pattern('comment', '[0-9]+');
Route::pattern('post', '[0-9]+');
Route::pattern('user', '[0-9]+');
Route::pattern('role', '[0-9]+');
Route::pattern('token', '[0-9a-z]+');
/** ------------------------------------------
* Admin Routes
* ------------------------------------------
*/
Route::group(array('prefix' => 'admin', 'before' => 'auth'), function()
{
# User Management
Route::get('users/', ['as' => 'admin.users.get.index', 'uses' => 'AdminUsersController#getIndex']);
Route::get('users/index', ['as' => 'admin.users.get.index_page', 'uses' => 'AdminUsersController#getIndex']);
Route::get('users/data', ['as' => 'admin.users.get.data', 'uses' => 'AdminUsersController#getData']);
Route::get('users/{user}/edit_user_by_page/{page_number}', ['as' => 'admin.users.get.edit_user_by_page', 'uses' => 'AdminUsersController#getEditUserByPage']);
# Admin Dashboard
Route::get('/', 'AdminDashboardController#getIndex' );
});
// Confide routes
Route::get('users/create', ['as' => 'confide.users.get.create', 'uses' => 'UsersController#create']);
Route::post('users', ['as' => 'confide.users.post.store', 'uses' => 'UsersController#store']);
Route::get('users/login', ['as' => 'confide.users.get.login', 'uses' => 'UsersController#login']);
Route::post('users/login', ['as' => 'users.login', 'uses' => 'UsersController#doLogin']);
Route::get('users/confirm/{code}', ['as' => 'confide.users.get.confirm', 'uses' => 'UsersController#confirm']);
Route::get('users/forgot_password', [ 'as' => 'users.forgot_password', 'uses' => 'UsersController#forgotPassword' ]);
Route::post('users/forgot_password', ['as' => 'confide.users.post.forgot_password', 'uses' => 'UsersController#doForgotPassword']);
Route::get('users/reset_password/{token}', ['as' => 'confide.users.get.reset_password', 'uses' => 'UsersController#resetPassword']);
Route::post('users/reset_password', ['as' => 'confide.users.post.reset_password', 'uses' => 'UsersController#doResetPassword']);
Route::get('users/resendconfirmationemail', [ 'as' => 'users.resendconfirmationemail', 'uses' => 'UsersController#getResendConfirmationEmail' ]);
Route::post('users/resendconfirmationemail', ['as' => 'confide.users.post.resendconfirmationemail', 'uses' => 'UsersController#postResendConfirmationEmail']);
Route::get('users/logout', ['as' => 'confide.users.get.logout', 'uses' => 'UsersController#logout'])->after('invalidate-browser-cache');
/** ------------------------------------------
* Frontend Routes
* ------------------------------------------
*/
Route::get('{slug}/users/page', ['as' => 'users.page.path', 'uses' => 'UsersController#getPage'])->where('slug', '^\b(ir){0,1}(revocable){1}\b$');
//get page_number
Route::get('{slug}/users/page/{page_number}', ['before' => 'auth', 'as' => 'users.page.page_number', 'uses' => 'PersonsController#index'])->where('slug', '^\b(ir){0,1}(revocable){1}\b$');
//get edit
Route::get('{slug}/users/page/{page_number}/edit', ['before' => ['auth', 'slug' ], 'as' => 'users.page.page_number.edit', 'uses' => 'PersonsController#edit'])->where('slug', '^\b(ir){0,1}(revocable){1}\b$');
//post insert-ben
Route::post('{slug}/users/page/{page_number}/insert-ben/{person_type_id}/user/{user_id}', ['before' => 'auth', 'as' => 'users.page.page_number.insert', 'uses' => 'PersonsController#insertBen'])->where('slug', '^\b(ir){0,1}(revocable){1}\b$');
//post delete-ben
Route::post('{slug}/users/page/{page_number}/delete-ben/{person_type_id}/user/{user_id}/person_id/{person_id}/address_id/{address_id}/ben_id/{ben_id}', ['before' => 'auth', 'as' => 'users.page.page_number.delete', 'uses' => 'PersonsController#deleteBen'])->where('slug', '^\b(ir){0,1}(revocable){1}\b$');
//put update
Route::put('{slug}/users/page/{page_number}/update', ['before' => 'auth', 'as' => 'users.page.page_number.update', 'uses' => 'PersonsController#update'])->where('slug', '^\b(ir){0,1}(revocable){1}\b$');
//get upgrade page when user goes to a page like (page 17 or other pages like page 9 and 10 I think) reserved only for irrevocable registered plans. TODO: get the upgrade View model
Route::get('{slug}/users/upgrade/{_meta}', [ 'as' => 'users.ugprade', 'uses' => 'PersonsController#upgrade' ] )->where('slug', '^\b(irrevocable){1}\b$');
//Paypal post Paypal info to tables paypals, paypal_transactions, pricings and getPaypalBtn
Route::put('paypal_transactions/{slug}/{page_number}/returnpaypalbtn', ['before' => 'auth', 'as' => 'paypal_transactions.returnpaypalbtn', 'uses' => 'PaypalTransactionsController#returnPaypalBtn'])->where('slug', '^\b(ir){0,1}(revocable){1}\b$');
/** ------------------------------------------
* Tests:
* ------------------------------------------
*/
Route::get('users/{username}/page', ['as' => 'users.page.test', 'uses' => 'UsersController#getPageTest']);
Route::get('{slug}/users/show_sql', ['as' => 'users.page.show_sql', 'uses' => 'PersonsController#showSql'])->where('slug', '^\b(ir){0,1}(revocable){1}\b$');
# Index Page - Last route, no matches
Route::get('/', array('before' => 'detectLang', 'uses' => 'UsersController#login'));
Boy, this took a long time to figure out. Thank God! What happened was that I had this line in my Route::filter('csrf', function().
This filter is called before your other Route::[method] so if there are any Route calls in your filter like I had in mine then your defined Route::[method] won't be called. I think by default but not 100% sure:
/app/filters.php
$token = Request::ajax() ? ( Request::header('X-CSRF-Token') ) : Input::get('_token');
Which I ended up getting from http://words.weareloring.com/development/laravel/laravel-4-csrf-tokens-when-using-jquerys-ajax/
It was an ajax call but this Request::header('X-CSRF-Token') was always null.
So I changed that to something more readable and that works.
if ( Request::ajax() )
{
$sRequestHeaderCSRF = Request::header('X-CSRF-Token');
if ( Request::header('X-CSRF-Token') === null || Request::header('X-CSRF-Token') === '' )
{
$token = Input::get('_token');
} else
{
$token = Request::header('X-CSRF-Token');
}
} else
{
$token = Input::get('_token');
}
The other snag was this Input::get('_token') which was returning null too.
I had to pass and, explicitly, name the _token in the data. I was, previously,
passing a serialized array as the data in the jQuery $.ajax. But the calls to
get the _token key name from this data in public function input($key = null, $default = null)
(see below) was not retrieving it from the serialized array; hence, the explicit key being passed as
'_token': oSerializeArray._token.
var oSerializeArray['_token'] = $('input[name="_token"]').val();
$.ajax({
type: action,
cache: false,
dataType: 'json',
url: sUrl,
data: {
'oSerializeArray': oSerializeArray,
'_token': oSerializeArray._token
},
beforeSend: function() {
}
})
.done( function( data, text, jqxhr ) {
data.success;
//data.iPersonsPK;
window.location.replace(sUrlEdit);
})
.fail( function ( data, jqxhr ) {
data.success;
})
.always( function ( data ) {
data.success;
});
Just fyi, Input::get('_token') is called from:
/vendor/illuminate/support/Illuminate/Support/Facades/Input.php
in this function:
public static function get($key = null, $default = null)
{
return static::$app['request']->input($key, $default);
}
and here:
/vendor/laravel/framework/src/Illuminate/Http/Request.php:248
in this function:
public function input($key = null, $default = null)
{
$input = $this->getInputSource()->all() + $this->query->all();
return array_get($input, $key, $default);
}
I had to step through the code.
This is my updated Route::filter('csrf', function():
Route::filter('csrf', function()
{
if ( Request::ajax() )
{
$sRequestHeaderCSRF = Request::header('X-CSRF-Token');
if ( Request::header('X-CSRF-Token') === null || Request::header('X-CSRF-Token') === '' )
{
$token = Input::get('_token');
} else
{
$token = Request::header('X-CSRF-Token');
}
} else
{
$token = Input::get('_token');
}
$sSessionToken = Session::token();
//if the tokens do not match then send to the login page
if (Session::token() != $token) {
return Redirect::to( 'users/login' );
}
});
Also, more fyi, for problems with your routes.php one may look at these files:
/vendor/laravel/framework/src/Illuminate/Routing/Router.php
/vendor/laravel/framework/src/Illuminate/Routing/Route.php
and set break points while looking at your stack calls during debugging.
BTW, I read that one can use this to set the X-CSRF token in the headers of your ajax calls with this:
$.ajaxSetup({
headers: {
'X-CSRF-Token': $('meta[name="_token"]').attr('content')
}
});
The above is referenced from http://words.weareloring.com/development/laravel/laravel-4-csrf-tokens-when-using-jquerys-ajax/
I'm wondering if Taylor Otwell has some info on the architechtural design and explanations of the framework.
I was going to read about Symfony but not sure if will help me more thoroughly understand the underpinnings of Laravel.
I know there is the Laravel API docs which is helpful but something more like a study of the design. Any ideas?
I've having a weird issue than I don't fully understand...
Here is my route:
Route::get('/app/signin', array( 'as' => 'account-login', 'uses' => 'AccountController#getLogin' ));
Which works great. However, when I loose the /app part I get an error. If I change it to
Route::get('/signin', array( 'as' => 'account-login', 'uses' => 'AccountController#getLogin' ));
I get the following error:
* #throws \Symfony\Component\HttpKernel\Exception\HttpException
* #throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException
*/
public function abort($code, $message = '', array $headers = array())
{
if ($code == 404)
{
throw new NotFoundHttpException($message);
}
else
Any help would be greatly appreciated
** UPDATE 1 **
Here is my full list of routes:
// ALL PUBLIC ACCESS ROUTES
Route::get('/', array( 'as' => 'home', 'uses' => 'HomeController#home' ));
Route::get('/{username}', array( 'as' => 'profile-user', 'uses' => 'ProfileController#user' ));
// UNAUTHENTICATED GROUP (GUEST - PUBLIC ACCESS WITH FORMS AND SIGNUP)
Route::group(array('before' => 'csrf'), function() {
Route::post('/app/create', array( 'as' => 'account-create-post', 'uses' => 'AccountController#postCreate' ));
Route::post('/app/login', array( 'as' => 'account-login-post', 'uses' => 'AccountController#postLogin' ));
Route::post('/app/forgot-password', array( 'as' => 'account-forgot-password-post', 'uses' => 'AccountController#postForgotPassword' ));
});
Route::get('/app/forgot-password', array( 'as' => 'account-forgot-password', 'uses' => 'AccountController#getForgotPassword' ));
Route::get('/app/recover{code}', array( 'as' => 'account-recover', 'uses' => 'AccountController#getRecover' ));
Route::get('/app/signin', array( 'as' => 'account-login', 'uses' => 'AccountController#getLogin' ));
Route::get('/app/create', array( 'as' => 'account-create', 'uses' => 'AccountController#getCreate' ));
Route::get('/app/activate/{code}', array( 'as' => 'account-activate', 'uses' => 'AccountController#getActivate' ));
// AUTHENTICATED GROUP (WHEN USER IS LOGGED IN)
Route::group(array('prefix' => 'app', 'before' => 'auth'), function() {
Route::group(array('before' => 'csrf'), function() {
Route::post('/change-password', array( 'as' => 'account-change-password-post', 'uses' => 'AccountController#postChangePassword' ));
});
Route::get('/change-password', array( 'as' => 'account-change-password', 'uses' => 'AccountController#getChangePassword' ));
Route::get('/signout', array( 'as' => 'account-sign-out', 'uses' => 'AccountController#getSignOut' ));
});
Route::get('/{username}', array( 'as' => 'profile-user', 'uses' => 'ProfileController#user' ));
Is the problem, I would suggest to clarify this route with prepending something to it, or put it to the bottom of the routes, so other defined one-word routes get catched first with their respective controllers.
It is also advisable to insert a regular expression (modify to suit your needs)
Route::pattern('username', '[a-z]+')
before that route or use where clause like this
Roue::get( /* username */ )->where('username', '[a-z]+');
This approach should be used on every route parameter, for more control over the Routes and data manipulation.
Side note
Prevent users to have usernames with other one-word routes you have, because they will not be accessible, as user #BarryWalsh suggested.
That does seem strange, but as a start I'd try seeing if removing the preceeding slashes from the target URI (so '/signin' becomes 'signin') fixes the issue as these aren't necessary.