I am using Slim Framework 3 to create an API. Application structure: MVCP (model, view, controller, suppliers).
Is it possible to have a Slim Dependency Inject for all my classes?
I use composer to autoload all my dependencies.
My directory structure looks like this:
/app - controllers/ - Models/ - services/ index.php /vendor composer.json
Here is my composer.json file.
{ "require": { "slim/slim": "^3.3", "monolog/monolog": "^1.19" }, "autoload" : { "psr-4" : { "Controllers\\" : "app/controllers/", "Services\\" : "app/services/", "Models\\" : "app/models/" } } }
Here is my index.php file. Again, dependencies are automatically entered by the composer
<?php use \Psr\Http\Message\ServerRequestInterface as Request; use \Psr\Http\Message\ResponseInterface as Response; require '../vendor/autoload.php'; $container = new \Slim\Container; $app = new \Slim\App($container); $app->get('/test/{name}', '\Controllers\PeopleController:getEveryone'); $app->run();
My controller is as follows
<?php
My PeopleService file looks like this:
<?php namespace Services; use Model\PeopleModel; use Model\AddressModel; use Model\AutoModel; class PeopleService { protected $peopleModel; protected $autoModel; protected $addressModel; public function __construct(PeopleModel $peopleModel, AddressModel $addressModel, AutoModel $autoModel) { $this->addressModel = $addressModel; $this->autoModel = $autoModel; $this->peopleModel = $peopleModel; } public function getAllPeopleInfo() { $address = $this->addressModel->getAddress(); $auto = $this->autoModel->getAutoMake(); $person = $this->peopleModel->getPeople(); return [ $person[1], $address[1], $auto[1] ]; } }
Models/AddressModels.php
<?php namespace Model; class AddressModel { public function __construct() {
Models/AutoModel.php
namespace Model; class AutoModel { public function __construct() {
Models/PeopleModel.php
<?php namespace Model; class PeopleModel { public function __construct() {
ERROR Now I get the following error:
PHP Catchable fatal error: Argument 2 passed to Controllers\PeopleController::__construct() must be an instance of Services\PeopleService, none given, called in /var/www/vendor/slim/slim/Slim/CallableResolver.php on line 64 and defined in /var/www/app/controllers/PeopleController.php on line 21
QUESTION How can I use all my classes? Is there a way to automatically tell Slim DI Container to do this?