2013-11-10 4 views
0

Я новичок в Codeigniter, хотя у меня есть около 2 лет опыта работы с PHP. Я прошел через документацию Codeigniter, и я создал несколько простых примеров, но теперь я перехожу к реальному проекту, и я хочу убедиться, что я ухожу на правую ногу.Каков правильный способ включения классов/контроллеров/библиотек в CodeIgniter?

В этом разделе: Я создаю одностраничное игровое приложение, и на этой странице будет много динамических/DB-данных. Я создал контроллер и представление для страницы, до сих пор все это очень просто:

//controller (application/controllers/main.php) 
class Main extends CI_Controller { 

    public function index() 
    { 
      $this->load->model('Model');  //load DB abstraction model 
      $this->load->helper('url');  //load URL helper (base_url() function etc) 

      $data = array("somestuff","otherstuff");//some general data for the page 

     $this->load->view('header'); 
     $this->load->view('mainview', $data); 
     $this->load->view('footer'); 
    } 
} 

//view (application/views/mainview.php) 
<div id="container"> 
    <div id="tab1"> 
     some data related to logged in user 
    </div> 
    <div id="tab2"> 
     some data related to game 
    </div> 
</div> 

Теперь вы видите, мы можем разделить данные, которые должны отображаться на странице на две группы - пользовательские данные и Данные Приложения. Естественным ООП подход будет заключаться в следующем:

1) создать один класс пользователя и использовать функцию в том, что для извлечения и отображения пользовательских данных (загрузка модели, а так как мы используем MVC)

2) создать один или несколько классов, связанных с игрой, и использовать их для расчета и отображения текущих игровых данных.

Для простоты предположим, что мне нужен только один класс игры.

У меня возникли проблемы с тем, что я думаю о правильном подходе CodeIgniter к этому. В руководстве пользователя упоминаются созданные пользователем библиотеки, созданные пользователем контроллеры и созданные пользователем классы. Библиотеки для меня немного путают, так как я не понимаю, как они здесь меняются.

Поскольку у меня уже есть контроллер для страницы (я думаю, что это естественный подход, но, пожалуйста, поправьте меня, если я ошибаюсь), как мне интегрировать классы User/Game? У меня есть несколько конкретных вопросов, которые помогут мне понять это прямо в моей голове.

1) Должны ли пользователи/игры быть новыми контроллерами, расширяющими CI_Controller?

2) Следует ли размещать классы в каталоге «библиотеки» или непосредственно в контроллере?

3) Какое отношение они должны иметь к Главному контроллеру (при условии, что я был прав в создании его в первую очередь)?

ответ

1

Предлагаю вам несколько подсказок.

Из моего опыта и того, что я видел:

контроллер используется, когда служат отформатированные данные, такие как текст, JSON, HTML и т.д.
Или используется, когда принимать входные сигналы и перенаправить на другую страницу eventualy.
Контроллер может использовать некоторые методы, используемые другими методами для форматирования или проверки некоторых данных.

Библиотеки могут быть мостом между контроллерами и моделями.
Они работают с моделями или другими библиотеками или только с родным PHP.
Обычно библиотеки работают с данными, полученными контроллерами, и передают их на модели после некоторой проверки или работы с ними.

Библиотеки могут быть также классами, представляющими сущность, вам необходимо создать его как $Obj = new SomeObject() (вы должны включить файл класса).
В этом случае шаблон Singleton не используется.

  • Так что, если ваш контроллер получить вход credit_brought
  • это проверить, если credit_brought это число (eventualy)
  • его называют надлежащий метод класса $User->add_credit()
    • Этот метод может подняться исключение, если credit_brought является а не номер
    • он может сделать некоторые проверки как «этот пользователь заработал достаточно кредита за этот час»
    • Этот метод можно назвать моделируют $this->user_model->add_credit()
      • Чтобы сделать SQL-запрос, например: $this->db->set('credit', 'credit +'.$credit, FALSE)->where('id', $userid)->update('users')
  • Когда все сделано, $User->add_credit() вернуть некоторую реакцию (логическое значение в этом случае) к контроллеру
  • Контроллер возвращает соответствующие данные клиенту (view или ajax response или ..)

Я не уверен, был ли я понятен с моим бедным английским языком ..

В CI документ, читать Введение и Общие темы страницы, которые вы можете найти в оглавлении

Пожалуйста, поправьте меня, если вы видите какие-либо орфографические ошибки.

+0

Итак, если я правильно понимаю (с упором на пользователя, например), вы говорите, что я должен создать класс пользователя в качестве библиотеки, а затем создать объект '$ User' в MainController и использовать методы пользователя оттуда вернуть необходимые данные? – jovan

+0

Да, но создайте объект, если у вас несколько «Пользователь», как массив объекта «Пользователь», в другом случае загрузите класс с помощью CI Loader. – Aurel

+0

Пользователь - зарегистрированный пользователь, поэтому в любой момент времени есть только один. – jovan

1

Я думаю, что лучше отделить Игровой и Пользовательский контроллер, поскольку они представляют разные ресурсы. Но чтобы ответить на ваши вопросы от пуль:

  1. Да UserController и GameController должны распространяться CI_Controller, чтобы иметь возможность отвечать на входящие запросы, которые приходят из фронта-контроллера.
  2. По умолчанию они помещаются в папку контроллеров.
  3. Ну, метод index() метода MainController создает объекты JS, которые будут взаимодействовать с методами UserController и GameController с использованием запросов AJAX.
+0

Спасибо. Но я не уверен, что понимаю # 3. Давайте оставим сторону клиента из этого на данный момент, пожалуйста, предположите, что нет AJAX, просто все данные, сгенерированные через PHP, и вставлены в шаблон. Если я создам два новых контроллера, тогда как лучше всего связать их с MainController? Должен ли я использовать их методы из MainController в некотором роде? – jovan

+0

Я не уверен, что вы подразумеваете под «associate». Не могли бы вы подробнее рассказать? –

+0

К сожалению, я имею в виду, что в этом случае MainController должен иметь возможность использовать методы UserController, не так ли? Итак, должен ли я создать объект $ User в MainController, загрузив класс User, а затем использовать его? – jovan

Смежные вопросы