user3150060
user3150060

Reputation: 1745

Laravel Error : ErrorException Missing argument 1?

I am using Laravel 4 and I am getting ERROR: when I visit admin/profile/: Missing argument 1 for AdminController::getProfile()

My AdminController code :

public function getProfile($id) {
    if(is_null($id)) Redirect::to('admin/dashboard');
    $user = User::find($id);
    $this->layout->content = View::make('admin.profile', array('user' => $user));
}

My routes.php :

Route::controller('admin', 'AdminController');

My admin/profile (blade) view :

@if(!is_null($user->id)) 
{{ $user->id }} 
@endif 

How could I fix this? I want when they go to admin/profile without ($id) to redirect to dashboard.

Upvotes: 0

Views: 1586

Answers (2)

Antonio Carlos Ribeiro
Antonio Carlos Ribeiro

Reputation: 87719

You told Laravel that your getProfile method has one parameter:

public function getProfile($id) {

}

If you want to a request to succeed, you have to pass it in your URL:

http://appdev.local/admin/profile/1

If you want to see it fail (redirect to dashboard), you'll have to add a default value to your function argument:

public function getProfile($id = null) { ... }

But you better add this value to it anyway, since you can have bots (or even people) trying to access that route without the parameter.

Your view is too generic too, you have to check if your $user is set:

@if(isset($user) && !is_null($user->id)) 
    {{ $user->id }} 
@endif

As noted in the comments, the line

if(is_null($id)) Redirect::to('admin/dashboard');

Must have a return:

if(is_null($id)) return Redirect::to('admin/dashboard');

About sharing the user to your layout, the problem is that your getProfile($id) is already passing a $user to your view, so what you could do is to add this to your __construct():

if (Auth::check()) 
{ 
    $user = Auth::getUser(); 
    View::share('loggedUser', $user);
}

And in your view:

@if(isset($user) && !is_null($user->id)) 
    {{ $user->id }} 
@else
    {{ $loggedUser->id }} 
@endif

About the user not found problem, you have many options, this is one:

public function getProfile($id) {

if (is_null($id)) 
{
    return Redirect::to('admin/dashboard');
}

if ($user = User::find($id)) 
{
    $this->layout->content = View::make('admin.profile', array('user' => $user));
}
else
{
    return Redirect::to('admin/dashboard')->withMessage('User not found');
}

Upvotes: 2

user2629998
user2629998

Reputation:

Try setting a default null value to $id like this :

public function getProfile($id = null) {
   ...
}

Upvotes: 1

Related Questions