Дали мне тестовое распарсить xml залить данные в бд и вывести в таблицу + сделать сортировку по одному полю. Все сделал, использовал mvc. Позвали на собеседование, не прошел. И блин забыл спросить про замечания по тестовому. Вот теперь просьба посмотрите мою реализацию и скажите что не так. сразу скажу знаю что в роуте можно и нужно было сделать немного по другому. а все остальное? код прикрепил в архиве. Буду благодарин если нормально объясните.
Тут могли просто придраться к оформлению кода. https://www.php-fig.org/psr/psr-0/ https://www.php-fig.org/psr/psr-1/ https://www.php-fig.org/psr/psr-2/ https://www.php-fig.org/psr/psr-3/ https://www.php-fig.org/psr/psr-4/ Все зависит от самого работодателя
Задача: Средствами PHP распарсить приложенный XML файл, записать полученные данные в СУБД MySQL. Вывести содержимое базы товаров на отдельной html странице в табличной форме, реализовать фильтрацию товаров по полю «производитель».
хм... тогда не знаю просто у вас ни MVC ни ООП в коде нет (хотя и есть попытка их использовать), но в ТЗ про них тоже ничего не указано. Ну если только к запросам в цикле претензия, зло которое ни к mvc ни к объектам отношения не имеет, но тут как бы разовая операция и можно немного сачконуть. Другое дело, что ситуацию надо объяснить и обосновать работодателю, из каких зол надо выбирать меньшее. + вижу сортировку, но не вижу фильтрации по вендорам
Ну, тогда и я добавлю про логику. Если говорить об MVC, то бизнес-логика должна быть в модели, а не в контроллере. У Вас парсинг в контроллере, а то что в модели назвали парсингом - сохранение в БД.
Блин а вот тут да я протупил, чет попутал сортировку с фильтрацией. лол. А почему вы сказали ? --- Добавлено --- Насколько я понимаю логика должна быть в контроллере, а в моделе в основном запросы в бд, так у меня так и есть ведь. или что вы имеете ввиду?
про MVC вам уже сказали, там мухи с котлетами, а про ООП назовите хотя бы один шаблон проектирования который вы применили в коде?
например вот это PHP: public function getData(){ $order = "ASC"; if(isset($_GET['order'])){ $order = ($_GET['order'] == 1 ? "DESC" : 'ASC'); } $sth = $this->connect()->prepare("SELECT * FROM product LEFT JOIN category ON (product.cat_id=category.id) ORDER BY product.vendor $order"); $sth->execute(); $result = $sth->fetchAll(PDO::FETCH_ASSOC); return $result; }
@Dron-Boy, ну подключение к БД обычно синглтон, а товар - это обычно объект, раз много товаров, то должна быть фабрика и тд.
@Dron-Boy контроллер этот как пульт от телевизора, в нём не должно быть толком никаких манипуляций, только запуск методов из модели.
Если в нем не будит никаких манипуляций с данными которые получаю из модели то тогда где они будут? или что ты имел ввиду?
@Dron-Boy, В качестве примера, можно было бы в модели создать свой объект товара и пару оберток для него - вывод на страницу и сохранение в БД. Этот паттерн называется "Декоратор" Про фабрику Вам уже написали.
@Dron-Boy Контроллер PHP: $image = $request->file('image'); $description = $request->input('description'); $this->imageClass->add($image, $description); $this->imageClass->save(); $idNewImage = $this->imageClass->id; $categories = $request->input('choose-category'); $relation = \App\Services\Image::find($idNewImage); $relation->categories()->attach($categories); return redirect('/'); Модель PHP: public function add($image, $description) { $fileName = $image->store('uploads'); $this->image = $fileName; $this->description = $description; $this->id_user = Auth::id(); } --- Добавлено --- Нет, в моделе не обязательно должно быть только запросы в БД, модель для того, что бы выполнять в ней любые манипуляции с любыми данными (бд, изображения, тексты....), что бы разгрузить контроллер, в контроллер ты заходишь и должен сразу понять, что означает этот код, а за этим контроллером будет стоять модель, в которой вся сложная логика. Это как нажать нажать на педаль газа, если ты будешь на её жать, ты сразу поймёшь, что она будет делать (это контроллер), а то что твориться под капотом это модель.
Контроллер в данном случае получает файл не из модели, а должен передать его на обработку в модель. Возможно "Строитель" Вам подошел бы лучше фабрики.
Вы знаете, в давние времена, когда и php то и не было, а программисты говорили отечественными словами, mvc называли Дакнные->Контроллер->Представление, что в сути обозначает жизненный цикл программы. Мне кажется, это было содранно с концепции REPL в лиспе http://lisper.ru/pcl/lather-rinse-r...те свой разум: Интерактивное программирование, да и в любом подобном программном ядре. По сути же, иногда встречаются люди, которые свято верят в то, что MVC - это не умозрительная концепция, а прям таки, форма конкретной реализации или, например, (о ужас!) - конкретный программный каркас(фреймворк). Так что, что там имелось в виду - надо спрашивать у тех, кто не одобрил Вашего тестового задания. У меня вот с одной тёткой как-то не заладилась работа, а потом я узнал, что при личной встрече, ей мои уши показались слишком грязные. Она сказала примерно так: "Я сразу догадалась что он плохой специалист, у него уши были грязные". Вот вам и всё собеседование.
Предподготовленыйе запросы надо использовать а не имитировать бурную деятельность Юзаете prepare а значение не биндите. Вывод доку читать не умеет или вообще копи-паста. Примеры из лапки совершенно не уместны.
@joshadow, при чём здесь умозрительная концепция? MVC - это способ отделения логики от представления, изменения в одной из этих священных букв ни коим образом не должны влиять на две другие. В итоге приложение может иметь одну модель, три контроллера и пять представлений которые работают одновременно и абсолютно не мешают друг другу.
Да... Да... MVC это Данные-Представление-Контроллер. Но, имхо, это обусловлено, способом работы в ВЕБ. Идём на страничку. Для её формирования тянем из разных мест ДАННЫЕ(model - так, как любая база данных,вроде как, есть отражение свойств и взаимодействий части объектов реального мира(модель части реального мира)). На основе данных рисуем интерфейс ПРЕДСТАВЛЕНИЕ. И если нам надо что-то сделать - запускается КОНТРОЛЛЕР, то что производит некие действия. Например подменяет в строчичках кавычки, а потом вызывает методы для отправки их в модель ДАННЫХ. В принципе должна быть одна точка входа у всего проекта. Часто - контроллер, молча, после обработки делает перенаправление на страничку ПРЕДСТАВЛЕНИЯ. В итоге мы имеем. Файлик с описанием объекта базы данных (model). Его подтягивает рисователь интерфейса (view). И если есть команда на действие - то запускается обработчик(controller), подтягивающий под свои нужды объект базы данных, что-то делает и тихо перенаправляет на рисование интерфейса. Вроде того. Но как говорил один бородатый человек "Марксизм не догма, а руководство к действию". Я, например, часто леплю контроллер в начале файла, и внутренним флагом сигнала отрисовываю представление. Делаю, (о ужас!) несколько точек входа, для каждой группы задач свою. К примеру - отдельный интерфейс со своей точкой входа для справочника чего-нибудь. Канонически это не верно - но при этом нет необходимости тянуть всё сразу. От этого тока одна скорость исполнения --- Добавлено --- минуточку, но где же единая точка входа? Не творите себе кумира - все концепции умозрительны. На то они и концепции. --- Добавлено --- Да ладно Вам, разве это не родственные вещи REPL и MVC. Этож консольный дедушка и ВЕБ-клиентный сессионный внучёк . Знакомство с дедулей, имхо, открывает путь к пониманию внучка. Говорят, что одним из эффективных методов познания - есть сравнение. Вот я и упомянул его.
Знаете.... причин почему вас могли не взять - масса. Может цветом волос не приглянулись, кто его знает.. Например если бы я принимал прогеров, то я бы вас не взял по причине того, что вы простую задачу решаете сложными методами. Плюс к этому я не увидел у вас отдельной html страницы на которой был бы реализован вывод данных. (увидел только php-страницу где все это реализовано).
А причем здесь роутер? тебе данные дали, и цель конкретного логического кода замутить. Ко мне в магазин субботу пришел клиент, и место того чтобы спросить это, то то, или вовсе выйти, стал выяснять отношения с своим рабочим прорабом. Мол тот указал где копать яму, а они выкопали совсем где не надо. В итоге обесточили водопровод где - то мини городок. Гейзером бьет и бла бла бла. Саму истеричку пришлось выгнать. --- Добавлено --- зачем постоянно добавлять концовку ?> ? Лично на это смотрю как кодер не вылез с пеленок