Я сделал нечто подобное, используя торт 1.3 год назад
В этом решении есть 4 основных шага:
- Имейте модель Домена и данные о доменах, которые записывают все возможные пользовательскиедомены и представления для ваших пользователей, чтобы ввести свои собственные домены
- создать код проверки домена в beforeFilter в AppController и сохранить данные пользователя в сеансе
- действие контроллера, отвечающее за просмотр общедоступного профиля, должноссылаются на те же пользовательские данные, которые сохраняются в сеансе
- ваши пользователи должны правильно настроить записи CNAME и A со своими регистраторами доменов
Шаг 1 Модель домена и данные
Что я сделал, так это то, что у меня была таблица, называемая доменами
. Каждый домен содержит веб-адрес, который, как я предполагал, был просто http: //....
Домен принадлежит пользователю
Пользователь имеет много доменов
domains
==========
id web_address user_id main
основной - это tinyint, который указывает, является ли это основным URL-адресом, который будет использоваться после насУ него есть много доменов.
, поэтому пользователь должен создать новую запись или более для домена.
Шаг 2 Код в beforeFilter AppController, чтобы выяснить, какой общедоступный профильdisplay Далее ваш код должен иметь возможность извлекать идентификатор пользователя на основе URL-адреса, отправляемого при каждом запросе http.
Пользователь с этого момента ссылается на пользователя, чей общедоступный профильрассматривается.НЕ путайте это с зарегистрированным пользователем, если он у вас есть.
Я предлагаю сделать это в вашем beforeFilter из AppController.
Что-то вроде этого
$currentUser = $this->User->getByDomain(FULL_BASE_URL);
$this->Session->write('CurrentUser', $currentUser);
Код для модели getByDomain for User также является для вас упражнением.Должно быть достаточно легко, учитывая, что я объяснил схему для доменов
Возможно, вам придется проверить текущее значение UserUser внутри ваших данных Session перед записью currentUser, потому что вы не хотите писать данные Session все время, особенно когдапосетитель посещает одну и ту же веб-страницу снова и снова.
Вам может потребоваться изменить приведенный выше фрагмент кода на что-то вроде этого:
$currentUser = $this->Session->read('CurrentUser');
if(empty($currentUser) OR (!$this->checkUrlAgainstDomain(FULL_BASE_URL, $currentUser['Domain']['domain']))) {
$currentUser = $this->User->getByDomain(FULL_BASE_URL);
$this->Session->write('CurrentUser', $currentUser);
}
Снова функция checkUrlAgainstDomain является для вас упражнением.
Шаг 3 Введите код beforeFilter в AppController, чтобы выяснить, какой общедоступный профиль отображать Вы будете использовать данные CurrentUser, сохраненные в сеансе, для определения общедоступной страницы пользователя, которую вы хотите отобразить.
Я оставляю это как упражнение для вас, чтобы выяснить в вашем UsersController под видом действия
Шаг 4, ваши пользователи должны ввести следующее в регистраторах своих доменов Тогда ваши пользователи должныпойти к своим регистраторам доменов и сделать то же самое, что иПользователи BandCamp в часто задаваемых вопросах, с которыми вы связались.
Пользовательский поддомен "www" должен указывать с помощью CNAME на example.Lucho.com
User'sКорневой домен (без www) должен иметь запись A, указывающую на IP-адрес вашего сервера, т.е. где ваш Lucho.com находится в
Пользователь должен добавить обе эти страницы управления доменами.как объяснено ранее на вершине.Для полного обновления домена может потребоваться до 48 часов.