W następującym Laravel 5 Model powinien być metoda findByIdAndCourseOrFail
statyczne?Czy niestandardowa metoda wyszukiwania w modelu Laravel powinna być statyczna?
class Section extends Model {
//should this method be static?
public function findByIdAndCourseOrFail($id, $courseId)
{
$result = $this->where('id', $id)->where('course_id', $courseId)->first();
if (!is_null($result))
{
return $result;
}
throw (new ModelNotFoundException())->setModel(Section::class);
}
}
Z kontrolera:
class SectionsController extends Controller {
protected $sections;
public function __construct(Section $section)
{
$this->sections = $section;
}
public function foo($id, $courseId) //illustration only
{
$section = $this->sections->findOrFail($id);
$section = $this->sections->findByIdAndCourseOrFail($id, $courseId);
//would need to be non-static
$section = Section::findByIdAndCourseOrFail($id, $courseId);
//weird when compared with find above
}
Z jednej strony, nie jesteśmy działając na przykład sekcja [uwaga]. Z drugiej strony, w kontrolerze z autododatkowym wtryskiem przez Laravel's service container działalibyśmy na instancji: $sections = $this->sections-> findByIdAndCourseOrFail(7,3);
, a mój IDE (PhpStorm) skrzeczałby, jeśli Static
.
[Uwaga]: ten komentarz może być nieporozumieniem w działaniu modeli Laravel. Dla mnie, oczekiwałbym, że będzie to metoda klasy, a więc statyczna, w przeciwieństwie do instancji, która powróciłaby metoda find.
Dobrze, '$ this' nie jest dostępny metoda statyczna. – Xorifelse
Oczywiście, jeśli metoda zmieni się na statyczną, '$ this->' zostanie zmienione na 'self ::' – Gazzer
Ale wtedy 'gdzie()' i 'first()' również wymagają zmiany, a może wtedy cały "model", jeśli są tam zdefiniowane metody. – Xorifelse