dbwebb-se / mvc

Course repo for the mvc and object orientation in frameworks course - mvc.
Other
1 stars 4 forks source link

phpstan (Laravel Eloquent): "access to an undefined property" + "call to an undefined static method" #27

Closed xlsson closed 3 years ago

xlsson commented 3 years ago

Jag lyckas inte komma till rätta med dessa valideringsfel som genereras av phpstan.

Är det i min PHPDoc som definitionen ska göras, och hur ska den i så fall se ut? Jag hittar tyvärr inget som fungerar i de resurser jag hittat på nätet.

 ------ -------------------------------------------------------------------
  Line   app\Http\Controllers\YatzyController.php
 ------ -------------------------------------------------------------------
  85     Access to an undefined property App\Models\Highscore::$player.
  85     Access to an undefined property Illuminate\Http\Request::$player.
  86     Access to an undefined property App\Models\Highscore::$score.
  86     Access to an undefined property Illuminate\Http\Request::$score.
 ------ -------------------------------------------------------------------

 ------ --------------------------------------------------------------
  Line   app\Models\Book.php
 ------ --------------------------------------------------------------
  34     Access to an undefined property App\Models\Book::$isbn.
  35     Access to an undefined property App\Models\Book::$title.
  36     Access to an undefined property App\Models\Book::$author.
  37     Access to an undefined property App\Models\Book::$image_url.
 ------ --------------------------------------------------------------

 ------ -------------------------------------------------------------------------
  Line   app\Models\Highscore.php
 ------ -------------------------------------------------------------------------
  31     Call to an undefined static method App\Models\Highscore::orderByDesc().
 ------ -------------------------------------------------------------------------

Aktuell del ur YatzyController.php

    /**
     * Save submitted score and call highScores() to present highscores
     *
     * @param  Request  $request
     * @property  array  $request
     * @property object  $newScore
     * @return \Illuminate\Contracts\View\View
     */
    public function submitHighScore(Request $request)
    {
        $newScore = new Highscore();

        $newScore->player = $request->player;
        $newScore->score = $request->score;

        $newScore->save();

        return $this->highScores();
    }

Book.php:

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Book extends Model
{
    use HasFactory;

    /**
     * Indicates if the model should be timestamped.
     *
     * @var bool
     */
    public $timestamps = false;

    /**
     * Get all books from books table in database.
     *
     * @property array $books
     * @property object $bookDBObject
     * @property object $book
     * @return array $books
     */
    public function getAllBooks()
    {
        $bookDBObject = Book::all();
        $books = [];

        foreach ($bookDBObject as $book) {
            array_push($books, [
                'isbn' => $book->isbn,
                'title' => $book->title,
                'author' => $book->author,
                'image' => $book->image_url
            ]);
        }

        return $books;
    }
}

Highscore.php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Highscore extends Model
{
    use HasFactory;

    /**
     * Indicates if the model should be timestamped.
     *
     * @var bool
     */
    public $timestamps = false;

    /**
     * Get all highscores from highscores table in database.
     *
     * @property object  $highscoresDBObject
     * @property array $highscoresArray
     * @property int $rank
     * @property array $highscore
     * @return array $highscoresArray
     */
    public function getAllHighscores()
    {

        $highscoresDBObject = Highscore::orderByDesc('score')
                                ->limit(10)
                                ->get();

        $highscoresArray = [];
        $rank = 0;

        foreach ($highscoresDBObject as $highscore) {
            $rank += 1;
            array_push($highscoresArray, [
                'rank' => $rank,
                'player' => $highscore->player,
                'score' => $highscore->score,
                'date_played' => substr($highscore->date_played, 0, 10)
            ]);
        }

        return $highscoresArray;
    }
}
mosbth commented 3 years ago
 ------ -------------------------------------------------------------------------
  Line   app\Models\Highscore.php
 ------ -------------------------------------------------------------------------
  31     Call to an undefined static method App\Models\Highscore::orderByDesc().
 ------ -------------------------------------------------------------------------

        $highscoresDBObject = Highscore::orderByDesc('score')
                                ->limit(10)
                                ->get();

Jag är inte hundra på den konstruktionen, jag hade undvikit den, den känns inte 100. Jag hade prövat att byta ut Highscore mot self eller parent eller motsvarande. Eventuellt är det kopplat till valideringsfelet.

I övrigt så får du luta dig mot nätet. Eller acceptera att du inte hittar en lösning på dem. Jag hade själv behövt ett litet testprogram om jag skulle lösa valideringsfelen ovan. som du säger så är det access som properties som inte är helt uppenbara att de är deklarerade i de fallen du visar.

Eventuellt är det som du säger, att en PHPDoc kommentar som säger att propertyn finns kan lösa bekymret. Annars kan du låta det vara, kanske kommer du på det i nästa kmom då du har mer möjligheter att finslipa koden.

xlsson commented 3 years ago

Tack! Jag gjorde som du föreslog och använde self istället för Highscore.

För de andra anmärkningarna hittade jag en lösning i issuen nedan: nämligen att lägga till PHPDoc för alla kolumnamn som jag anropar i modellklassen som representerar tabellen. https://github.com/nunomaduro/larastan/issues/396

Ett litet steg framåt!