За последние 24 часа нас посетили 4712 программистов и 480 роботов. Сейчас ищут 99 программистов ...

Правильная логика в паттерне mvc

Тема в разделе "PHP для новичков", создана пользователем webog, 14 сен 2018.

  1. webog

    webog Активный пользователь

    С нами с:
    13 май 2014
    Сообщения:
    127
    Симпатии:
    3
    Всем добра!

    Да да, я знаю все и всех задрали этим шаблоном, но все же хочу для себя выяснить раз и навсегда!
    Помогите пожалуйста! :)

    Проблема такая... Есть боковая колонка на сайте (sidebar), есть меню там же. Как и куда (правильнее/логичнее) передавать сайд бар и меню?

    У меня сейчас так: В MainController, в actionIndex передаю. Это для главной страницы. Но стоит зайти в Новости допустим - сайдбара нет. Контроллер уже другой. Так что бл@ть в каждый писать?

    Спасибо!
     
  2. mkramer

    mkramer Суперстар

    С нами с:
    20 июн 2012
    Сообщения:
    5.931
    Симпатии:
    1.072
    В Yii2 для этого введено понятия виджета, код которого сам делится на некое подобие контроллера и вида, и в этом "контроллере" можно даже запросить данные из модели. В своём MVC можно сделать также. https://www.yiiframework.com/doc/guide/2.0/en/structure-widgets

    В Laravel есть компоненты, и есть View Composers (как нормально на русский перевести - не знаю), через которые можно передать вне контроллера данные в просмотр. Но, поскольку виджеты - удобная штука, есть пакеты, добавляющие виджеты в Laravel

    В Kohana для таких случаев были возможны внутренние вызовы контроллера.
     
    webog нравится это.
  3. webog

    webog Активный пользователь

    С нами с:
    13 май 2014
    Сообщения:
    127
    Симпатии:
    3
    @mkramer В своем "велосипеде" как проще сделать?
     
  4. mkramer

    mkramer Суперстар

    С нами с:
    20 июн 2012
    Сообщения:
    5.931
    Симпатии:
    1.072
    @webog, ну виджет - это по сути довольно простой класс. Я бы ими сделал.
     
    webog нравится это.
  5. Astar75

    Astar75 Новичок

    С нами с:
    15 сен 2018
    Сообщения:
    13
    Симпатии:
    4
    Разные способы бывают. Ты например можешь в своем приложении организовать подключение основного шаблона, который у тебя будет везде на сайте, а в него уже встраивать вид с контентом, или вид с твоей этой менюшкой в сайдбаре.
    А что бы каждый раз не прописывать этот код -- создай класс контроллера (ParentController), там реализуй подключение файла вида с сайдбаром или с чем либо еще, а в остальных классах-контроллерах (ChildControllers) наследуйся от него (от ParentController)
     
    webog нравится это.
  6. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.323
    Симпатии:
    286
    Я бы сделал так своем велосипеде))

    1. Создал бы в конфиге новый блок.. в котором бы указывал контроллер и экшен и к нему массив с названиями классов из которых надо сделать объекты перед запуском контроллера.. объекты этих бы классов отправлял в реестр.
    2. А потом бы в шаблоне сделал бы что то типа
    PHP:
    1. if(!empty(Registry::get('sideBar'))){
    2.     $this->renderWidget('leftSideBar', [Registry::get('side_bar')]);
    3. }
    т.е. перед созданием контроллера создали объект виджета.. а потом если он есть то отправили данные в шаблон виджета. Для виджетов лучше сделать отдельную директорию и метод в классе View..