web-dev-qa-db-fra.com

PHPStorm ne reconnaît pas les méthodes de ma classe Model dans Laravel 5.0

échec de l'insertion des données dans la base de données, et toutes les classes de requête et la méthode de la classe Model non trouvées s'affichent dans IDE (phpStrom) comment puis-je le résoudre?

voici ma classe étendue (Post.php) ici afficher l'erreur dans la dernière méthode et où:

<?php namespace App;

use Carbon\Carbon;
use Illuminate\Database\Eloquent\Model;

class Post extends Model {

    protected  $fillable=[
        'title',
        'description',
        'location',
        'contact',
        'type',
        'published_at'
    ];
    protected $date=['published_at'];
    public function setPublishedAtAttribute($date)
    {
        $this->attributes['published_at'] = Carbon::createFromFormat('Y-m-d', $date);
    }

    /**
     * @param $query
     */
    public function scopePublished($query)
    {
        $query->where('published_at', '<=', Carbon::now());
    }

    public function scopeUnPublished($query)
    {
        $query->where('published_at', '>=', Carbon::now());
    }

    /**
     * An post is owned by a user.
     * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
     */
    public function user(){
        return $this->belongsTo('App\User');
    }

} 

et voici ma classe Controller où je l'utilise:

<?php namespace App\Http\Controllers;

use App\Http\Requests;

use App\Http\Requests\CreatePostRequest;
use App\Post;
use Request;
use Illuminate\Support\Facades\Auth;
use Session;

class PostsController extends Controller {

    //
    public function __construct()
    {
        $this->middleware('auth');
    }

    public function index()
    {
        //return \Auth::user()->name;
        $posts = Post::latest('published_at')->published()->get();
        $latest= Post::latest()->first();
        return view('tolet.index', compact('posts','latest'));

    }

    /**
     * @param Post $post
     * @return \Illuminate\View\View
     * @internal param Articles $article
     * @internal param Articles $articles
     */
    public function show(Post $post)
    {

        return view('tolet.show', compact('post'));
    }

    public function create()
    {
        if (Auth::guest()) {
            return redirect('tolet.index');
        }
        return view('tolet.create');
    }

    /**
     * @param CreatePostRequest $request
     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
     */
    public function store(CreatePostRequest $request)
    {
        //validation

        $this->createPost($request);


       // flash('Your tolet has been created!')->important();

        return redirect('tolet.index');
    }

    /**
     * @param Post $post
     * @return \Illuminate\View\View
     * @internal param Articles $article
     */
    public function edit(Post $post)
    {
        return view('tolet.edit', compact('post'));
    }


    /**
     * @param Post $post
     * @param CreatePostRequest $request
     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
     * @internal param Articles $article
     * @internal param $id
     */
    public function update(Post $post, CreatePostRequest $request)
    {
        $post->update($request->all());
        return redirect('tolet.index');
    }

    /**
     * sync up the list of tags in the database
     *
     * @param Post $post
     */


    /**
     * save a new post
     *
     * @param CreatePostRequest $request
     * @return mixed
     */
    private function createPost(CreatePostRequest $request)
    {
        $post = Auth::user()->posts()->create($request->all());

        return $post;
    }


}
21
Osman Goni Nahid

Si vous voulez qu'une classe étendant Model reconnaisse les méthodes Eloquent, ajoutez simplement ce qui suit dans le commentaire PHPDoc supérieur sur la classe:

@mixin Eloquent

Exemple:

<?php namespace App;

use Carbon\Carbon;
use Eloquent;
use Illuminate\Database\Eloquent\Model;

/**
 * Post
 *
 * @mixin Eloquent
 */
class Post extends Model {

Remarque: La plupart d'entre vous utilisent probablement ide-helper pour Laravel, donc cela @mixin l'attribut est généré automatiquement pour les classes de modèle.

38
Tomáš Staník

Puisque les méthodes where, latest, find, findOrFail et d'autres n'existent pas dans la classe Model, mais dans Builder et sont chargés via des méthodes magiques, le IDE ne peut pas les détecter.

Bien que le très suggéré laravel-ide-helper soit génial, il n'aide pas également. Il existe plusieurs problèmes et discussions et solutions de contournement sur le sujet, mais tous ont leurs propres problèmes.

La meilleure solution que j'ai trouvée jusqu'à présent, à mon humble avis est de rétrograder la gravité si des méthodes __magic sont présentes dans la classe . PhpStorm a cette option exacte dans les paramètres d'inspection.

Enregistrement Settings -> Inspections -> PHP -> Undefined -> Undefined method Cela ne vous permet pas de cliquer sur la méthode, mais désactive simplement le balisage gênant. En savoir plus sur les sévérités ou vérifiez cela plus expressif SO réponse

26
ruuter

Pour tous ceux qui sont venus ici pour une solution, ce qui a fonctionné pour moi, c'est la solution dans ce StackOverflow:

PhpStorm laravel 5 introuvable

spécifiquement quand j'ai couru:

Edit: pour utiliser cette commande, vous devez installer ide-helper , exécutez:

composer require --dev barryvdh/laravel-ide-helper 

...

php artisan ide-helper:models

et a répondu "oui"

après cela, les méthodes sont reconnues.

14
Amr El Massry

Ma classe. Les annotations aideront PhpStorm à reconnaître ces méthodes.

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Query\Builder;

/**
 * @method static Builder where($column, $operator = null, $value = null, $boolean = 'and')
 * @method static Builder create(array $attributes = [])
 * @method public Builder update(array $values)
 */
class User extends Model
{
    protected $table    = 'users';
    protected $fillable = [
        'email',
        'name',
        'password',
    ];
}
8
Patrioticcow

J'ai trouvé une solution qui fonctionnait et qui était simple après avoir essayé le _ide_help.php solution de Barry. Vidéo Laracast montrant la solution: https://laracasts.com/series/how-to-be-awesome-in-phpstorm/episodes/15 - Dans le premier commentaire, vous pouvez trouver les liens de Barry .

Après avoir ajouté cela, cela n'a pas fonctionné pour moi, mais je le mentionne toujours pour être terminé.

Ensuite, j'ai essayé ceci:

Dans mon modèle, j'ai ajouté use Eloquent; au sommet. (J'ai ajouté l'Eloquent en guise de complétion automatique au lieu de taper).

Ensuite, au-dessus de ma classe, j'ai tapé "/ ** hit ENTER" qui a généré automatiquement PHP Docs dans le nouveau PHP Docs que j'ai ajouté @mixin Eloquent en bas.

Comme dernière étape, j'ai touché Ctrl+Alt+Y (paramètres par défaut) qui est synchroniser (Fichier-> Synchroniser) dans PhpStorm.

Cela a corrigé les avertissements et ma méthode :: find dans mon contrôleur a été trouvée et la complétion automatique fonctionnait.

Ci-dessous ma classe à titre d'exemple:

namespace App;

use Illuminate\Database\Eloquent\Model; <br>
use Eloquent;


/** 
 * Class Student
 * @package App 
 * @mixin Eloquent 
 */ 
class Student extends Model <br>
{

}
3
xrayin

Un peu ennuyeux à ajouter à tous vos modèles, mais vous pouvez ajouter la méthode à votre docblock de modèles. Cela le fera fonctionner correctement dans PHPStorm.

/*
 * @method static \Illuminate\Database\Query\Builder|\App\MyModelName where($field, $value)
 */
3

Vous pouvez ajouter @mixin QueryBuilder en phpdoc de Model Classe

Chemin du fichier : project_path\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Model.php

2
MH.Kashizadeh

Je suis nouveau sur laravel et tous ces problèmes avec les modèles et phpstorm sont très étranges. C'est un gros inconvénient. Les solutions comme l'ajout de @mixin Eloquent ou l'exécution de php artisan ide-helper: models didn ' t fonctionne pour moi. PHPStorm ne trouve pas Eloquent ou\Eloquent. ide-helper: les modèles n'ajoutent pas toutes les méthodes statiques utilisables. Je suis donc venu avec un propre modèle de base qui contient un doc php avec toutes les méthodes de modèle pertinentes:

<?php

namespace App;

use Closure;
use Illuminate\Contracts\Pagination\LengthAwarePaginator;
use Illuminate\Contracts\Pagination\Paginator;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Model as EloquentModel;
use Illuminate\Database\Eloquent\Builder as EloquentBuilder;
use Illuminate\Database\Query\Builder as QueryBuilder;

/**
 * Class BaseModel
 * @package App
 * @method EloquentModel|Collection|null static $this find($id, $columns = ['*']) Find a model by its primary key.
 * @method EloquentModel|EloquentBuilder|null first($columns = ['*']) Execute the query and get the first result.
 * @method EloquentModel|EloquentBuilder firstOrFail($columns = ['*']) Execute the query and get the first result or throw an exception.
 * @method Collection|EloquentBuilder[] get($columns = ['*']) Execute the query as a "select" statement.
 * @method mixed value($column) Get a single column's value from the first result of a query.
 * @method mixed pluck($column) Get a single column's value from the first result of a query.
 * @method void chunk($count, callable $callback) Chunk the results of the query.
 * @method \Illuminate\Support\Collection lists($column, $key = null) Get an array with the values of a given column.
 * @method LengthAwarePaginator paginate($perPage = null, $columns = ['*'], $pageName = 'page', $page = null) Paginate the given query.
 * @method Paginator simplePaginate($perPage = null, $columns = ['*'], $pageName = 'page') Paginate the given query into a simple paginator.
 * @method int increment($column, $amount = 1, array $extra = []) Increment a column's value by a given amount.
 * @method int decrement($column, $amount = 1, array $extra = []) Decrement a column's value by a given amount.
 * @method void onDelete(Closure $callback) Register a replacement for the default delete function.
 * @method EloquentModel[] getModels($columns = ['*']) Get the hydrated models without eager loading.
 * @method array eagerLoadRelations(array $models) Eager load the relationships for the models.
 * @method array loadRelation(array $models, $name, Closure $constraints) Eagerly load the relationship on a set of models.
 * @method static EloquentBuilder where($column, $operator = null, $value = null, $boolean = 'and') Add a basic where clause to the query.
 * @method EloquentBuilder orWhere($column, $operator = null, $value = null) Add an "or where" clause to the query.
 * @method EloquentBuilder has($relation, $operator = '>=', $count = 1, $boolean = 'and', Closure $callback = null) Add a relationship count condition to the query.
 * @method static EloquentBuilder find($value)
 * @method static EloquentBuilder orderBy($column, $direction = 'asc')
 * @method static EloquentBuilder select($columns = ['*'])
 *
 *
 * @method static QueryBuilder whereRaw($sql, array $bindings = [])
 * @method static QueryBuilder whereBetween($column, array $values)
 * @method static QueryBuilder whereNotBetween($column, array $values)
 * @method static QueryBuilder whereNested(Closure $callback)
 * @method static QueryBuilder addNestedWhereQuery($query)
 * @method static QueryBuilder whereExists(Closure $callback)
 * @method static QueryBuilder whereNotExists(Closure $callback)
 * @method static QueryBuilder whereIn($column, $values)
 * @method static QueryBuilder whereNotIn($column, $values)
 * @method static QueryBuilder whereNull($column)
 * @method static QueryBuilder whereNotNull($column)
 * @method static QueryBuilder orWhereRaw($sql, array $bindings = [])
 * @method static QueryBuilder orWhereBetween($column, array $values)
 * @method static QueryBuilder orWhereNotBetween($column, array $values)
 * @method static QueryBuilder orWhereExists(Closure $callback)
 * @method static QueryBuilder orWhereNotExists(Closure $callback)
 * @method static QueryBuilder orWhereIn($column, $values)
 * @method static QueryBuilder orWhereNotIn($column, $values)
 * @method static QueryBuilder orWhereNull($column)
 * @method static QueryBuilder orWhereNotNull($column)
 * @method static QueryBuilder whereDate($column, $operator, $value)
 * @method static QueryBuilder whereDay($column, $operator, $value)
 * @method static QueryBuilder whereMonth($column, $operator, $value)
 * @method static QueryBuilder whereYear($column, $operator, $value)
 */
abstract class BaseModel extends Model
{

}

Ensuite, mes propres modèles étendent ce modèle:

<?php

 namespace Modules\Shop\Entities;

 use App\BaseModel;


 class MyEntity extends BaseModel

Et puis tout fonctionne. Le BaseModel n'est désormais pas complet, n'hésitez pas à ajouter d'autres méthodes statiques, je les ajoute sur demande.

2
Rawburner

Pour pouvoir répondre à cette question, vous avez besoin du laravel ide-helper. Suivez ces instructions et tout devrait fonctionner pour vous.

0
Dylan Buth

D'accord et +1 @ rutter. J'ajouterais que ce problème me revient constamment à l'esprit puisque je me concentre sur les projets Laravel.

Laravel-IDE Git de Barry est merveilleux pour les méthodes `` de base '', il ne peut pas vraiment capturer tous les problèmes, cela se produit souvent avec la portée du package du fournisseur de Laravel (qui plus tard est appelée via d'autres classes/méthodes ..)

Je lance la balle là-bas, mais si intelliJ créait un compilateur qui pourrait essayer/attraper les méthodes magiques définies (après qu'elles soient définies) sur un seul bouton, appuyez (renvoyant un bool et en cas de succès, la route vers la méthode) eh bien ... ce serait génial.

Désactiver la gravité est un moyen cool de le gérer (développé ci-dessus), mais vous êtes toujours bloqué sans un raccourci facile vers la méthode ou même vous faire savoir qu'elle existe.

De manière constructive, je suggère qu'ils fassent que le bouton de synchronisation signifie quelque chose (autre que le rafraîchissement).

0
clusterBuddy

J'ai résolu de cette façon.

Il y a un grand IDE support pour Laravel expédié de Baryvdh:

https://github.com/barryvdh/laravel-ide-helper

après l'avoir installé, vous appelez simplement dans la console:

php artisan ide-helper:generate

qui génèrent tous les raccourcis facede dans le fichier _ide_helper.php (que vous devez exclure de git)

Il y a aussi quelque chose de spécial pour PhpStorm:

php artisan ide-helper:meta
0