How to achieve inversion of control in a front controller pattern?
I'm stuck at making dependency injection between controllers-services, services-database, I feel like it's a mess.
All the requests are redirected to index.php from public_html, in there
In index.php from public_html, I'm creating an app object, serving it a router and set up some routes like:
$app = new Application(new Router());
$app->addRoute('/questions', (Object)[
'controller' => 'QuestionsController',
'action' => 'getAllQuestions'
]);
I'm matching the URI against regex routes and instantiating the controller somehow "dynamically" depending on the route inside Application.php which maps to a controller and an action:
if(class_exists($this->controllerNamespace)){
$this->router->setController(new $this->controllerNamespace);
call_user_func_array([$this->router->getController(), $this->router->getAction()], [$this->router->getParams()]);
}
Inside the controller, I would instantiate a Service object and call a method on the service to retrieve db results.
The service in turn needs a database object in order to interact with the database and my database class is something like a singleton I suppose:
static function getInstance():Database
{
if (NULL == self::$database) {
self::$database = new Database();
}
return self::$database;
}
so I wouldn't know what service the controller needs until I'm actually inside the controller and the database instantiated inside the service class just seems wrong, how can I improve the whole thing?
My preference is without other libs for a dependency injection controller or other stuff that makes it easy, I'm writing this as a learning exercise to understand it better.
app
src
Controllers
Questions
Answers
Core
Controller
Database
Router
Service
View
Services
Questions
Answers
Views
index.php
Application.php
Config.php
tests
vendor
logs
public_html
assets
index.php
.htaccess
php dependency-injection
add a comment |
I'm stuck at making dependency injection between controllers-services, services-database, I feel like it's a mess.
All the requests are redirected to index.php from public_html, in there
In index.php from public_html, I'm creating an app object, serving it a router and set up some routes like:
$app = new Application(new Router());
$app->addRoute('/questions', (Object)[
'controller' => 'QuestionsController',
'action' => 'getAllQuestions'
]);
I'm matching the URI against regex routes and instantiating the controller somehow "dynamically" depending on the route inside Application.php which maps to a controller and an action:
if(class_exists($this->controllerNamespace)){
$this->router->setController(new $this->controllerNamespace);
call_user_func_array([$this->router->getController(), $this->router->getAction()], [$this->router->getParams()]);
}
Inside the controller, I would instantiate a Service object and call a method on the service to retrieve db results.
The service in turn needs a database object in order to interact with the database and my database class is something like a singleton I suppose:
static function getInstance():Database
{
if (NULL == self::$database) {
self::$database = new Database();
}
return self::$database;
}
so I wouldn't know what service the controller needs until I'm actually inside the controller and the database instantiated inside the service class just seems wrong, how can I improve the whole thing?
My preference is without other libs for a dependency injection controller or other stuff that makes it easy, I'm writing this as a learning exercise to understand it better.
app
src
Controllers
Questions
Answers
Core
Controller
Database
Router
Service
View
Services
Questions
Answers
Views
index.php
Application.php
Config.php
tests
vendor
logs
public_html
assets
index.php
.htaccess
php dependency-injection
add a comment |
I'm stuck at making dependency injection between controllers-services, services-database, I feel like it's a mess.
All the requests are redirected to index.php from public_html, in there
In index.php from public_html, I'm creating an app object, serving it a router and set up some routes like:
$app = new Application(new Router());
$app->addRoute('/questions', (Object)[
'controller' => 'QuestionsController',
'action' => 'getAllQuestions'
]);
I'm matching the URI against regex routes and instantiating the controller somehow "dynamically" depending on the route inside Application.php which maps to a controller and an action:
if(class_exists($this->controllerNamespace)){
$this->router->setController(new $this->controllerNamespace);
call_user_func_array([$this->router->getController(), $this->router->getAction()], [$this->router->getParams()]);
}
Inside the controller, I would instantiate a Service object and call a method on the service to retrieve db results.
The service in turn needs a database object in order to interact with the database and my database class is something like a singleton I suppose:
static function getInstance():Database
{
if (NULL == self::$database) {
self::$database = new Database();
}
return self::$database;
}
so I wouldn't know what service the controller needs until I'm actually inside the controller and the database instantiated inside the service class just seems wrong, how can I improve the whole thing?
My preference is without other libs for a dependency injection controller or other stuff that makes it easy, I'm writing this as a learning exercise to understand it better.
app
src
Controllers
Questions
Answers
Core
Controller
Database
Router
Service
View
Services
Questions
Answers
Views
index.php
Application.php
Config.php
tests
vendor
logs
public_html
assets
index.php
.htaccess
php dependency-injection
I'm stuck at making dependency injection between controllers-services, services-database, I feel like it's a mess.
All the requests are redirected to index.php from public_html, in there
In index.php from public_html, I'm creating an app object, serving it a router and set up some routes like:
$app = new Application(new Router());
$app->addRoute('/questions', (Object)[
'controller' => 'QuestionsController',
'action' => 'getAllQuestions'
]);
I'm matching the URI against regex routes and instantiating the controller somehow "dynamically" depending on the route inside Application.php which maps to a controller and an action:
if(class_exists($this->controllerNamespace)){
$this->router->setController(new $this->controllerNamespace);
call_user_func_array([$this->router->getController(), $this->router->getAction()], [$this->router->getParams()]);
}
Inside the controller, I would instantiate a Service object and call a method on the service to retrieve db results.
The service in turn needs a database object in order to interact with the database and my database class is something like a singleton I suppose:
static function getInstance():Database
{
if (NULL == self::$database) {
self::$database = new Database();
}
return self::$database;
}
so I wouldn't know what service the controller needs until I'm actually inside the controller and the database instantiated inside the service class just seems wrong, how can I improve the whole thing?
My preference is without other libs for a dependency injection controller or other stuff that makes it easy, I'm writing this as a learning exercise to understand it better.
app
src
Controllers
Questions
Answers
Core
Controller
Database
Router
Service
View
Services
Questions
Answers
Views
index.php
Application.php
Config.php
tests
vendor
logs
public_html
assets
index.php
.htaccess
php dependency-injection
php dependency-injection
asked Nov 20 '18 at 1:24
mrwhitemrwhite
5810
5810
add a comment |
add a comment |
0
active
oldest
votes
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53384934%2fhow-to-achieve-inversion-of-control-in-a-front-controller-pattern%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
0
active
oldest
votes
0
active
oldest
votes
active
oldest
votes
active
oldest
votes
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53384934%2fhow-to-achieve-inversion-of-control-in-a-front-controller-pattern%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown