«phpClub» — архив тем ("тредов"), посвящённых изучению PHP и веб-технологий.
Аноним 2019/02/24 08:10:23  №1353745 1
Пхп вообще параша. Кто будет этим всем заниматься? Язык постоянно пытается стать жабой, когда сама жаба уже существует и просто плюет в сторону этого треда. Я уже не говорю про бек на питоне или голанге, где это дело более успешней, чем перебирать говнокод 10летней давности здесь.

Подумайте об этом.
Аноним 2019/02/24 08:39:25  №1353777 2
>>1353745
Количество вакансий и фирм глянь, где используется. Пхп очень популярен, прост в осовении и гибок, инструменты все современные есть, по скорости щас тоже отдалили. С жабой имеет смысл начинать, если есть огромный энтерпрайз, где кучи сервисов друг с другом коммуницируют. Жаба в крайне малом количестве стартапов сейчас используется, проще и быстрее все на пхп бывает написать и инвесторам результаты показать, чтобы получить дальнейшее финансирование.
Ответы: >>1353803
Аноним 2019/02/24 09:18:05  №1353803 3
>>1353777
Проще и быстрее писать на рельсах, если ты очередной манястартапер. Если же хочешь в норм контору - то тут уже юзается питчон, а если прям охуеваешь от своей тормознутости - присыпается голанг для убер маня хайлода.

>чтобы получить дальнейший говнокод.
Подправил.
Ответы: >>1353810 >>1353827 >>1353831
Аноним 2019/02/24 10:08:30  №1353827 4
>>1353803

Какие плюсы у Питона? Это же по сути и по синтаксису почти тот же Яваскрипт, нет даже тайп-хинтов. В Руби та же ерунда. В PHP больше возможностей статической типизации, есть фреймворки, ORM. И разработчиков найти проще.
Ответы: >>1353884
Аноним 2019/02/24 10:10:42  №1353831 5
>>1353803

И, конечно, непонятно, как просто использование Питона или Руби повышает качество кода. С чего бы вдруг? Что, менеджер по продажам, прошедший экспресс-курсы по Питону, будет писать более качественный код, чем после курсов по PHP? Вы, товарищи, просто распространяете очень далекие от реальности стереотипы.
Ответы: >>1353884
Аноним 2019/02/24 11:00:51  №1353884 6
>>1353827
>В PHP больше возможностей статической типизации, есть фреймворки, ORM. И разработчиков найти проще.
Это все нивелируется с существование жабы. Если бы ее не было, возможно пхп был бы еще уебищней.

>>1353831
Качественный код может написать любой человек который умеет читать доки.

Какую-то хуйню не аргументированную спизданул.
Ответы: >>1353901 >>1354506
Аноним 2019/02/24 11:12:24  №1353901 7
pyha.png (7, 799x506)
506x799
>>1353884
>Это все нивелируется с существование жабы.
Ну так и есть, пхп второй после жабы, пикрелейтед. Где жабу поднимать геморно, но удобство и функциональность жабы нужна, поднимают пхп.
Ответы: >>1353992
Аноним 2019/02/24 11:50:51  №1353942 8
ОП, я сделал все задания из твоего поста и прочитал все книги из оп-поста + некоторые проскакивающие в обсуждении про шаблоны. Что мне делать дальше?
Ответы: >>1353946 >>1353992 >>1354503
Аноним 2019/02/24 12:32:36  №1353992 9
>>1353901
>бекенд
>мочаскрипт

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

>>1353942
>Что мне делать дальше?
Делать сайты. Магазины, склады, игровые сайты, фильмы и т.д. Но мне тебя жаль.
Ответы: >>1354232 >>1354503
Аноним 2019/02/24 15:01:23  №1354129 10
Вопрос на засыпку:
есть два скрипта. В одном весь код поделен на методы вплоть до абсурда, например, метод hasProperty имеет всего лишь одну строчку кода return isset(prop); и методов очень много, сами понимаете, код раздут, код ради кода. В другом все написано в одном методе. Какой из этих скриптов отработает быстрее?
Ответы: >>1354503
Аноним 2019/02/24 16:21:33  №1354215 11
Спрашивал в JS-треде, но там молчат
Помогите изменить скрипт, пожалуйста.

Логика такая: при загрузке страницы срабатывает скрипт, считывает значение поля amount, отправляет его аяксом в requestUrl.php, принимает ответ и ждёт, пока человек не нажмёт кнопку payButtonId. Нажал - данные улетают в https://pay.realexpayments.com/pay

Проблема в том, что кроме amount нужны дополнительные поля, но пользователь заполняет их уже на странице. То есть, нужно, чтобы он сначала заполнил их, и только потом срабатывала их отправка в requestUrl.php

У меня не получается так сделать. Даже если ввести ещё одну кнопку и повесить на неё скрипт отправки в requestUrl.php, а на вторую отправку в платёжку, то отправка в платёжку не срабатывает. Работает только по $(document).ready

Вот код:
https://jsfiddle.net/tw6f7y2b/
Ответы: >>1359945
Аноним 2019/02/24 21:14:16  №1354503 12
>>1354129

Ну так померяй, например, на миллионе вызовов. Желательно сделать время измерения большим, минуты или более, чтобы нивелировать разные прерывания работы программы.

Должен предупредить, обычно тормоза в программах возникают совсем не из-за этого и ты просто зря потеряешь время.

>>1353992

Человек, обзывающий других дегенератом, хорошего впечатления не производит.

>>1353942

А что ты хочешь делать? Устроиться на работу, сделать свой проект, сдать сессию, какая у тебя цель?

Если на работу - то с задачами про студентов и файлообменник, навыками верстки, SQL, JS вполне может быть достаточно знаний. Можно, конечно, дополнительно освоить какой-нибудь фреймворк вроде Симфони или Ларавель, или посмотреть какую-то популярную CMS. Вроде как у нас были люди, которые послет студентов или файлообменника устраивались на работу и дальше задачи не делали.
Ответы: >>1354526
Аноним 2019/02/24 21:28:42  №1354517 13
Шаблон Реестр и класс DI дублируют друг друга? Я смотрю, у них одна и та же структура. Геттер, сеттер и контейнер. Разница между ними лишь идеологическая?
Ответы: >>1354520
Аноним 2019/02/24 21:32:42  №1354520 14
>>1354517

Реестр обычно это глобальное хранилище и он может быть только один. А если ты сделаешь Реестр на нестатических методах как объект, то он от DI контейнера будет не отличим.
Ответы: >>1354531
Аноним 2019/02/24 21:38:23  №1354526 15
>>1354503
>А что ты хочешь делать? Устроиться на работу, сделать свой проект, сдать сессию, какая у тебя цель? Если на работу - то с задачами про студентов и файлообменник, навыками верстки, SQL, JS вполне может быть достаточно знаний. Можно, конечно, дополнительно освоить какой-нибудь фреймворк вроде Симфони или Ларавель, или посмотреть какую-то популярную CMS. Вроде как у нас были люди, которые послет студентов или файлообменника устраивались на работу и дальше задачи не делали.


Я хочу устроиться на работу, но не абы куда, студии мимо, хочу заняться серьезным серверным программированием. Мне в вузе очень нравилось проектировать базы данных, вследствие этого за мной тянется фундаментальный багаж знаний о реляционных и нереляционных баз данных. Здесь я только пхп учил. Смотрел, кто из знакомых по вузу где зацепился, большинство не работает по профессии, некоторые админят (тоже не по профессии), некоторые пашут на мобилках, делают приложения, один ушел в 1С. Говно, в общем. Что делать, куда идти? Может свой проект сначала написать какой-то, чтобы крупные компании на меня обратили внимание?
Ответы: >>1354549 >>1359945
Аноним 2019/02/24 21:45:57  №1354531 16
Ответы: >>1357547 >>1359945
Аноним 2019/02/25 06:21:32  №1354608 17
Пиздон или Джава? На чей хуй пересесть? Что анон посоветует?
Ответы: >>1354786
Аноним 2019/02/25 11:30:58  №1354786 18
>>1354608
Джава, если объект-ориентированный php освоил, то будет минимум отличий и без усилий перейдешь, все довольно похоже. К тому же вакансий на ней поболее и платят там лучше, ну и в джаве более серьезно к качеству кода относятся, чем в питонах.
Ответы: >>1354794
Аноним 2019/02/25 11:35:57  №1354794 19
>>1354786
Тханкс. По пых я всю доку от корки до корки перечитал, долго работал пыхокодером. Хотет перекатиться во чтото для взрослых людей, чтобы быть уважаемым господином.

Т.е. хочу выбрать язык которому я мог бы посвятить жизнь без всяких сомнений, изучать каждый пук. Удачным ли выбором для таких целей является джава?
Ответы: >>1354829
Аноним 2019/02/25 12:23:07  №1354829 20
>>1354794
Питон по синтаксису на мой взгляд посасывает современному PHP, нет неймспейсов как у PHP, там интерпретатор ищет файлы сперва в локальной области видимости, потом в PYTHON_PATH и тд, есть конечно импорт директорий но это на мой взгляд не так удобно как с нейспейсами в PHP, нет тайпхинтов. Есть генераторы списков (удобная хрень) и есть многопоточность
мимо начал изучать python параллельно с основной работой на PHP
Ответы: >>1354838
Аноним 2019/02/25 12:36:21  №1354838 21
>>1354829
Да, тоже пытался питон учить, но подгорел от нитакогокаквсе синтаксиса
Ответы: >>1359948
Аноним 2019/02/25 18:49:03  №1355140 22
Написал я к примеру файл с созданием сервис провайдера и кинул его в папку с сервисами. А реализация сервиса (ну например "соединение с бд" должна в этом же каталоге лежать или где угодно?
Ответы: >>1357547 >>1359946
Аноним 2019/02/25 19:47:39  №1355207 23
Нужно ли делать ячейку DI-контейнера одиночкой, если она нуждается в этом? Понятно, что содержимое ячейки будет возвращаться одно и то же, но ведь можно будет создать экземпляр и не через сервис, а вручную, поэтому я хочу дополнительно обезопасить код. Правильно мыслю?
Ответы: >>1357547 >>1359946
MVC без шаблонизатора Аноним 2019/02/26 14:26:42  №1355798 24
Верно ли утверждение, что без шаблонизатора мы не можем создать полноценную MVC на пхп, ведь шаблонизатор не убирает скрипты пхп из HTML, а заменяет его код на свой синтаксис, т.е. все скрипты их штмл никуда не деваются. Главная задача MVC отделить логику от представления, разве обязательно юзать шаблонизатор?
Ответы: >>1357547 >>1359947
Аноним 2019/02/28 20:23:18  №1356973 25
Котаны, совета прошу. Я нуб, пхп осваиваю понемногу. В общем сейчас свое приложение делаю, MVС, на классах, содрал структуру с сети, запросы в базу писать уже научился( с помощью PDO), sql знаю. Суть туда/сюда понимаю. Короче зайчатки разума есть.
На работе появилась задача, которую мне нужно по итогу реализовать, сроки совсем не сжатые, но работу веду по факту ежедневно. Думаю что мой MVC шаблон и станет основой будещего приложения.
Суть приложения проста - сотрудники заходят на сервер и получают перечень доступных им запросов в базу, которые могут использовать.
Какие проблемы для себя я вижу:
1. Как сделать авторизацию в MVC?
2. Как делать права доступа? Т.е. сотруднику №1 доступны все отчеты, а сотруднику №2 только один.
sql-отчетов гипотетически будет много разных.
Делаю это для удобства всех вообще, потому как на данный момент отчеты я ручками пилю при необходимости.
Такой вот учебно-практичный проект возникает.
Где почитать годноты, котаны?



Ответы: >>1357016 >>1359952
Аноним 2019/02/28 22:36:09  №1357016 26
>>1356973
1. В бд есть таблица с логинами и паролями (хешами с солью). Показываешь страницу логина с полями для входа. Если пароль не подходит - посылаешь нахер. Если подходит - в сесию пишешь токен (очень длинную случайную строку). С этим токеном пользователь может лазить по сайту. Без токена - посылаешь на страницу логина. Токен проверяешь в каждом контроллере.
2. В бд есть таблица с правами пользователей. В контроллере проверяешь права - в зависимости от прав выводишь нужную инфу, или вообще посылаешь нахер на первую страницу если пользователь ломиться куда не положено.
Вообще лучше фрейморк какой-то взять (Yii2 или Laravel) - там эта вся хуйня сделана изначально (по крайней мере в Yii2).
Ответы: >>1359951
Аноним 2019/03/02 00:01:43  №1357536 27
Правильно ли идеалогически подключать несколько View в один шаблон?
Ответы: >>1357547 >>1357584 >>1359951
Аноним 2019/03/02 01:09:23  №1357547 28
>>1357536
Я не понимаю, мои посты скрываются каким-то специальным скриптом? На них никто не знает ответ? Вопросы дурацкие? Или просто лень отвечать?

>>1355207
>>1355140
>>1354531
>>1355798

И в предыдущем треде дохуя.
Ответы: >>1357562 >>1359946
Аноним 2019/03/02 04:47:24  №1357584 29
>>1357536
Это что бы изменение 1 вьюшки были отображены в другой?например я обычно общие куски делаю в partial и их уже где надо подключаю. Какой результвт ты хотел бы получить?
Ответы: >>1357918
Аноним 2019/03/02 12:55:22  №1357756 30
>>1353705 (OP)
Есть вопрос по "Вектору".
Правильно ли я понимаю что создание всех этих объектов работников надо как то автоматизировать? Или втупую ручками создавать каждый объект?
Ответы: >>1357759 >>1357797
Аноним 2019/03/02 13:00:24  №1357759 31
>>1357756
Сначала ручками, потом автоматизируешь, протом сравниваешь ощущения.
Ответы: >>1357898
Аноним 2019/03/02 17:32:26  №1357898 32
>>1357759
будет правильным создавать объекты сотрудников с помощью clone?
Ответы: >>1357904 >>1357908 >>1359951
Аноним 2019/03/02 18:04:31  №1357918 33
>>1357584
Я просто еще с фреймворками не работал, так что хз, как оно там везде работает. Есть вот шаблон, куда я подключаю вид, считай, вызываю функцию getView(), которая подключает текущий вид. Например, это список товаров. А еще у меня в каждом виде меняется, к примеру, шапка. Там title разный на каждой вьюхе. И как мне его там менять? Инклюдить всю шапку как виджет в каждый вид, туда передавать параметры для title и потом выводить все вместе или еще как-то можно?
Ответы: >>1357938 >>1359951
Аноним 2019/03/03 18:27:00  №1358638 34
А вот такое знает кто?
Есть у меня к примеру экшен, который вызывается один раз по умолчанию, когда юзверь заходит на страниц. Потом, когда программа юзверя запомнила, она будет вызывать другой экшен, при заходе на эту же страницу по умолчанию.
Можно ли сделать вот так?

методПоУмолчанию {
if (тутБылЮзверь) {
методПослеПосещения()
}
"Юзверь, зарегистрируйся!"
}

методПослеПосещения {
выводимИнфу()
}

То есть я понимаю, что чисто физически я могу вызвать один метод в другом, но можно ли так делать в MVC шаблоне?
Ответы: >>1358643 >>1359949
Аноним 2019/03/04 13:08:18  №1359022 35
Создал я, значит, сущность юзер, к нему маппер, базу ещё. Заполнился юзер данными, но вот только одна беда, некому оперировать этой сущностью. Какой слой модели вызывает методы этой сущности и возвращает результат контроллеру? Или может контроллер сам это делает?
Ответы: >>1359196 >>1359948
Аноним 2019/03/04 15:04:44  №1359071 36
e2a9d-clip-28kb.png (28, 631x226)
226x631
Господа, подскажите как реализовывать " антикризисные меры" в задачке "Вектор"? Это должна быть отдельная функция на каждое антикризисное решение или это должны быть три разные программы на каждый случай?
Ответы: >>1359591 >>1359948
пакетик 2019/03/04 17:44:47  №1359196 37
>>1359022
В операциях чтения ни чего такого нету. Можешь вызывать из контроллера
Ответы: >>1359366
Аноним 2019/03/05 00:08:43  №1359366 38
>>1359196
Мне кажется, хуевый план. А если мне нужно будет этих юзеров рассортировать, пропустить их через валидатор, то где мне это делать? Явно не в контроллере. Опчик, ты ведь знаешь ответ? Взываю к тебе!
Ответы: >>1359392 >>1359394 >>1359949
Аноним 2019/03/05 14:24:07  №1359625 39
$a='2';
test($a);
public function test($a) :int
{
return $a;
}

вернет ли в данном случае int или же string?
Ответы: >>1359634 >>1359948
1-52 Аноним 2019/03/06 02:31:41  №1359945 40
>>1354215

Вообще, это неудобно. Что, если пользователь нажал кнопку, а данные еще не пришли?

Сначала лучше сделать так: пользователь заполняет все поля и жмет кнопку. Отправляются по очереди все нужные запросы.

А потом уже можно прикрутить оптимизацию, отправлять первый запрос сразу после заполнения поля amount, итд.

Если у тебя нет понимания, как это делать, то скорее всего ты пока плохо знаешь Яваскрипт. Пройди учебник http://learn.javascript.ru/ и обрати особое внимание на события, анонимные функции (коллбеки), почитай про промисы.

>>1354526

Часто, чтобы попасть в "серьезную" компанию, надо сначала где-то приобрести опыт, возможно, что в веб-студии, в аутсорсере или где-то еще, где берут джуниоров. Ты можешь сам посмотреть вакансии компании, которая тебе нравится, на hh.ru и оценить требования.

Например, если ты любишь проектировать БД, то тебе подойдет какая-нибудь компания, которая делает софт на заказ, всякий софт для банков, телекомов, госорганов - там точно будут сложные базы данных.

>>1354531

Реестр - это паттерн, который описывает объект, в который можно класть и получать данные ( https://martinfowler.com/eaaCatalog/registry.html ). Часто он реализуется на статических методах:

ServiceRegistry::set(ServiceA::class, new ServiceA);
...
$srvA = ServiceRegistry::get(ServiceA::class);

Но это не обязательно. Как я помню, в той же Симфони есть такие реестры:

- реестр кастомных (добавленных пользователем) типов полей Доктрины
- реестр типов элементов форм

Там, где Реестр противопоставляется DI контейнеру - противопоставляется, наверно, статическая версия реестра. То есть подход

ServiceRegistry::get('ServiceA')

и

$container->get('ServiceA');

У Реестра и Контейнера могут быть такие отличия:

- Реестр часто бывает статический, а контейнер - нет
- Реестр не создает объекты: он хранит то, что в него положат. DI контейнер может создавать объекты, если ему дать описание, как это делается (например, описать, что надо передавать в конструктор, или позволить ему самому это понять анализом аргументов в конструкторе).
- Реестр может хранить что угодно, например, числа какие-нибудь или настройки. DI контейнер, как правило, хранит объекты-сервисы. Хотя в Симфони он хранит и настройки.

Ответы: >>1360508
Аноним 2019/03/06 02:32:18  №1359946 41
>>1357547

У меня просто времени иногда нет, последние пару недель адски загружен. Как станет полегче - разберу накопившиеся вопросы. А так, я всем стараюсь отвечать.

>>1355207

> Нужно ли делать ячейку DI-контейнера одиночкой, если она нуждается в этом?

Ни в коем случае. Идея DI контейнера - IoC - предполагает, что жизнью объекта (когда его создать, когда уничтожить, что передать в зависимости) управляют снаружи, что это не его зона ответственности. Это не дело объекта-сервиса знать, сколько экземпляров сейчас создано. Дело сервиса - указать свои зависимости, например, в конструкторе или в методах.

За поддержку единственного экземпляра отвечает контейнер. Да, пользователь может создать новый объект в обход контейнера, ну, значит, он так решил. Но скорее всего это будет сложно, так как нужно где-то взять зависимости объекта, настройки конфига, и это выльется в огромный объем кода. Ну и на код-ревью такой разработчик получит по шапке за велосипедостроение.

Простой пример, когда нам не нужен синглтон - это тесты. Мы хотим, чтобы тесты выполнялись в изоляции друг от друга, и можем для каждого теста создавать одноразовый экземпляр DI контейнера. DI это позволяет, а твой подход с синглтонами - нет.

Потому синглтон - это почти всегда антипаттерн. Не стоит его использовать.

>>1355140

Я думаю, сервис провайдеры и сервисы хранятся в отдельных папках. По поводу организации структуры кода, если ты используешь фреймворк, то стоит делать, как там принято. Если не используешь, то такие варианты:

- если классов мало (< 10), их можно класть в одну папку
- можно делать папки по типам классов: папка для сервисов, для контроллеров, для представлений, для моделек, для классов работы с БД, для вспомогательных утилит. Этот подход начинает фейлиться, когда у тебя становится огромное приложение с сотнями серисов и моделей.
- можно взять предыдущий подход и добавлять подпапки внутри папок. Ну например, папка модели, а в ней: папка пользователи, папка товары, папка статистика итд.
- а можно поступить по-другому, и разбить приложение на "части". Для каждой "части" создаем свою папку, а в ней подпапки: сервисы, модели, контроллеры, утилиты и тд. То есть будет папка "пользователи", а в ней подпапки с моделями пользователей, контроллерами раздела работы с пользователями итд.

Симфони, например, использует что-то отдаленно напоминающее последний подход, где можно делать разные "части" - бандлы. У каждого бандла могут быть свои конфиги. Вообще, последний подход, если делать бандлы небольшими, хорошо работает в огромных приложениях. Так как часто у нас разработка идет в стиле "создаем новый раздел сайта, дорабатываем и потом почти не трогаем". И мы сидим в основном внутри одного небольшого бандла и не трогаем остальной код.

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

CommonBundle - общий код, который используется всеми бандлами (не контроллеры или модели, а например, сервисы, утилиты, расширения фреймворка итд)
UsersBundle - управление пользователями, регистрация, личный кабинет
StoreBundle - витрина, вывод товаров, оформление заказа
FinanceBundle - оплата, бонусы
SupportBundle - раздел техподдержки
ForumBundle - форум
AnalyticBundle - аналитика
AdminBundle - админка
Ответы: >>1360508
Аноним 2019/03/06 02:33:28  №1359948 42
>>1354838

Он зато лаконичный. И там есть IPython Notebook - отличнейшая штука. Но отсутствие тайп-хинтов, конечно, убивает.

>>1359625

Вернет в любом случае то, что указано в тайп-хинте, в нестрогом режиме при этом допускает автоматическую конвертацию в int.

>>1359071

Можно как 3 функции, можно как 3 класса, можно как 3 метода в одном классе. Метод может принимать экземпляр Компании и делать с ней какие-то операции.

>>1359022

Зависит от того, как сделана работа с БД. Если у тебя используется дата маппер, то в нем и будет метод для загрузки моделек из БД.

> Какой слой модели вызывает методы этой сущности и возвращает результат контроллеру? Или может контроллер сам это делает?

Вызывать метод загрузки данных может контроллер. Либо сервис, который загружает данные из БД и делает какие-то еще преобразования.
Ответы: >>1360508
Аноним 2019/03/06 02:33:51  №1359949 43
>>1359366

Зависит от ситуации. Контроллер должен быть тонким, то есть в основном в нем вызовы разных сервисов (тех же мапперов) для получения разных данных и передача их во View. Для валидации можно сделать отдельный класс-валидатор. Для сортировки - если это что-то простое, нужно только для вывода и не повторно используемое, то делаем в контроллере. В задаче про студентов сортировку логично сделать аргументом в методе для получения студентов:

findStudents($searchBy, $orderBy, $orderDir, $offset, $limit): iterable

Этот метод может быть в маппере для работы с БД.

В таком случае мы можем получать отсортированный список студентов из любого места кода.

Контроллер отвечает за управление процессом обработки запроса, за интерпретацию команд пользователя. То есть контроллер как-то (например, из $_GET) определяет, какая сортировка нужна пользователю, и вызывает метод для загрузки студентов с сортировкой по данному полю. А затем передает найденных студентов во View и отдает пользователю сгенерированную HTML страницу.

>>1358638

Обычно это делают так:

class Controller
{
public function indexAction(Request $req)
{
if (!$this->isLoggedIn($req)) {
return $this->redirectTo(...);
}

...
}
}

То есть перед выполнением нужных действий проверяем наличие логина. При отсутствии - редирект на форму логина с передачей текущего URL (и проверкой, что он с нашего сайта). На форме логина пишется: "Чтобы XXX, вам надо зарегистрироваться, или ввести логин и пароль, если вы уже зарегистрированы". При желании можно как-то заморочиться и например, сделать проверку на уровне контроллера (то есть закрыть доступ ко всем методам этого контроллера сразу). Это удобно в админке, например.

В твоем варианте пользователь может попробовать обойти авторизацию, вызвав напрямую метод "методПослеПосещения".
Ответы: >>1360508
Аноним 2019/03/06 02:35:11  №1359951 44
>>1357898

Если они совсем однотипные то можно, но проще наверно через new.

>>1357918

Обычно делают отдельно шаблон для "лейаута" (шапка/подвал) и "контента". Лейаутов может быть несколько - например, один для морды, другой для админки. Как передавать параметры для лейаута? Тут есть варианты:

- руками копипастить их в каждый метод каждого контроллера (боль)
- наследовать контроллеры от базового класса и в нем формировать данные. У базового класса может быть метод вроде "поменять тайтл текущей страницы". Плюс - инкапсуляция, трудно передать что-то неправильное, например, не-строку.
- передать эти данные во вью до или после выполнения контроллера, без использования наследования. Или передать в контроллер.
- сделать "контроллер для лейаута" и в нем формировать данные для лейаута. У "контроллера лейаута" могут быть вспомогательные методы вроде "поменять тайтл текущей страницы".

В фреймворках готового решения нет. Каждый изобретает сам.

>>1357536

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

>>1357016

В сессию токен писать нет смысла. Данные сессии хранятся на сервере и недоступны пользователю, потому можно просто писать туда userId = 123. Это безопасно.

Токен нужен, если используется не сессия, а куки. Тогда писать userId = 123 нельзя, так как пользователь может их подделать. Также, некоторые шифруют и/или подписывают куки для защиты от чтения и/или модификации их пользователем. Плюс: сессии не требуется хранить.
Ответы: >>1360508
Аноним 2019/03/07 00:13:51  №1360508 45
>>1359945
>Реестр - это паттерн, который описыв
Спасибо, исчерпывающий ответ. Написал бы ты всеобъемлющую книгу по всем этим аспектам. Они ведь не устаревают. Будет пользоваться популярностью.

>>1359946
>У меня просто времени иногда нет, последние пару недель адски загружен.

А можно узнать, чем ты занимаешься? В студии трудишься или в каком-нибудь банке софт ваяешь?

>Ни в коем случае. Идея DI контейнера - IoC - предполагает
Хорошо, проблему синглтона контейнер решает.
А вот еще вопрос. Создал я класс подключения к мускулу, сделал для него сервис-провайдер, где он создается, а потом внедряю его, куда нужно.

А вот, скажем, мне нужен не один объект, а нужно итеративно и с условиями получить много, тогда что? Нужно будет в контейнере хранить не объект, а класс, а потом внедрять этот класс и там создавать через new?

>Я думаю, сервис провайдеры и сервисы хранятся в отдельных папках.

Спасибо, теперь все понятно.

>>1359948
Если у тебя используется дата маппер, то в нем и будет метод для загрузки моделек из БД.

То есть вообще всем управляет маппер, а сущности это такие пассивные ячейки памяти, к которым маппер обращается, и сущность сама по себе ничего делать не должна? И в контроллере правильно будет вызывать именно методы маппера?

>>1359949
> В задаче про студентов сортировку логично сделать аргументом в методе для получения студентов:

Спасибо за разъяснение особенно за последний абзац и за метод, ты сэкономил мне кучу времени.

>То есть перед выполнением нужных действий проверяем наличие логина. При отсутствии - редирект на форму логина с передачей текущего URL

А можно такую проверку делать в конструкторах? Например, в общий абстрактный контроллер засунуть. А то не делать же ее в каждом методе (боль, лол). И если юзверь не залогинен, то просто будет редирект на контроллер залогинивания, который этот конструктор не наследует.

>В твоем варианте пользователь может попробовать обойти авторизацию, вызвав напрямую метод "методПослеПосещения".

Но у него не получится, если я объявлю этот метод закрытым. Можно вообще все методы сделать закрытыми и вызывать их через indexAction, в котором сформировать настройки и всякие проверки. Сигнатуру формировать по маршруту. Получится эдакий фронт контроллер, только не физический файл, а метод. Но это что-то идиотское, да? Лол.

>Не думал, что у файлообменника такая сила. Сейчас, вроде начинающие разработчики делают сокращатели ссылок, но это уже неприлично просто.

А это разве не проще, чем файлообменник? Там ведь просто идет редирект на реальный URI при обращении к твоей ссылке. За вечер-другой можно сделать.

>>1359951
>Обычно делают отдельно шаблон для "лейаута" (шапка/подвал) и "контента". Лейаутов может быть несколько - например, один для морды, другой для админки. Как передавать параметры для лейаута? Тут есть варианты:


Я придумал вот что. Я в контроллере общем создал контейнер обычный массив data, куда записываю данные со всех уголков контроллеров и приходящие данные из моделей. В контроллерах-родителях задаю общие данные, в контроллерах специфичные, в методах контроллеров данные еще специфичнее. Данные записываются не через переопределение свойств, а через методы суперкласса.
Потом этот контейнер передаю в вид и обращаюсь к нему из шаблонов типа $data['title'], foreach($data['posts'] as $key => $post) {}, ну и все в таком духе. То есть "лейаут" и "контент" получаются данные из одного глобального массива data, переданного в вид. Так нормально?

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

Ну я имел ввиду, можно ли несколько "контентов" подключать в "лейаут".

Спасибо за ответы, ты будто чистое знание вливаешь мне прямо в мозг. Я, бывает, что-то очень долго ищу, бывает, несколько дней занимает поиск ответа на какой-то вопрос, иногда бывает сам додумываюсь до ответа, но проблема в том, что я не знаю, правильный он или нет. Но вот так очень круто зайти сюда и прочитать ответы на все, что я задавал. Пасиба.
Ответы: >>1360509 >>1361818
Аноним 2019/03/07 00:15:56  №1360509 46
>>1360508
>а нужно итеративно и с условиями получить много, тогда что? Нужно будет в контейнере хранить не объект, а класс, а потом внедрять этот класс и там создавать через new?
Хранить в контейнере factory, через нее создавать объекты.
Ответы: >>1360515
Аноним 2019/03/07 00:35:41  №1360515 47
>>1360509
Еще до фабрик не дошел, сейчас самое время, спасибо, анонче.