Привет всем)) делают тут проект на Slim3 Использую liuminate/Database качестве конструктора запросов (хз можно его назвать ORMом или нет) вот к примеру экшен из контроллера PHP: /** * Меняем статус видео active||inactive * @param type $request * @param type $response * @return type */ public function ajaxChangeStatus($request, $response) { //Инициализируем ответ $result = [ 'errors' => [], 'status' => '', ]; //Проверям валидность даных $validation = $this->validator->validate($request, [ 'id' => v::intVal(), //todo добавить isAllowVideoEdit ]); //Решаем как жить дальше.. if ($validation->failed()) { $result['errors'][] = 'id is not int'; } else { $video = Video::where('id', $request->getParam('id'))->first(); } //Проверяем есть ли такая запись if(empty($video)){ $result['errors'][] = 'item not found'; } else { $newStatus = $video->status == 'active' ? 'inactive' : 'active'; $video->status = $newStatus; $video->save(); $result['status'] = $newStatus; } //Отдаем ответ return $response->withJson($result); } вот по этому короткому коду у меня есть несколько вопросов.. 1. Как видите тут есть todo PHP: 'id' => v::intVal(), //todo добавить isAllowVideoEdit я использую Respect валидатор.. и если кто то хочет редактировать/изменять запись с определенным ID то я кастомным правилом проверяю - является ли инициатор данного действия владельцем этой записи (или админом/модератором). Правильный ли это подход? Или лучше как то по другому проверять.. например через посредники.. я этот вопрос уже в чате задавал.. но все равно он меня волнует)) 2. Дальше вопрос в частности по Illuminate\Database и в общем по концепции ActiveRecords Запись я достаю PHP: $video = Video::where('id', $request->getParam('id'))->first(); 2.1. насколько это корректно делать в контроллере? может лучше сделать в модельке метод getById ? 2.2. насколько правильно это делать через статический метод? может лучше создавать объект? и его заполнять данными из базы? так то все работает)) меня просто все время феншуй волнует)) Спасибо))
По поводу 2 - ведут жаркие споры, от "Active Record нарушает SOLID и потому какаха", до того, что просто достаточно создать ещё один слой в приложении - сервисы, и туда вынести все эти упражнения с AR. Лично моё мнение по этому поводу и вообще по поводу "чистого кода" - если проект не очень большой, то можно хоть прямо в контроллерах, чем больше проект, тем чище он должен быть с точки зрения теории ООП
PHP: //Решаем как жить дальше.. if ($validation->failed()) { $result['errors'][] = 'id is not int'; } else { $video = Video::where('id', $request->getParam('id'))->first(); } //Проверяем есть ли такая запись if(empty($video)){ $result['errors'][] = 'item not found'; } else { $newStatus = $video->status == 'active' ? 'inactive' : 'active'; $video->status = $newStatus; $video->save(); $result['status'] = $newStatus; } PHP: //Решаем как жить дальше.. if ( $validation -> failed() ) { $result['errors'][] = 'id is not int'; $result['errors'][] = 'item not found'; } else { $video = Video :: where( 'id', $request -> getParam( 'id' ) ) -> first(); $video -> status = $result['status'] = $video -> status == 'active' ? 'inactive' : 'active'; $video -> save(); } --- Добавлено --- PHP: $video -> status == 'active' ? 'inactive' : 'active' Настораживает: если актив, то неактив, либо наоборот. --- Добавлено --- Минута и другой нюанс: PHP: //Решаем как жить дальше.. if ( $validation -> failed() ) { $result['errors'][] = 'id is not int'; } elseif ( $video = Video :: where( 'id', $request -> getParam( 'id' ) ) -> first() ) { $video -> status = $result['status'] = $video -> status == 'active' ? 'inactive' : 'active'; $video -> save(); } else { $result['errors'][] = 'item not found'; } --- Добавлено --- 1 решение по логике правильное, но мое мнение на последнем остается