How to achieve inversion of control in a front controller pattern?












1















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









share|improve this question



























    1















    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









    share|improve this question

























      1












      1








      1








      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









      share|improve this question














      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






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 20 '18 at 1:24









      mrwhitemrwhite

      5810




      5810
























          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
          });


          }
          });














          draft saved

          draft discarded


















          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
















          draft saved

          draft discarded




















































          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.




          draft saved


          draft discarded














          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





















































          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







          這個網誌中的熱門文章

          Xamarin.form Move up view when keyboard appear

          Post-Redirect-Get with Spring WebFlux and Thymeleaf

          Anylogic : not able to use stopDelay()