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

Prop `className` did not match in next js app

I have written a sample code ( Github Link here ). this is a simple next js app, but giving me error when I refresh the page. This seems to be the common problem and I tried the fix provided in the internet but does not seem to fix my issue. The error is Warning: Prop className did not match. Server: "MuiBox-root MuiBox-root-1" Client: "MuiBox-root MuiBox-root-2". Did changes for _document.js, modified _app.js as mentioned in official website and solutions in stackoverflow. but nothing seems to work. Could someone take a look and help me whats wrong with the code? Via Active questions tagged javascript - Stack Overflow https://ift.tt/2FdjaAW

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