ФорумПрограммированиеPHP для идиотов → Папки vs Роутер

Папки vs Роутер

  • wats

    Сообщения: 134 Репутация: N Группа: Кто попало

    Spritz Авг. 18, 2010, 10:44 д.п.

    Не знаю как лучше указать роутеру, что запрошенный контроллер находится в какой то вложенной папке.
    Проверять по запросу есть такая директория в контроллерах или нет не выход, ведь могут быть и контроллер и папка с одинаковыми именами. Может есть какие решения? Буду очень благодарен за помощь.
    Классы решил именовать так:
    class Controller_Admin_Panel
    {

    }

    Admin - это директория, Panel - это контроллер который лежит в папке admin.
  • Troy

    Сообщения: 2532 Репутация: N Группа: Джедаи

    Spritz Авг. 18, 2010, 10:49 д.п., спустя 4 минуты 47 секунд

    wats, ИМХО изначально бредовая структура, должен быть контроллер Admin в папке controllers , а уже в нем описание экшенов, либо указываете , что для этого экшена надо другой класс загрузить
  • wats

    Сообщения: 134 Репутация: N Группа: Кто попало

    Spritz Авг. 18, 2010, 10:58 д.п., спустя 8 минут 45 секунд

    Troy, мне необходима возможность вложенных папок в контроллерах, что бы не обязательно, но можно было разделять различные разделы сайта.
  • Troy

    Сообщения: 2532 Репутация: N Группа: Джедаи

    Spritz Авг. 18, 2010, 11:06 д.п., спустя 8 минут 1 секунду

    wats, Ну так а я вам о чем говорю ?
    Пример:
    контроллер для админки

    <?php
    class AdminController extends Controller {

    function actions() {
    return array('settings' => 'controllers/admin/settings.php');
    }

    function actionMain() {
    //Тут реализация
    }

    function actionTest() {
    // Реализация
    }

    }
  • wats

    Сообщения: 134 Репутация: N Группа: Кто попало

    Spritz Авг. 18, 2010, 11:20 д.п., спустя 14 минут 17 секунд

    Troy, я тебя понял, но что то мне не нравится такая реализация, должно быть всему свое место, разделов может быть очень много и сваливать все контроллеры просто в папке controllers как то не правильно, гороздо удобней когда все контроллеры отвечающие например за админку лежат в папке controllers/admin, контроллеры отвечающие за форум в папке controllers/forum и т.д. А в самой папке controllers пускай лежит например базовый контроллер и прочее.
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz Авг. 18, 2010, 12:48 п.п., спустя 1 час 27 минут 46 секунд

    wats, тогда уже лучше делать, отдельно модули: forum, blog, managment, а в них контроллеры, а не controllers/blog/ controllers/forum и так далее.

    У меня так:

    application
    modules
    blog
    controllers
    IndexController.php
    forum
    controllers
    IndexController.php
    ListController.php


    Я так работаю с zf и меня все устраивает. Но чаще, мне не нужно даже создавать много контроллеров, что бы разделять их по модулям. Хватает ForumController, BlogController…
  • wats

    Сообщения: 134 Репутация: N Группа: Кто попало

    Spritz Авг. 18, 2010, 12:55 п.п., спустя 7 минут 23 секунды

    krasun, на счет модулей ты верно подметил, это все упрощает.
  • wats

    Сообщения: 134 Репутация: N Группа: Кто попало

    Spritz Авг. 18, 2010, 1:03 п.п., спустя 8 минут 20 секунд

    Воспользуюсь моментом и задам такой вопрос: какой класс должен проверять существование запрашиваемого контроллера, Request или Router?
    Спустя 44 сек.
    запрашиваемого контроллера и экшена?
  • Givi

    Сообщения: 2284 Репутация: N Группа: Адекваты

    Spritz Авг. 18, 2010, 1:09 п.п., спустя 6 минут 6 секунд

    wats, ни тот ни другой - Реквест возвращает запросы, Роутер их обрабатывает, какой-то "коре"-класс делает все что нужно с полученными от обоих классов данными. Это ИМХО.
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz Авг. 18, 2010, 1:23 п.п., спустя 13 минут 18 секунд


    Воспользуюсь моментом и задам такой вопрос: какой класс должен проверять существование запрашиваемого контроллера, Request или Router?
    Спустя 44 сек.
    запрашиваемого контроллера и экшена?

    Dispatcher
    Спустя 112 сек.
    Смотреть Zend_Controller_Dispatcher_Standard методы dispatch($request, $response) и isDispatchable($request). http://zendframework.com/manual/en/zend.controller.dispatcher.html
  • kostyl

    Сообщения: 5210 Репутация: N Группа: Джедаи

    Spritz Авг. 18, 2010, 1:31 п.п., спустя 8 минут 42 секунды

    а у меня вообще нет контроллеров экшенов, одни действия на основе Command, и деспетчеризует это всё - приложение.
  • Givi

    Сообщения: 2284 Репутация: N Группа: Адекваты

    Spritz Авг. 18, 2010, 1:41 п.п., спустя 10 минут 4 секунды

    kostyl, ну я насмотрелся малость на ВМЦ и решил что-то по этому подобию делать. Хотя в целом у меня все далеко от идеала да и вообще отлично от структур известных фреймворков. И даже кажется уже что не очень удобную структуру я сделал. Но как бы там ни было, в любом случае за подключение нужных классов отвечает один из системных классов, но не Роутер и не Реквест.
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz Авг. 18, 2010, 1:42 п.п., спустя 10 секунд

    kostyl, мне кстати тоже подход с Command нравиться теоретически, на практике не пробовал
  • kostyl

    Сообщения: 5210 Репутация: N Группа: Джедаи

    Spritz Авг. 18, 2010, 2:04 п.п., спустя 22 минуты 50 секунд

    kostyl, мне кстати тоже подход с Command нравиться теоретически, на практике не пробовал

    попробуй, мож понравиться. Я пробовал и зенд и прочие штуки и сам писал с фрон и экшен контроллерами, но как то оно бля всё получается у меня громоздко что ли, короче если честно - даже не знаю почему, но меня не прёт, мож из-за того что я сразу стал с Command работать, фиг знает.
    В Command напряг в том мне кажется, что это конкретный экшен но настолько полиморфный, что как бы метод возноситься к уровню класса. Попросту говоря, ты допустним в init-е контроллера прописал правила acl например, и как бы у тебя на все методы-экшены это расползлось. А на Command надо повторять это, тобишь тут либо своеобразный диспетчер нужен, либо в каждой комманде хелпер ну короче тут надо думать на сколько у тебя команда будет независимой внутри себя и как всё обплясать. А вообще круто, особенно приближаешься как бы к событийной архитектуре из нормальных языков или типа того…
    Вообще наговорил столько хуйни аж сам не понял )))
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz Авг. 18, 2010, 2:20 п.п., спустя 15 минут 54 секунды

    kostyl, я в zf пишу свой сервисный уровень для работы с моделями, а контроллер лишь обрабатывает запросы и перенаправляет их сервисному уровню, меня это конечно не напрягает. Вот пример:

    /**
    * New book
    *
    * @return void
    */
    public function createAction()
    {
    $form = $this->_service->getForm();
    if ($this->getRequest()->isPost()) {
    $data = $this->_request->getPost();
    if ($this->_service->processFormCreate($data)) {
    $model = $this->_service->getModel();
    $this->getHelper('redirector')->gotoSimple(
    'view', 'book', null, array(
    'id' => $model['id'])
    );
    }
    }
    $this->view->form = $form;
    $this->view->title = 'Добавление книги';
    }


    А уже в сервисном уровне, что-то вроде:

    /**
    * Process create form and return true if form is valid, otherwise return false
    *
    * @param array $data
    * @return bool
    */
    public function processFormCreate(array $data)
    {
    if (!$this->getForm()->isValid($data)) {
    return false;
    }

    $formData = $this->getForm()->getValues();
    $data = array(
    'user_id' => $this->_getUserId(),
    'image_id' => $this->_getImageId($this->getForm()->image),
    'title' => $formData['title'],
    'annotation' => $formData['annotation'],
    'author_name' => $formData['author_name'],
    'links' => $formData['links'],
    'format' => $formData['format'],
    'language' => $formData['language'],
    'pages_count' => $formData['pages_count'],
    'year' => $formData['year']
    );

    $table = new Model_DbTable_Books();
    $table->insert($data);
    $data['id'] = $table->getAdapter()->lastInsertId();

    $data['categories'] = $this->_assignBookToCategories(
    $data['id'], $formData['categories']
    );

    $this->setModel($data);
    return true;
    }


    Сейчас, хочу попробовать написать, что вроде событийной архитектуры, как ты говоришь. Только у меня это будет, что-то вроде Pub-sub или Observer. Хочется попробовать сделать нечто такое, что бы любой компонент системы мог генерировать событие и любой мог его перехватывать, что бы оно еще всплывало как в javascript по chain of responsibility.

    Мне еще в этом плане реализация ловушек в Drupal нравиться.

    А команда, да это по сути действие, и мне кажется не нужно пихать в нее acl и так далее. А она выполняет какие-то атомарные операции, а уже как ты говоришь диспетчер или CommandManager идет надстройкой к ней. Я могу быть не прав, еще не пробовал работать с командами.


Пожалуйста, авторизуйтесь, чтобы написать комментарий!