Skip to main content

CoR pattern appropriate dependency Injection with Symfony

I was working on a suitable example of the CoR(Chain-of-responsibility) pattern. I learned that it is often used as middleware layer in MVC.

I am trying to write a middleware layer suitable for the pattern.

I have set my scenario regarding the implementation of the pattern as follows: The classes defined in the controller method as Annotations are linked to each other with chains, and each class performs a task and moves on to the next task. CoR(Chain-of-responsibility) pattern implementation known so far.

When I look at the examples, none of the classes used as middleware have been injected with Depency injection.

My scenario is as follows: An "@Middleware()" annonation is defined to the Controller method. Sample

/**
 * @Route("/", name="test")
 * @Middleware({"App\Middleware\MiddlewareOne","App\Middleware\MiddlewareTwo"})
 */
public function test()

Then I get annotations in the "onKernelController" method with ControllerListener and create the classes defined here with a foreach loop and connect them to each other.

Below you will see the sample code blocks, respectively.

The problem I'm having here is How can I give the ContainerInterface or a Service class that I created in the constructor of the MiddlewareOne class to the constructor of this object?(I do not know which services are coming, a fixed service is not coming)

class ControllerListener
{
    /**
    * @param \Symfony\Component\HttpKernel\Event\ControllerEvent $controllerEvent
    */
    public function onKernelController(ControllerEvent $controllerEvent)
    {

        MiddlewareManager::handle($controllerEvent);
    }

}

class MiddlewareManager
{


   public static function handle(ControllerEvent $controllerEvent)
   {
       $containerBuilder = new ContainerBuilder();
       if (!is_array($controllers = $controllerEvent->getController())) {
            return;
       }

       $reader = new AnnotationReader();
       $request = $controllerEvent->getRequest();
       $content = $request->getContent();

       [ $controller, $methodName ] = $controllers;
       $reflectionClass = new \ReflectionClass($controller);
       $classAnnotation = $reader
              ->getClassAnnotation($reflectionClass, Middleware::class);
       $reflectionObject = new \ReflectionObject($controller);
       $reflectionMethod = $reflectionObject->getMethod($methodName);
       $methodAnnotation = $reader
            ->getMethodAnnotation($reflectionMethod, Middleware::class);

       if (!($classAnnotation || $methodAnnotation)) {
            return;
       }
       $middlewareList = $classAnnotation->getMiddleware()['value'];
                
        $middleware = null;
        $temp = null;
        foreach ($middlewareList as $class){
            if ($middleware === null){
                $middleware = new $class();
                $temp = $middleware;
                continue;
            }
            $class = new $class();
            $temp->next($class);
            $temp = $class;
        }
        return $middleware;
    
    }


}

class DumpOneMiddleware implements Middleware
{

  /** @var \App\Middleware\Middleware */
  private $next;
  /** @var \App\Service\ExampleService */
  private $exampleService;

  public function __construct(ExampleService $exampleService)
  {
      $this->exampleService = $exampleService;
  }

   /**
   * @param \App\Middleware\Middleware $next
   * @return \App\Middleware\Middleware
   */
   public function next(Middleware $next)
   {
       $this->next = $next;
       return $next;
   }

   /**
   * @param \Symfony\Component\HttpFoundation\Request $request
   */
   public function handle(Request $request)
   {
    if (!$this->next) {
        return true;
    }
    return $this->next->handle($request);
  }
}

Here I can export Container object via ControllerListener (to all middleware classes). But if I want to add another service, how can I do it?

When I examined these and similar topics, I came to the conclusion that I should look at the strategy pattern and Compailer Pass issues. But these topics didn't help me much or I couldn't understand.

I would be very grateful if you could indicate the deficiencies or mistakes in the scenario I applied and show with an example how I can inject Dependecy into the objects I created dynamically.



source https://stackoverflow.com/questions/69350780/cor-pattern-appropriate-dependency-injection-with-symfony

Comments

Popular posts from this blog

How to show number of registered users in Laravel based on usertype?

i'm trying to display data from the database in the admin dashboard i used this: <?php use Illuminate\Support\Facades\DB; $users = DB::table('users')->count(); echo $users; ?> and i have successfully get the correct data from the database but what if i want to display a specific data for example in this user table there is "usertype" that specify if the user is normal user or admin i want to user the same code above but to display a specific usertype i tried this: <?php use Illuminate\Support\Facades\DB; $users = DB::table('users')->count()->WHERE usertype =admin; echo $users; ?> but it didn't work, what am i doing wrong? source https://stackoverflow.com/questions/68199726/how-to-show-number-of-registered-users-in-laravel-based-on-usertype

Why is my reports service not connecting?

I am trying to pull some data from a Postgres database using Node.js and node-postures but I can't figure out why my service isn't connecting. my routes/index.js file: const express = require('express'); const router = express.Router(); const ordersCountController = require('../controllers/ordersCountController'); const ordersController = require('../controllers/ordersController'); const weeklyReportsController = require('../controllers/weeklyReportsController'); router.get('/orders_count', ordersCountController); router.get('/orders', ordersController); router.get('/weekly_reports', weeklyReportsController); module.exports = router; My controllers/weeklyReportsController.js file: const weeklyReportsService = require('../services/weeklyReportsService'); const weeklyReportsController = async (req, res) => { try { const data = await weeklyReportsService; res.json({data}) console...

How to split a rinex file if I need 24 hours data

Trying to divide rinex file using the command gfzrnx but getting this error. While doing that getting this error msg 'gfzrnx' is not recognized as an internal or external command Trying to split rinex file using the command gfzrnx. also install'gfzrnx'. my doubt is I need to run this program in 'gfzrnx' or in 'cmdprompt'. I am expecting a rinex file with 24 hrs or 1 day data.I Have 48 hrs data in RINEX format. Please help me to solve this issue. source https://stackoverflow.com/questions/75385367/how-to-split-a-rinex-file-if-i-need-24-hours-data