Motive
Motive

Reputation: 3111

Codeigniter: Where to put the variable from a url

I am developing a stats site in Codeigniter locally. I have a url like localhost/sitename/player/show_profile/PlayerName

I currently have the following:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Player extends CI_Controller
{

  public function __construct()
  {
    parent::__construct();
    $this->load->model('player_model');
    $player_name = $this->uri->segment(3);
  }


  public function index()
  {
        echo "index";
  }

  public function show_profile($player_name)

  {

        $data['player_stats'] = $this->player_model->get_stats( $player_name );
        $this->load->view('player/player_stats', $data);
  }

}

?>

This works, but my question is regarding the $player_name variable. I have $player_name = $this->uri->segment(3); in the __construct so it's available to all of the class methods. Is this the way I should be doing it?

Is this safe?

Upvotes: 1

Views: 170

Answers (2)

Birdman
Birdman

Reputation: 724

Fist of all, there is no point in assigning the variable in the constructor because it's going to get overwritten. When you pass CI a url like localhost/sitename/player/show_profile/PlayerName, anything passed the method (i.e. PlayerName) get's set as the parameters. Therefore, your variable in

public function show_profile($player_name){

is already set when you get to your method code.

Secondly, I agree with Peter's:

protected $player_name;

for making it globally accessible in the controller. BUT, I don't agree with setting it in the constructor. If you have another method in this controller that passes a variable in that spot, you're going to get the wrong data in there. Set it in the method you called:

public function show_profile($player_name){

    $this->player_name = $player_name;

    $data['player_stats'] = $this->player_model->get_stats( $player_name );
    $this->load->view('player/player_stats', $data);
}

Upvotes: 4

Pete
Pete

Reputation: 59

What you could do is define a class variable called $player_name and in the constructor set this to segment(3).

class Player extends CI_Controller

{

protected $player_name;

public function __construct() {
    parent::__construct();
    $this->load->model( 'player_model' );
    $this->player_name = $this->uri->segment( 3 );
}

public function index() {
    echo "index";
}

public function ( show_profile ) {

    $data['player_stats'] = $this->player_model->get_stats( $this->player_name );
    $this->load->view( 'player/player_stats', $data );
}

}

This way will be able to access the $play_name variable anywhere in the class.

You could also check to see if it's set using the $this->uri->uri_to_assoc(n) method and check to see if the key/value isset() http://codeigniter.com/user_guide/libraries/uri.html.

Peter

Upvotes: 1

Related Questions