За последние 24 часа нас посетил 22161 программист и 1154 робота. Сейчас ищут 322 программиста ...

Вопрос по тестовому

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

  1. Dron-Boy

    Dron-Boy Старожил

    С нами с:
    20 ноя 2014
    Сообщения:
    1.041
    Симпатии:
    126
    Дали мне тестовое распарсить xml залить данные в бд и вывести в таблицу + сделать сортировку по одному полю. Все сделал, использовал mvc. Позвали на собеседование, не прошел. И блин забыл спросить про замечания по тестовому. Вот теперь просьба посмотрите мою реализацию и скажите что не так. сразу скажу знаю что в роуте можно и нужно было сделать немного по другому. а все остальное? код прикрепил в архиве. Буду благодарин если нормально объясните.
     

    Вложения:

  2. Maputo

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

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
  3. Dron-Boy

    Dron-Boy Старожил

    С нами с:
    20 ноя 2014
    Сообщения:
    1.041
    Симпатии:
    126
    Да кстати он говорил что я не использовал стандартов.
     
  4. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @Dron-Boy, тестовое задание такое и было как вы написали или имело чёткую формулировку ТЗ ?
     
  5. Dron-Boy

    Dron-Boy Старожил

    С нами с:
    20 ноя 2014
    Сообщения:
    1.041
    Симпатии:
    126
    Задача: Средствами PHP распарсить приложенный XML файл, записать полученные данные в СУБД MySQL. Вывести содержимое базы товаров на отдельной html странице в табличной форме, реализовать фильтрацию товаров по полю «производитель».
     
  6. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    хм... тогда не знаю :) просто у вас ни MVC ни ООП в коде нет (хотя и есть попытка их использовать), но в ТЗ про них тоже ничего не указано. Ну если только к запросам в цикле претензия, зло которое ни к mvc ни к объектам отношения не имеет, но тут как бы разовая операция и можно немного сачконуть. Другое дело, что ситуацию надо объяснить и обосновать работодателю, из каких зол надо выбирать меньшее.

    + вижу сортировку, но не вижу фильтрации по вендорам
     
    #6 Valick, 22 сен 2018
    Последнее редактирование: 22 сен 2018
  7. Maputo

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

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Ну, тогда и я добавлю про логику. Если говорить об MVC, то бизнес-логика должна быть в модели, а не в контроллере. У Вас парсинг в контроллере, а то что в модели назвали парсингом - сохранение в БД.
     
  8. Dron-Boy

    Dron-Boy Старожил

    С нами с:
    20 ноя 2014
    Сообщения:
    1.041
    Симпатии:
    126
    Блин а вот тут да я протупил, чет попутал сортировку с фильтрацией. лол.
    А почему вы сказали ?
    --- Добавлено ---
    Насколько я понимаю логика должна быть в контроллере, а в моделе в основном запросы в бд, так у меня так и есть ведь. или что вы имеете ввиду?
     
  9. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    про MVC вам уже сказали, там мухи с котлетами, а про ООП назовите хотя бы один шаблон проектирования который вы применили в коде?
     
  10. Dron-Boy

    Dron-Boy Старожил

    С нами с:
    20 ноя 2014
    Сообщения:
    1.041
    Симпатии:
    126
    Ну видимо пытался использовать MVC но не правильно.
     
  11. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    например вот это
    PHP:
    1.         public function getData(){
    2.             $order = "ASC";
    3.             if(isset($_GET['order'])){
    4.                 $order = ($_GET['order'] == 1 ? "DESC" : 'ASC');
    5.             }          
    6.             $sth = $this->connect()->prepare("SELECT * FROM product LEFT JOIN category ON (product.cat_id=category.id) ORDER BY product.vendor $order");
    7.             $sth->execute();
    8.             $result = $sth->fetchAll(PDO::FETCH_ASSOC);
    9.             return $result;
    10.         }
     
  12. Dron-Boy

    Dron-Boy Старожил

    С нами с:
    20 ноя 2014
    Сообщения:
    1.041
    Симпатии:
    126
    ну да, почему то не перенес в контроллер, видимо забыл.
     
  13. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @Dron-Boy, ну подключение к БД обычно синглтон, а товар - это обычно объект, раз много товаров, то должна быть фабрика и тд.
     
  14. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    184
    @Dron-Boy контроллер этот как пульт от телевизора, в нём не должно быть толком никаких манипуляций, только запуск методов из модели.
     
  15. Dron-Boy

    Dron-Boy Старожил

    С нами с:
    20 ноя 2014
    Сообщения:
    1.041
    Симпатии:
    126
    Если в нем не будит никаких манипуляций с данными которые получаю из модели то тогда где они будут? или что ты имел ввиду?
     
  16. Maputo

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

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    @Dron-Boy, В качестве примера, можно было бы в модели создать свой объект товара и пару оберток для него - вывод на страницу и сохранение в БД. Этот паттерн называется "Декоратор"
    Про фабрику Вам уже написали.
     
  17. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    184
    @Dron-Boy Контроллер

    PHP:
    1.   $image = $request->file('image');
    2.      
    3.       $description = $request->input('description');
    4.      
    5.       $this->imageClass->add($image, $description);
    6.  
    7.       $this->imageClass->save();
    8.  
    9.       $idNewImage = $this->imageClass->id;
    10.       $categories = $request->input('choose-category');
    11.      
    12.       $relation = \App\Services\Image::find($idNewImage);
    13.        
    14.       $relation->categories()->attach($categories);
    15.          
    16.       return redirect('/');
    Модель

    PHP:
    1. public function add($image, $description)
    2.     {
    3.         $fileName = $image->store('uploads');
    4.         $this->image = $fileName;
    5.         $this->description = $description;
    6.         $this->id_user = Auth::id();
    7.     }
    --- Добавлено ---
    Нет, в моделе не обязательно должно быть только запросы в БД, модель для того, что бы выполнять в ней любые манипуляции с любыми данными (бд, изображения, тексты....), что бы разгрузить контроллер, в контроллер ты заходишь и должен сразу понять, что означает этот код, а за этим контроллером будет стоять модель, в которой вся сложная логика.

    Это как нажать нажать на педаль газа, если ты будешь на её жать, ты сразу поймёшь, что она будет делать (это контроллер), а то что твориться под капотом это модель.
     
  18. Maputo

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

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Контроллер в данном случае получает файл не из модели, а должен передать его на обработку в модель.
    Возможно "Строитель" Вам подошел бы лучше фабрики.
     
    #18 Maputo, 22 сен 2018
    Последнее редактирование: 22 сен 2018
  19. joshadow

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

    С нами с:
    24 фев 2015
    Сообщения:
    10
    Симпатии:
    1
    Вы знаете, в давние времена, когда и php то и не было, а программисты говорили отечественными словами, mvc называли Дакнные->Контроллер->Представление, что в сути обозначает жизненный цикл программы. Мне кажется, это было содранно с концепции REPL в лиспе http://lisper.ru/pcl/lather-rinse-r...те свой разум: Интерактивное программирование, да и в любом подобном программном ядре.
    По сути же, иногда встречаются люди, которые свято верят в то, что MVC - это не умозрительная концепция, а прям таки, форма конкретной реализации или, например, (о ужас!) - конкретный программный каркас(фреймворк). Так что, что там имелось в виду - надо спрашивать у тех, кто не одобрил Вашего тестового задания. У меня вот с одной тёткой как-то не заладилась работа, а потом я узнал, что при личной встрече, ей мои уши показались слишком грязные. Она сказала примерно так: "Я сразу догадалась что он плохой специалист, у него уши были грязные". Вот вам и всё собеседование.
     
  20. villiwalla

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

    С нами с:
    14 дек 2016
    Сообщения:
    471
    Симпатии:
    70
    Предподготовленыйе запросы надо использовать а не имитировать бурную деятельность :) Юзаете prepare а значение не биндите. Вывод доку читать не умеет или вообще копи-паста.

    Примеры из лапки совершенно не уместны.
     
  21. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @joshadow, при чём здесь умозрительная концепция? MVC - это способ отделения логики от представления, изменения в одной из этих священных букв ни коим образом не должны влиять на две другие. В итоге приложение может иметь одну модель, три контроллера и пять представлений которые работают одновременно и абсолютно не мешают друг другу.
     
  22. joshadow

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

    С нами с:
    24 фев 2015
    Сообщения:
    10
    Симпатии:
    1
    Да... Да... MVC это Данные-Представление-Контроллер. Но, имхо, это обусловлено, способом работы в ВЕБ. Идём на страничку. Для её формирования тянем из разных мест ДАННЫЕ(model - так, как любая база данных,вроде как, есть отражение свойств и взаимодействий части объектов реального мира(модель части реального мира)). На основе данных рисуем интерфейс ПРЕДСТАВЛЕНИЕ. И если нам надо что-то сделать - запускается КОНТРОЛЛЕР, то что производит некие действия. Например подменяет в строчичках кавычки, а потом вызывает методы для отправки их в модель ДАННЫХ. В принципе должна быть одна точка входа у всего проекта. Часто - контроллер, молча, после обработки делает перенаправление на страничку ПРЕДСТАВЛЕНИЯ.
    В итоге мы имеем. Файлик с описанием объекта базы данных (model). Его подтягивает рисователь интерфейса (view). И если есть команда на действие - то запускается обработчик(controller), подтягивающий под свои нужды объект базы данных, что-то делает и тихо перенаправляет на рисование интерфейса. Вроде того.
    Но как говорил один бородатый человек "Марксизм не догма, а руководство к действию". Я, например, часто леплю контроллер в начале файла, и внутренним флагом сигнала отрисовываю представление. Делаю, (о ужас!) несколько точек входа, для каждой группы задач свою. К примеру - отдельный интерфейс со своей точкой входа для справочника чего-нибудь. Канонически это не верно - но при этом нет необходимости тянуть всё сразу. От этого тока одна скорость исполнения :)
    --- Добавлено ---
    минуточку, но где же единая точка входа? :) Не творите себе кумира - все концепции умозрительны. На то они и концепции.
    --- Добавлено ---
    Да ладно Вам, разве это не родственные вещи REPL и MVC. Этож консольный дедушка и ВЕБ-клиентный сессионный внучёк :). Знакомство с дедулей, имхо, открывает путь к пониманию внучка. Говорят, что одним из эффективных методов познания - есть сравнение. Вот я и упомянул его.
     
  23. villiwalla

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

    С нами с:
    14 дек 2016
    Сообщения:
    471
    Симпатии:
    70
    У меня опечатка и я про ларавел говорил а не про лапку :) да и не тебе цитировал)
     
  24. mirosas

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

    С нами с:
    17 июл 2015
    Сообщения:
    235
    Симпатии:
    5
    Знаете.... причин почему вас могли не взять - масса. Может цветом волос не приглянулись, кто его знает..

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

    Плюс к этому я не увидел у вас отдельной html страницы на которой был бы реализован вывод данных. (увидел только php-страницу где все это реализовано).
     
    #24 mirosas, 23 сен 2018
    Последнее редактирование: 23 сен 2018
  25. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.750
    Симпатии:
    1.322
    Адрес:
    Лень
    А причем здесь роутер? тебе данные дали, и цель конкретного логического кода замутить.
    Ко мне в магазин субботу пришел клиент, и место того чтобы спросить это, то то, или вовсе выйти, стал выяснять отношения с своим рабочим прорабом. Мол тот указал где копать яму, а они выкопали совсем где не надо. В итоге обесточили водопровод где - то мини городок. Гейзером бьет и бла бла бла. Саму истеричку пришлось выгнать.
    --- Добавлено ---
    зачем постоянно добавлять концовку ?> ?
    Лично на это смотрю как кодер не вылез с пеленок