Rafael Munoz
Rafael Munoz

Reputation: 656

Laravel: Class not found if it is called from a Trait

After creating several Apps with Laravel and using softDelete properties I realized that methods like destroy(), restore() and kill() are exactly the same among several controllers. Therefore I am trying to put themn in a trait and use it from diferent Controllers.

My code is as follows:

ProfilesController.php

<?php

namespace App\Http\Controllers;
use App\Profile;

class ProfilesController extends Controller
{

    public function destroy(Profile $profile)
    {
        Profile::del($profile, 'profiles');
        return redirect()->route('profiles.index');
    }

    public function trashed()
    {
        Profile::trash('Profile');
    }
}

Profile.php (model)

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Profile extends Model
{

    protected $fillable = ['user_id', 'role_id', 'title', 'subtitle', 'slug', 'birthday', 'about'];

    use SoftDeletes, Helpers, commonMethods;

    public function getRouteKeyName()
    {
        return 'slug';
    }
    // ... more code here 
}

trait file: commonMethods.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Auth;
use App\Profile;
use Session;

trait commonMethods
{

    public static function del($element, $page_name)
    {
        $element->delete();
        Session::flash('success', $element . ' successfully deleted!');
    }

    public static function trash($model)
    {
        $total = $model::onlyTrashed()->get();
        $total_tr = count($total);
        $all_tr = $model::all();

        return view('partials.templates.trashed', compact('total', 'total_tr', 'all_tr'));
    }

// ...more code here 
}

The problem:

I have debugged and the $model variable contains exactly what I need, the string 'Profile' which is what I need to build the Query:

$total = Profile::onlyTrashed()->get();

This query works while in the ProfilesController, but does not work while in a trait, since the model class is not found.

Any idea how could I make it work?

I am using Laravel 6.

Upvotes: 0

Views: 423

Answers (2)

lagbox
lagbox

Reputation: 50491

If you need to use a class as a string you will want to use its full name. 'App\Profile' instead of 'Profile'.

$model = 'Profile';
new $model; // will use `\Profile`

$model = 'App\Profile';
new $model; // will use '\App\Profile';

Upvotes: 1

Yasin Patel
Yasin Patel

Reputation: 5731

In your controller( ProfilesController ) write :

use App\Profile;

In your model write :

use App\commonMethods;

Upvotes: 0

Related Questions