Laravel 4 - Child constructor call parent constructor with dependency injection

后端 未结 6 1934
死守一世寂寞
死守一世寂寞 2021-02-05 02:53

I\'m building a CMS using Laravel 4 and I have a base admin controller for the admin pages that looks something like this:

class AdminController extends BaseCont         


        
6条回答
  •  南旧
    南旧 (楼主)
    2021-02-05 03:29

    There's a way. When BaseController autoresolves it's dependecies.

    use Illuminate\Routing\Controller;
    use Illuminate\Foundation\Application;
    
    // Dependencies
    use Illuminate\Auth\AuthManager;
    use Prologue\Alerts\AlertsMessageBag;
    
    class BaseController extends Controller {
    
        protected $authManager;
        protected $alerts;
    
        public function __construct(
            // Required for resolving
            Application $app,
    
            // Dependencies
            AuthManager $authManager = null,
            AlertsMessageBag $alerts = null
        )
        {
            static $dependencies;
    
            // Get parameters
            if ($dependencies === null)
            {
                $reflector = new \ReflectionClass(__CLASS__);
                $constructor = $reflector->getConstructor()
                $dependencies = $constructor->getParameters();
            }
    
            foreach ($dependencies as $dependency)
            {
                // Process only omitted optional parameters
                if (${$dependency->name} === null)
                {
                    // Assign variable
                    ${$dependency->name} = $app->make($dependency->getClass()->name);
                }
            }
    
    
            $this->authManager = $authManager;
            $this->alerts = $alerts;
    
            // Test it
            dd($authManager);
        }
    }
    

    So in child controller you pass only Application instance:

    class MyController extends BaseController {
    
        public function __construct(
            // Class dependencies resolved in BaseController
            //..
    
            // Application
            Application $app
        )
        {
            // Logic here
            //..
    
    
            // Invoke parent
            parent::__construct($app);
        }
    }
    

    Of course, we could use Facade for application

提交回复
热议问题