Laravel 4 clean code review of users controller and model, trying to maintain MVC structure
I didn't used PHP in the last few years, so just some generic notes:


The $input parameter of insertUserIntoDatabase($input) is unused. I guess you wanted to use the parameter instead of direct Input:: calls inside the function.
You could use a guard clause in insertUserIntoDatabase to make the code flatten:

public function insertUserIntoDatabase($input)
{
    $validation = new Services\Validators\Users;

    if (!$validation-&gt;passes()) {
        $this-&gt;errors = $validation-&gt;errors;
        throw new ValidationError($validation-&gt;errors);
    }

    $user = new User;
    $user-&gt;firstname = Input::get('firstname');
    $user-&gt;lastname = Input::get('lastname');
    $user-&gt;email = Input::get('email');
    $user-&gt;password = Hash::make(Input::get('password'));
    $user-&gt;save();
}

The fields in the User class are protected. You might want to use private instead. See: Should I always use the private access modifier for class fields?; Item 13 of Effective Java 2nd Edition: Minimize the accessibility of classes and members.
In postRegister() you could move the return inside the try block. I guess Redirect::to doesn't throw any ValidationError exceptions, so the following is the same:

public function postRegister()
{
    try 
    {
        $this-&gt;user-&gt;insertUserIntoDatabase(Input::all());
        return Redirect::to('admin/login')
            -&gt;with('message', 'Thank you for creating a new account');
    } 
    catch (ValidationError $e) 
    {
        return Redirect::to('admin/register')
        -&gt;with('message', 'Something went wrong')
        -&gt;withInput()   
        -&gt;withErrors($e-&gt;getErrors());
    }
}

if (Auth::attempt(array('email' =&gt; Input::get('email'), 'password' =&gt; Input::get('password') ))){
    return Redirect::to('admin/dashboard')-&gt;with('message', 'Thanks for logging in');
}


I would create an explanatory local variable for the array for better readability:

$credentials = array(
    'email' =&gt; Input::get('email'), 
    'password' =&gt; Input::get('password') 
);
if (Auth::attempt($credentials)) {
    return Redirect::to('admin/dashboard')-&gt;with('message', 'Thanks for logging in');
}


(Clean Code by Robert C. Martin, G19: Use Explanatory Variables;  Refactoring: Improving the Design of Existing Code by Martin Fowler, Introduce Explaining Variable)