За последние 24 часа нас посетили 34443 программиста и 1709 роботов. Сейчас ищут 779 программистов ...

Помогите понять и реализовать

Тема в разделе "PHP для новичков", создана пользователем abler98, 22 сен 2014.

  1. abler98

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

    С нами с:
    31 авг 2014
    Сообщения:
    43
    Симпатии:
    0
    Вот что я хочу сделать:
    Код (PHP):
    1. echo View::make('index'); // Выводит содержимое файла views/index.php
    2. echo View::make('index', array('name' => 'abler98', 'foo' => 'bar')); // Выводит содержимое файла views/index.php с присвоением переменных $name и $foo   
    Все что написано выше - сделать легко и просто, но вот как сделать такой вариант:
    Код (PHP):
    1. echo View::make('index')
    2.     ->with('name', 'abler98')
    3.     ->with('foo', 'bar'); // Должно сработать как и во втором примере   
    Ведь если View::make() вернет шаблон, то переменные применить к нему уже нельзя.

    P.S. Нужно чтоб работали все варианты :)
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    View::make('index') возвращать должна экземпляр View , как и with() (первая должна создать экземпляр этого класса и вернуть, а вторая - установив переменную, вернуть $this), и ещё один метод в дополнении можно приделать - render(), который уже будет возвращать отработанный шаблон. Видел вариант вместо render использовать магический метод __toString(), но мне больше нравится явный вызов.

    Добавлено спустя 1 минуту 21 секунду:
    Код (Text):
    1. echo View::make('index', array('name' => 'abler98', 'foo' => 'bar'));
    - а это через параметр по умолчанию.
     
  3. abler98

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

    С нами с:
    31 авг 2014
    Сообщения:
    43
    Симпатии:
    0
    На примере можно? То есть вот так?
    Код (PHP):
    1. $view = View::make('index')->with('foo', 'bar');
    2. echo $view->render();
     
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Да, именно так. Можно даже в одну строку при такой реализации, как я написал:
    Код (Text):
    1.  
    2. echo $View::make('index')->with('foo', 'bar')->render();
     
  5. abler98

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

    С нами с:
    31 авг 2014
    Сообщения:
    43
    Симпатии:
    0
    Спасибо. Мне больше понравился магический метод __toString, лучше буду в нем вызывать render :)
     
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Дело ваше. Я очень не люблю, когда что-то в программе происходит неявно. Хотя, конечно, знающий php догадается о магическом методе.
     
  7. abler98

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

    С нами с:
    31 авг 2014
    Сообщения:
    43
    Симпатии:
    0
    Я тоже не люблю, но это удобно. Просто иногда при разборе кода могут возникнуть проблемы.
     
  8. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    $view будет уничтожена в конце метода, где она родилась.
    следовательно рендер можно засунуть в деструктор View.
    тогда вручную его ненужно будет вызывать.