Codeigniter:从网址放置变量的位置

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?

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);
}

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