Codeigniter Routing - слишком много используете? - PullRequest
1 голос
/ 21 февраля 2012

Я новичок в Codeigniter и пытаюсь привыкнуть к нему, преобразовав старый сайт в CI.

Одна вещь, которую я с трудом понимаю, это маршрутизация. Если я не хочу, чтобы моя структура URL была похожа на / controller / method / id, я должен изменить ее на что-то вроде $route['controller/(:num)'] = "controller/method/$1"; в rout.php. Это просто кажется мне неэффективным, есть ли что-то еще, что я должен делать?

Например, на моем сайте URL / game / 4242 и / player / SomeDude

1 Ответ

7 голосов
/ 22 февраля 2012

Ну, маршрутизация эффективна - альтернатива переназначение ваших контроллеров .

Давайте рассмотрим обе возможности.

Воображаемая ситуация: Позже вы захотите позволить своим пользователям показывать значки / медали / достижения / что-то в своем профиле.

С помощью маршрутизации вы можете добиться этого следующим образом:

$route['player/(:any)/(:any)'] = "player/show_$2/$1";
$route['player/(:any)'] = "player/show_profile/$1";

И ваш контроллер может выглядеть так:

class Player extends CI_Controller
{
  public function show_profile( $username )
  {
    // the profile info
  }

  public function show_badges( $username )
  {
    // the profiles badges
  }

  public function show_scores( $username )
  {
    // the profiles scores
  }
}

}

По сути, это позволяет вам просто добавить другой метод в вашем контроллере с префиксом метода с помощью show_ (например, public method show_friends( $username )), и вы можете получить к нему мгновенный доступ, перейдя в / player / SomeDude / friends

Если посмотреть на альтернативу , переназначение вашего контроллера позволит вам не использовать маршруты, а написать контроллер следующим образом:

class Player extends CI_Controller
{

  public function _remap($username, $params = array())
  {
    if(empty($username))
      show_404();

    $this->user = $this->user_model->find($username);

    if(count($params) == 0)
      $method = 'index';
    else
      $method = $params[0];

    unset($params[0]); //No need to send the method along as a parameter

    $method = 'process_'.$method;
    if (method_exists($this, $method))
    {
      return call_user_func_array(array($this, $method), $params);
    }
    show_404();
  }

  public method process_index()
  {
    // the profile info
  }

  public method process_badges()
  {
    // the profiles badges
  }

  public method process_scores()
  {
    // the profiles scores
  }

}

Лично мне нравится маршрутизация. Я думаю, что это прозрачно и заставляет мои контроллеры выглядеть чище.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...