Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

Turaylon's avatar

I have done something like this and i came to this solution:

abstract class AbstractApiCrudController extends Controller
{
    
    protected function __store($request)
    {
          //logic to store here
    }

 }

and in the child controller class:

class BrandController extends AbstractApiCrudController
{
   public function store(BrandRequest $request)
    {
        return parent::__store($request);
    }
 }

Hope this can help.

2 likes
ctwyw's avatar
class AbstractAAA extends BaseController
{
    public $storeRequest = "\App\Http\Request\Admin\StoreRequest";
    public $updateRequest = "\App\Http\Request\Admin\UpdateRequest";

    public function __construct()
    {
        parent::__construct();

        \App::bind('\App\Http\Requests\Admin\A ', $this->storeRequest);
    }

   public function store(A $request) {

   }
}
class XXXXController extends AbstractAAA
{
    public $storeRequest = "\App\Http\Requests\Admin\XXXX";

    public function __construct()
    {
        parent::__construct();
    }
}


gpap's avatar

If anyone reads this, please write your thoughts!

Because I didn't like any of the answers found on the web for this particular problem, I ended up with this:

CrudController.php

abstract class CrudController extends Controller implements CrudInterface
{
    /**
     * Name of the resource, in lowercase plural form.
     * (e.g. User -> users)
     *
     * @var string
     */
    protected $resource;

    /**
     * Model instance.
     *
     * @var Model
     */
    private $instance;

    /**
     * Set an instance of the model.
     *
     * @return void
     */
    function __construct()
    {
        $this->resource = str_plural(strtolower(class_basename(static::$model)));
        $this->instance = new static::$model;

        // @todo Find out if this is good practice?
        // Contextual binding did not work in Service Providers...
        app()->bind(Request::class, function ($app) {
            return $app->make(static::$requestClass);
        });
    }

    // ...

    /**
     * Store a newly created resource in database.
     *
     * @param Request
     * @return void
     */
    public function store(Request $request)
    {
        $this->instance->create($request->all());
        return redirect()->route($this->resource.'.index');
    }

UserController.php

class UserController extends CrudController
{

    /**
     * Name of the Model and From Request classes.
     *
     * @var string
     */
    protected static $model = User::class;
    protected static $requestClass = UserRequest::class;
}

UserRequest.php

class UserRequest extends Request
{

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        $route = $this->route()->getName();

        if ($route === 'users.store') return [
            'username' => 'required|alpha_dash|unique:users,username',
            'email' => 'required|email|unique:users,email',
            'password' => 'required|confirmed'
        ];

        if ($route === 'users.update') return [
            'username' => 'required|alpha_dash|unique:users,username,' . $this->user->id,
            'email' => 'required|email|unique:users,email,' . $this->user->id,
            'password' => 'confirmed'
        ];

        return [];
    }
}
Previous

Please or to participate in this conversation.