5
votes

I'm trying to override the registration controller of my FOSUserBundle. I've followed the steps on https://symfony.com/doc/3.4/bundles/inheritance.html But I get the following error:

Cannot autowire service "AppBundle\Controller\RegistrationController": argument "$formFactory" of method "FOS\UserBundle\Controller\RegistrationController::__construct()" references interface "FOS\UserBundle\Form\Factory\FactoryInterface" but no such service exists. You should maybe alias this interface to one of these existing services: "fos_user.profile.form.factory", "fos_user.registration.form.factory", "fos_user.change_password.form.factory", "fos_user.resetting.form.factory".

My RegistrationController.php :

// src/UserBundle/Controller/RegistrationController.php
namespace AppBundle\Controller;

use FOS\UserBundle\Controller\RegistrationController as BaseController;
use Symfony\Component\HttpFoundation\Request;

    class RegistrationController extends BaseController
    {
        public function registerAction(Request $request)
        {
            $response = parent::registerAction($request);

            // ... do custom stuff
            return $response;
        }
     }

My AppBundle.php

<?php

namespace AppBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;

class AppBundle extends Bundle
{
    public function getParent()
    {
        return 'FOSUserBundle';
    }
}

If more information is needed tell me so I can update this question.

2
Adding an alias to your services.yaml file (like the error suggests) might help. Problem is that other FOS controllers (profile, change password etc) need different form factories. So you will need to manually wire the dependency. Check the autowire section in the docs. And as previously pointed out, bundle inheritance is going away so unless you plan on staying with 3.4 indefinitely then don't use it.Cerad

2 Answers

6
votes

I installed and configured a fresh copy of Symfony 3.4 along with the latest FOSUserBundle 2.1

Since bundle inheritance is going away, just adjust the register route to point to your controller:

# config/routes.yaml
fos_user:
    resource: "@FOSUserBundle/Resources/config/routing/all.xml"

fos_user_registration_register:
    path: /register
    controller: AppBundle\Controller\RegistrationController::registerAction

And then inject the form factory into your controller:

# app/services.yaml, keep all the standard defaults above
AppBundle\Controller\RegistrationController:
    arguments:
        $formFactory: '@fos_user.registration.form.factory'

And you should be good to go.

The only remaining question is why you would want to do this in the first place? You would basically need to copy/paste the entire registerAction from your base class. Most of the time you would want to create an FOS event subscriber and listen for REGISTRATION_INITIALIZE, REGISTRATION_SUCCESS,REGISTRATION_COMPLETED or REGISTRATION_FAILURE events.

1
votes

I know for sure, that this works for Symfony 3.2.3 This is only for symfony version <= 3. Because bundle inheritence is depraceted and will be disabled in 4. Change the version of FOSUserBundle in the composer.json to

"friendsofsymfony/user-bundle": "2.0.2"

and run command to update it

composer update