Шаблоны проектирования PHP: несколько сайтов в одном скрипте - PullRequest
2 голосов
/ 22 ноября 2011

Какие решения, шаблоны обычно используются для этого?

Я хочу избавиться от операторов if / else в моих контроллерах, моделях и т. Д.

Например:

if($domain==1) {
// do this
}
elseif($domain==2) {
// do this
}
elseif...

Хочу избавиться от этого безумия.Не представляю, что будет в беспорядке, когда будет хотя бы 20 сайтов.

В настоящее время я использую файлы конфигурации и маршрутизации для каждого домена.Но этого недостаточно.

Не могу избавиться от этого беспорядка внутри моделей и контроллеров.

Я думал о каком-то типе заполнителей и отдельном статическом классе для каждого домена с методом для этих заполнителей.+ магические вызовы.

Например, у меня есть действие внутри контроллера:

public function postAction(){

$model=new Model();
$this->view->data=$model->get($placeholder_generates_and_return_settings_array); // else default is used

// custom placeholder
// execute custom class method if it's exist

// some model again

// custom placeholder
// execute custom class method if it's exist 

// etc

}

Текущее представление предоставляется внутри заполнителей Класс, типы могут быть назначены.Как изменение данных, генерация конфигурации для модели и т. Д.

Как бы вы решили эту проблему с несколькими доменами, не клонируя контроллеры, модели или создавая многочисленные операторы if / elseif для каждого домена внутри них?

ОБНОВЛЕНИЕ

Как описать то, что мне нужно.Я пытаюсь создать многоразовые контроллеры с логикой по умолчанию.Просто заполнение / MIXING контроллера связанной с доменом логикой в ​​требуемых местах (заполнителях), модификация данных и т. Д. Возможно что-то вроде шаблона контроллера, существуют ли какие-либо шаблоны?

Обеспечение заполнителя всеми необходимыми (CURRENT) данными для его модификации, еслитребуется или дальнейшая обработка и возврат обратно.

Думаю, мне придется создать свой собственный "велосипед".: D

Ответы [ 5 ]

4 голосов
/ 22 ноября 2011

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

Ваша структура класса будет выглядеть следующим образом:

    class yourClass
    {
        protected $_strategy;

        public function setStrategy($strategy)
        {
            $this->_strategy = $strategy;
        }

        public function showYourData()
        {
            return $this->_strategy->show($this)
        }
    }

Для каждого домена вы создаете отдельный класс стратегии следующим образом:

    class domainStrategy
    {
        public function show(yourClass $yourClass)
        {
             // Get your classdata here
             $data = $yourClass->whateverFunctionYouNeed();
             // Do what you want for this domain
             return $output;
        }
    }

Надеюсь, это поможет вам начать работу, я уверен, что вы сможете найти больше документации для стратегии, когда вам это нужно

2 голосов
/ 22 ноября 2011

Предлагаю создать диспетчер, который загружает информацию на основе критериев домена.

Что-то вроде:

dispatch.php

<?php
...
$domain = get_domain_function(); // here you may automate the domain retrieval
include ('controllers/' . $domain . '.php')
...

?>

controllers / domain1.php ... controllers / domainn.php

<?php
...
do the domain specific business logic here

...
?>
0 голосов
/ 22 ноября 2011

Хочешь избавиться от этого безумия. Не представляю, что будет в беспорядке, когда будет хотя бы 20 сайтов.

С какой стати вы бы поместили 20 сайтов в 1 проект ???

Просто используйте отдельный vhosts, если вы используете Apache.

http://httpd.apache.org/docs/2.0/vhosts/examples.html

Другие веб-сервисы также имеют эту функцию (хотя они могут иметь другое имя).

Если вы хотите предотвратить, вам нужно скопировать общие / общие функциональные возможности в ваших проектах.

Просто настройте некоторую форму библиотеки и с общими функциями, которые вы используете в своих различных проектах.

Если вы посмотрите на шаблон MVC http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller, вы можете даже иметь некоторые представления по умолчанию в вашей библиотеке для использования проектами (при необходимости их можно переопределить, конечно).

0 голосов
/ 22 ноября 2011

Есть папка для каждого домена.

Когда пользователь заходит на веб-сайт (возможно, на страницу contactus.php), эта страница проверяет, есть ли соответствующий файл contactus.php в папке домена.Если он есть, он будет включать этот файл, в противном случае он будет вести себя по умолчанию.

0 голосов
/ 22 ноября 2011

if($domain==1) {
// do this
}
elseif($domain==2) {
// do this
}
elseif...

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

Могу предположить, что вы хотели бы установить некоторые переменные, например настроить сеанс, возможно, создать какой-либо другой объект (базу данных) с другими параметрами или установить некоторые переменные в шаблоне.

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

class Controller
{
    public abstract function DoAction1();

    // Group shared functionality, call it with different parameters
    public function ShowHomePage($view)
    {
       $template->assign('view', $view);
    }
}

class Domain1Controller extends Controller
{
    public function DoAction1()
    {
       // do this
    }
}

class Domain2Controller extends Controller
{
    public function DoAction1()
    {
       // do this
    }
}

А в своем телефонном коде (маршрутизаторе) вы просто звоните Controller->ShowHomePage($view) или Controller->DoAction1() или как угодно, но только после того, как определили, в каком домене вы находитесь и на какой контроллер вы хотите обратиться.

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