Перейти на Zend Framework или Django для модульного веб-приложения? - PullRequest
1 голос
/ 28 октября 2009

Я использую Zend Framework и Django, и у них обоих есть свои сильные и слабые стороны, но оба они по-своему хороши.

Я хочу создать высокомодульное веб-приложение, как в следующем примере:

  • модули:
    • Администратор
      • К
        • Статья
        • секции
      • ...
        • ...
          • ...

Я также хочу, чтобы все модули были автономными со всеми файлами confid и template.

Я искал способ решить эту проблему в последние дни, но добавление одного уровня омера в настройку модуля не кажется правильным. Я уверен, что это можно сделать, но я должен? Я также включил Doctrine в мое Zend-приложение, которое может вызвать еще больше проблем при настройке моего модуля!

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

Итак, я думаю, вопрос в том, что имеет наибольшую ценность; быстрая модульная разработка и варианты хостинга!

Ну, комментарии приветствуются!

Спасибо

Ответы [ 2 ]

4 голосов
/ 28 октября 2009

Вы можете реализовать субмодули с относительно небольшими усилиями в ZF. Допустим, у вас есть структура каталогов, такая как:

application/
  modules/
    admin/
      cms/
        controllers/
        views/
      controllers/
      views/

Вы бы зарегистрировали такие модули в своей начальной загрузке (субмодули используют _ для отделения субмодуля от основного модуля):

$frontController->setControllerDirectory(array(
    'default'   => APPLICATION_PATH . '/modules/default/controllers',
    'admin'     => APPLICATION_PATH . '/modules/admin/controllers',
    'admin_cms' => APPLICATION_PATH . '/modules/admin/cms/controllers'
));

Проблема с этим заключается в том, что он будет использовать подчеркивание в URL-адресе вместо косой черты, например, «admin_cms / conteroller / action» вместо «admin / cms / controller / action». Хотя это «работает», это не красиво. Одним из способов решения этой проблемы является предоставление собственного маршрута для маршрута по умолчанию. Так как стандартный Zend_Controller_Router_Route_Module делает это почти правильно, вы можете просто расширить его и добавить требуемое поведение:

<?php

class App_Router_Route_Module extends Zend_Controller_Router_Route_Module
{
    public function __construct()
    {
        $frontController = Zend_Controller_Front::getInstance();
        $dispatcher = $frontController->getDispatcher();
        $request = $frontController->getRequest();
        parent::__construct(array(), $dispatcher, $request);
    }

    public function match($path)
    {
        // Get front controller instance
        $frontController = Zend_Controller_Front::getInstance();

        // Parse path parts
        $parts = explode('/', $path);

        // Get all registered modules
        $modules = $frontController->getControllerDirectory();

        // Check if we're in default module
        if (count($parts) == 0 || !isset($modules[$parts[0]]))
            array_unshift($parts, $frontController->getDefaultModule());

        // Module name
        $module = $parts[0];

        // While there are more parts to parse
        while (isset($parts[1])) {
            // Construct new module name
            $module .= '_' . $parts[1];

            // If module doesn't exist, stop processing
            if (!isset($modules[$module]))
                break;

            // Replace the parts with the new module name
            array_splice($parts, 0, 2, $module);
        }

        // Put path back together
        $path = implode('/', $parts);

        // Let Zend's module router deal with the rest
        return parent::match($path);
    }
}

А в твоей начальной загрузке:

$router = Zend_Controller_Front::getInstance()->getRouter();
$router->addRoute('default', new App_Router_Route_Module);

Что это делает, так это обходить путь до тех пор, пока он находит модуль, и прозрачно переписывает путь так, чтобы по умолчанию Zend_Controller_Router_Route_Module мог выполнять реальную работу. Например, следующий путь: «/ admin / cms / article / edit» будет преобразован в «/ admin_cms / article / edit», что позволяет стандартному соглашению ZF «: module /: controller /: action» делать магию .

Это позволяет вам иметь хорошую модульную структуру с автономными модулями, в то же время используя красивые логические URL-адреса. Одна вещь, которую вы хотите отметить, это то, что если вы используете Zend_Navigation и определяете элементы навигации с помощью параметров модуля / контроллера / действия, вы должны указать ZF, как правильно построить URL, используя «/» вместо «_» в именах модулей. (по умолчанию ZF использует спецификацию: module /: controller /: action при создании URL-адресов). Вы можете сделать это, реализовав свой собственный Zend_Controller_Action_Helper_Url, например:

<?php

class App_Router_Helper_Url extends Zend_Controller_Action_Helper_Url
{
    public function url($urlOptions = array(), $name = null, $reset = false, $encode = false)
    {
        // Replace the _ with / in the module name
        $urlOptions['module'] = str_replace('_', '/', $urlOptions['module']);

        // Let the router do rest of the work
        return $this->getFrontController()->getRouter()->assemble($urlOptions, $name, $reset, $encode);
    }
}

А в твоей начальной загрузке:

Zend_Controller_Action_HelperBroker::addHelper(new App_Router_Helper_Url);

Теперь Zend_Navigation прекрасно работает с поддержкой вашего подмодуля.

3 голосов
/ 28 октября 2009

Я (несмотря на то, что я счастливый пользователь ZF) пошел бы на Django. В ZF «полностью модульное» приложение является своего рода падубом Грааля. Почти невозможно (или, по крайней мере, без особых усилий) создать автономные модули, которые можно установить, например, «скопировать эту папку в каталог ваших модулей» :) Не уверен насчет Django, но, с моей точки зрения, там проще ...

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