«phpClub» — архив тем ("тредов"), посвящённых изучению PHP и веб-технологий.
Аноним 2017/04/01 19:16:58  №964977 1
PJ95IDZpzmE.jpg (195, 1280x980)
980x1280
Как в слиме передать в контроллер объекты? Вот делаю вот так, а у меня приходит контейнер.
Аноним 2017/04/01 19:28:51  №964984 2
>>964977
Тебе сразу готовое решение или сам помучиться хочешь?
Ответы: >>964986
Аноним 2017/04/01 19:29:53  №964986 3
>>964984

Давай готовое, я уже повтыкал в документацию. А что, ты сейчас напишешь больше двух строчек?
Ответы: >>964987
Аноним 2017/04/01 19:31:28  №964987 4
Ответы: >>965664
Аноним 2017/04/01 19:42:12  №964997 5
>>964977
А зачем передавать то что-то? Ты как-то странно делаешь. Я сделал обычный контейнер, который сам передается в контроллер.
Ответы: >>964999 >>965685
Аноним 2017/04/01 19:43:49  №964999 6
>>964997

Ну это же Service Locator у тебя. А я хочу DI, если я правильно понимаю.
Ответы: >>965008 >>965020 >>965664
Аноним 2017/04/02 19:15:06  №965599 7
Можно ли как-то в слиме получить доступ к контейнеру внутри роута, не через $this->get() или $this['service'], а как-то типа $this->container->методыКонтейнера?
Ответы: >>965664 >>965685
Аноним 2017/04/02 21:56:48  №965664 8
>>965599
> а как-то типа $this->container->методыКонтейнера?
Как раз при вызове $this->get() ты и вызываешь метод контейнера.
Slim привязывает this обработчика роута к контейнеру, поэтому когда ты вызываешь $this->get('service') на самом деле вызывается $container->get('service'). Так что попробуй $this->методКонтейнера, должно заработать. Про привязку контекста написано тут: http://php.net/manual/en/closure.bindto.php , вот пример попроще: https://ideone.com/mTHisT

>>964999
Правильно понимаешь, передача контейнера в качестве аргумента - это Service Locator. То, что ты хочешь, называется Controller as Service. Обычно в этом нет смысла, есть идеи почему?

>>964987
https://github.com/spudro228/my-site/blob/master/src/Core/PostsController.php#L20
Странный код. Контейнер как раз нужен, чтобы возвращать уже проинициализированные объекты и разруливать зависимости именно его задача.
Ответы: >>965686 >>966103
Аноним 2017/04/03 17:32:34  №966100 9
Я сейчас пытаюсь понять MVC. Точнее, как прикрутить эту штуку к моему реальному проекту.

Суть токова: юзер нажимает кнопку и получает окошко с таблицей данных. Технически происходит следующее: при нажатии на кнопку срабатывает js-скрипт (Контроллер, так?), он передаёт через аякс пхп-скрипту (Модели) данные (что именно нажал пользователь и кто он вообще есть). Скрипт обращается к БД, что-то там вычисляет и выдаёт результат. И вот тут мне не понятно, как дальше всё сделать по фен-шую.

1) В https://github.com/codedokode/pasta/blob/master/arch/mvc.md написано, что он должен возвращать результат через return. Но пхп-скрипт, который вызывается в аяксе, оформлен у меня просто кодом на пхп, а не функцией (вернее, функции там тоже есть, но уже внутри).
2) Там же написано, что пхп-скрипт не должен выдавать ничего в echo. А как тогда должен? Единственный вариант, который я вижу - json.
3) Опять же, есть два стула. Для таблицы (которая показывается юзеру) нужно, к примеру, десять значений ячеек. Первый стул - это вернуть из пхп-скрипта (Модели) эти значения и уже в js-скрипте (Вид) подставить их в ячейки документа через document.getElementById("div_show_one_flight").innerHTML=data; Сам же внешний вид таблицы прописывается в index.php. Но в том же гайде пишут, что нельзя Виду работать с document. Да как так? Как выводить тогда вообще? Второй стул - это оставить в index.php только место для вставки, а полностью весь код таблицы набрать в пхп-скрипте, передать его через айкс обратно js-скрипту и вставить одним действием. Тоже лажа какая-то, получается: Модель напрямую рулит Видом.

Что-то не въезжаю я в караван мысли авторов этого паттерна.
Ответы: >>967843 >>967265 >>967838
Аноним 2017/04/03 17:35:13  №966103 10
>>965664
>Как раз при вызове $this->get() ты и вызываешь метод контейнера.
Неа, не работает. Собственно в чем идея - я сделал класс ContainerWrapper который наследуется от слимовского контейнера. В нем у меня методы типа getTwig и phpDoc для него, все это для автодополнения кода. В контроллере это все работает, а вот в колбеке - нет.
Ответы: >>967838
Аноним 2017/04/06 07:59:59  №967838 11
>>966103

Если ты используешь синтаксис вроде $this->... внутри коллбека, то надо проставить как-то тайп-хинт для this, может через @var $this, но не уверен, что это будет работать. Или откуда ты берешь объект ContainerWrapper? Надо как-то на эту переменную поставить тайп-хинт или phpDoc конструкцию.

>>966100

Ты просто неправильно поделил приложение на M/V/C.

Твое приложение можно рассматривать двояко:

- либо как единое целое, где MVC приложение находится на сервере, а JS-код - это лишь часть интерфейса, часть HTML-страницы, "тонкий клиент", который просто передает запросы на сервер и отображает ответы. То есть является дополнением к View.
- либо как 2 независимых приложения: серверное на PHP, и отдельное на JS, которое взаимодействует с сервером, но содержит свои модели, свое хранилище данных, может само их обрабатывать. Тут будет 2 набора M/V/C на клиенте и сервере.

Если JS код это отдельное приложение, то код на JS - долгоживущий, и ему нужен вариант MVC с активной моделью. Если что, вот тут на примере игры разбираются такие реализации MVC: https://github.com/codedokode/pasta/blob/master/js/minesweeper-mvc.md

Проще наверно рассматривать JS код как "тонкого" (с маленьким объемом логики) клиента, а PHP-код как отдельное MVC приложение. Тогда у нас на сервере мы используем обычные контроллеры, модели и вью. А задача JS приложения просто передать запрос пользователя на сервер и отобразить результат, оно просто служит продолжением контроллера и вью в PHP.

Делать JS как отдельное приложение - это значит, надо делать хранилище данных на клиенте, синхронизировать его с сервером, делать какие-то операции независимо от сервера. Это дает преимуещства вроде возможности работать в оффлайне или обрабатывать данные на клиенте, но тебе это вряд ли нужно. Если ты видел мобильные приложения, они примерно так же работают - они берут данные с сервера, но какие-то операции могут делать сами, и многда могут работать при пропадании интернета.

> написано, что он должен возвращать результат через return. Но пхп-скрипт, который вызывается в аяксе, оформлен у меня просто кодом на пхп, а не функцией (вернее, функции там тоже есть, но уже внутри).
Потому что ты не совсем верно разделил код. Если мы считаем что JS - это полноценное приложение, то в JS коде должна быть модель, а в ней функция, которая принимает данные, отправляет запрос, и позже возвращает результат. Если мы считаем что приложение у нас только на сервере, то эта функция должна быть только там.

> Там же написано, что пхп-скрипт не должен выдавать ничего в echo.
Выводом должен заниматься только View. Модель точно не должна, контроллер обычно тоже.

> Единственный вариант, который я вижу - json.
Это то же самое, что вывод HTML.

> Первый стул - это вернуть из пхп-скрипта (Модели) эти значения и уже в js-скрипте (Вид) подставить их в ячейки документа
> Второй стул - это оставить в index.php только место для вставки, а полностью весь код таблицы набрать в пхп-скрипте, передать его через айкс обратно js-скрипту и вставить одним действием

Это просто выбор, где делать шаблонизацию: на сервере или клиенте. Надо взвесить достоинства и недостатки и выбрать более подходящий вариант.

> Но в том же гайде пишут, что нельзя Виду работать с document.
Виду как раз можно, это модели нельзя.

Ответы: >>967843 >>967919
Аноним 2017/04/06 08:13:04  №967843 12
По ошибке не туда ответы запостил, ну и ладно:

>>966853 - про архив тредов ответ тут >>967836
>>966596 - про лайки там же >>967836
>>966275 - про TestHub тут >>967837
>>966146 - про HttpKernel тоже тут >>967837
>>966100 - про MVC тут >>967838
>>965899 - про Вектор тут >>967839
>>967822 - про инъекции тут >>967840

Если я кого-то пропустил и не ответил, напомните о себе

Аноним 2017/04/06 11:39:26  №967919 13
>>967838
Окей. Я так понял, что мне о MVC пока думать рано и кодить, как кодится.
Ответы: >>967925
Аноним 2017/04/06 11:42:38  №967925 14
>>967919
>пока думать рано
А потом тебе станет 30 лет, останешься без работы и сбомжуешься насмерть.
Ответы: >>967928
Аноним 2017/04/06 11:45:25  №967928 15
>>967925
>А потом тебе станет 30 лет
Мне 32.
Ответы: >>967939
Аноним 2017/04/06 11:56:55  №967939 16
>>967928
Пенсию небось получаешь? Или просто хикка?
Ответы: >>967977 >>967988
Аноним 2017/04/06 12:17:21  №967977 17
>>967939
Получаю, мамкину. Ну и второе тоже.
Аноним 2017/04/06 12:25:52  №967988 18
>>967939
Работаю админом-эникеем.