За последние 24 часа нас посетили 22246 программистов и 1029 роботов. Сейчас ищут 674 программиста ...

Концептуальные вопросы))

Тема в разделе "PHP для новичков", создана пользователем Алекс8, 13 окт 2018.

  1. Алекс8

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

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    Привет всем)) делают тут проект на Slim3
    Использую liuminate/Database качестве конструктора запросов (хз можно его назвать ORMом или нет)
    вот к примеру экшен из контроллера

    PHP:
    1.     /**
    2.      * Меняем статус видео active||inactive
    3.      * @param type $request
    4.      * @param type $response
    5.      * @return type
    6.      */
    7.     public function ajaxChangeStatus($request, $response) {
    8.  
    9.         //Инициализируем ответ
    10.         $result = [
    11.             'errors' => [],
    12.             'status' => '',
    13.         ];
    14.  
    15.         //Проверям валидность даных
    16.         $validation = $this->validator->validate($request, [
    17.             'id' => v::intVal(), //todo добавить isAllowVideoEdit
    18.         ]);
    19.  
    20.         //Решаем как жить дальше..
    21.         if ($validation->failed()) {
    22.             $result['errors'][] = 'id is not int';
    23.         } else {
    24.             $video = Video::where('id', $request->getParam('id'))->first();
    25.         }
    26.      
    27.         //Проверяем есть ли такая запись
    28.         if(empty($video)){
    29.             $result['errors'][] = 'item not found';
    30.         } else {
    31.             $newStatus = $video->status == 'active' ? 'inactive' : 'active';
    32.             $video->status = $newStatus;
    33.             $video->save();
    34.             $result['status'] = $newStatus;
    35.         }
    36.  
    37.         //Отдаем ответ
    38.         return $response->withJson($result);
    39.     }
    вот по этому короткому коду у меня есть несколько вопросов..

    1. Как видите тут есть todo
    PHP:
    1.             'id' => v::intVal(), //todo добавить isAllowVideoEdit
    я использую Respect валидатор.. и если кто то хочет редактировать/изменять запись с определенным ID то я кастомным правилом проверяю - является ли инициатор данного действия владельцем этой записи (или админом/модератором). Правильный ли это подход? Или лучше как то по другому проверять.. например через посредники.. я этот вопрос уже в чате задавал.. но все равно он меня волнует))
    2. Дальше вопрос в частности по Illuminate\Database и в общем по концепции ActiveRecords
    Запись я достаю
    PHP:
    1.             $video = Video::where('id', $request->getParam('id'))->first();
    2.1. насколько это корректно делать в контроллере? может лучше сделать в модельке метод getById ?
    2.2. насколько правильно это делать через статический метод? может лучше создавать объект? и его заполнять данными из базы?

    так то все работает)) меня просто все время феншуй волнует))
    Спасибо))
     
  2. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    По поводу 2 - ведут жаркие споры, от "Active Record нарушает SOLID и потому какаха", до того, что просто достаточно создать ещё один слой в приложении - сервисы, и туда вынести все эти упражнения с AR. Лично моё мнение по этому поводу и вообще по поводу "чистого кода" - если проект не очень большой, то можно хоть прямо в контроллерах, чем больше проект, тем чище он должен быть с точки зрения теории ООП
     
    Zuldek и Алекс8 нравится это.
  3. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.745
    Симпатии:
    1.319
    Адрес:
    Лень
    PHP:
    1. //Решаем как жить дальше..
    2. if ($validation->failed()) {
    3.     $result['errors'][] = 'id is not int';
    4. } else {
    5.     $video = Video::where('id', $request->getParam('id'))->first();
    6. }
    7.  
    8. //Проверяем есть ли такая запись
    9. if(empty($video)){
    10.     $result['errors'][] = 'item not found';
    11. } else {
    12.     $newStatus = $video->status == 'active' ? 'inactive' : 'active';
    13.     $video->status = $newStatus;
    14.     $video->save();
    15.     $result['status'] = $newStatus;
    16. }
    PHP:
    1. //Решаем как жить дальше..
    2. if ( $validation -> failed() )
    3. {
    4.     $result['errors'][] = 'id is not int';
    5.     $result['errors'][] = 'item not found';
    6. }
    7. else
    8. {
    9.     $video = Video :: where( 'id', $request -> getParam( 'id' ) ) -> first();
    10.     $video -> status = $result['status'] = $video -> status == 'active' ? 'inactive' : 'active';
    11.     $video -> save();
    12. }
    --- Добавлено ---
    PHP:
    1. $video -> status == 'active' ? 'inactive' : 'active'
    Настораживает: если актив, то неактив, либо наоборот.
    --- Добавлено ---
    Минута и другой нюанс:
    PHP:
    1. //Решаем как жить дальше..
    2. if ( $validation -> failed() )
    3. {
    4.   $result['errors'][] = 'id is not int';
    5.  
    6. }
    7. elseif ( $video = Video :: where( 'id', $request -> getParam( 'id' ) ) -> first() )
    8. {
    9.    $video -> status = $result['status'] = $video -> status == 'active' ? 'inactive' : 'active';
    10.    $video -> save();
    11. }
    12. else
    13. {
    14.    $result['errors'][] = 'item not found';
    15. }
    --- Добавлено ---
    1 решение по логике правильное, но мое мнение на последнем остается
     
    #3 MouseZver, 13 окт 2018
    Последнее редактирование: 13 окт 2018