Совместное использование моделей CI между различными приложениями

#php #model-view-controller #codeigniter #mobile #codeigniter-2

#php #модель-представление-контроллер #codeigniter #Мобильный #codeigniter-2

Вопрос:

Я все еще пытаюсь найти способ запустить мобильный сайт. У меня есть веб-приложение в CodeIgniter, и я хотел бы создать его мобильную версию. Однако я не хочу переписывать слишком много своего кода, особенно мои модели.. (Поскольку они возвращают необработанные данные, которые я могу использовать где угодно.)

Я хочу запустить свой мобильный веб-сайт на поддомене ( m.mydomain.tld ). Настольная версия выполняется по адресу www.mydomain.tld . Я попытался указать поддомен в папке моего приложения CI; когда появляется мобильный браузер www.mydomain.tld , я перенаправляю его на m.mydomain.tld . Этот поддомен, как я уже сказал, указан в папке моего приложения CI; затем я обслуживаю контроллеры и представления, оптимизированные для мобильных устройств.

Однако! Как указано в app/config/config.php , base_url моего приложения является:

$config['base_url'] = 'http://www.mydomain.tld/';

Итак, перенаправление на m.mydomain.tld на самом деле не работает, потому что я все еще перенаправляюсь на www , а я этого не хочу, даже если затем он делает то, что я хочу, чтобы он делал.

Способ, которым я пытаюсь решить эту проблему, заключается в создании двух папок приложений с разными контроллерами / представлениями, но общими моделями и т.д. Итак, я пытаюсь найти способ реструктурировать мое приложение CodeIgniter, чтобы я мог совместно использовать свои модели и «пользовательский контроллер» (MY_Controller), а также некоторые пользовательские библиотеки / помощники между различными приложениями.

Я надеюсь, что это понятно, если нет, я с удовольствием объясню подробнее, что я ищу. Большое спасибо!

Комментарии:

1. Добавьте другой вид к моделям для своей мобильной версии, а не создавайте совершенно новое приложение. Я никогда не использовал CI, но это входит в пакет с agavi.org В конце концов, в этом весь смысл архитектуры MVC.

2. Уточняю мой вопрос, почему я не думаю, что это возможно. Спасибо!

3. О, я понимаю вашу проблему. Вам нужно сделать ваш конфигурационный файл чувствительным к местоположению, в котором работает ваше приложение.

Ответ №1:

Возможно, вам стоит взглянуть на новую функцию CodeIgniter 2.0: package.

Пакеты позволяют совместно использовать библиотеки, модели и т.д. с помощью :

 $this->load->add_package_path('/usr/local/codeigniter/shared');
  

Читать это:
http://philsturgeon.co.uk/blog/2010/04/codeigniter-packages-modules

Надеюсь, это поможет.

Комментарии:

1. Спасибо. Я обязательно проверю это, честно говоря, не слышал об этом. Похоже, это может быть то, что мне нужно.

Ответ №2:

В config.php замените $config['base_url'] = 'http://www.mydomain.tld/'; этим:

 if(isset($_SERVER['HTTPS']) and 'on' === $_SERVER['HTTPS']) {
    $config['base_url'] = 'https://';
} else {
    $config['base_url'] = 'http://';
}
$config['base_url'] .= $_SERVER['SERVER_NAME'] . '/';
  

Это приведет к получению URL-адреса из переменных среды Apache / server, поэтому, если вы получаете доступ к сайту через поддомен, он будет использовать URL-адрес поддомена, или если вы получаете к нему доступ через корневой домен, он будет использовать корневой домен.

Я не эксперт в CI, поэтому, возможно, есть другие способы, но это самое простое решение, о котором я знаю.

Комментарии:

1. На самом деле это то, что делают последние версии CI, чтобы (наконец) угадать базовый URL, если он не установлен. (Хотя это немного отличается)

Ответ №3:

Я думаю, что правильный способ решить эту проблему — просто создать новый набор контроллеров и представлений (предназначенных для мобильных устройств) в вашем существующем веб-приложении. Затем просто определите маршруты для новых «мобильных» контроллеров (возможно, вам также следует добавить префикс «m /» или «mobile /» для каждого из маршрутов), и это все.

Обновить:

Хорошо, я понимаю. Я рекомендую вам сделать это таким образом:

  1. Сначала создайте эту запись в config.php:

     $config["mobile_base_url"] = "http://m.yoursite.tld/";
      
  2. Затем создайте свой url_helper, добавьте функцию mobile_site_url(), которая была бы аналогом функции CI site_url() (вам понадобится это для ссылок в представлениях и контроллерах).

  3. Создавайте мобильные представления и контроллеры, определяйте маршруты для них с префиксом «m /».

  4. Сделайте небольшой взлом .htaccess для перезаписи URL, описанный на этой странице форума http://www.webmasterworld.com/apache/3509887.htm , чтобы все запросы к m.yoursite.tld/… перешел бы на ваш сайт.tld /m /…

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

Надеюсь, это поможет.

Комментарии:

1. Вам не нужен целый новый набор контроллеров, просто новые представления. К контроллеру был бы просто добавлен дополнительный метод, позволяющий мобильному устройству указывать на правильный вид. Опять же, я не знаю, действительно ли CI является MVC.

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

3. Я не думаю, что CI — это НЕ MVC, просто ему все равно, как вы кодируете. Если ваши разработчики обычно не работают в MVC, ваш CI-код в конечном итоге не будет выглядеть как MVC.