So I read alot about the overriding of templates and such and overriding of bundles in Symfony.
I am using the new Symfony 2.3, I have not tried this in lower versions of Symfony.
I followed the tutorial about overriding bundles in Symfony:
http://symfony.com/doc/2.3/cookbook/bundles/inheritance.html
I followed the tutorial about overriding the controllers of FOSUserBundle, which is the same thing really:
https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/doc/overriding_controllers.md
I had a bundle named Acme/WebBundle.
Now I have done the following things:
Created a new bundle named Acme/UserBundle.
Created the file AcmeUserBundle.php in this bundle.
<?php
namespace Acme\UserBundle;
use Symfony\Component\HttpKernel\Bundle\Bundle;
class AcmeUserBundle extends Bundle
{
public function getParent()
{
return 'FOSUserBundle';
}
}
Created the following file structure:
-src
-Acme
-UserBundle
-Controller
RegistrationController.php
-Entity
User.php
-Resources
-translations
-views
AcmeUserBundle.php
In RegistrationController.php I set the namespace to:
namespace Acme\UserBundle\Controller;
Copied the contents of the registration controller of FOSUserBundle to mine.
Added to the beginning of registerAction()
die("message");
Now when I go to the registration form, the default /register route, I don't get a die, everything works fine. It does not see my bundle as a child, nothing is overridden and I've been trying to get it to work for ages hence my question here.
Did I do something wrong?
Remember that you need to add any new bundle to AppKernel::registerBundles() in app/AppKernel.php like this:
$bundles = array(
...
new Acme\UserBundle()
);
Related
I have create a new bundle for my vendor.
I have my bundle, i add it in appkernel, in routing.yml, but i have this error :
Class '...\TestBundle' not found in /.../AppKernel.php on line 23
When i click on my testbundle in appkernel, that return me my php 'testbundle'
class TestBundle extends Bundle
{
}
I have found the problem, i have forgot to add it in git, now its ok that work nice
just a little question:
I have a vendor bundle e.g. SonataBasketBundle with some views.
I extended it by SonataEasyExtend in my src/Application/SonataBasketBundle folder.
PROBLEM: I would to override vendor views, and I use the classical two methods: copy all views files in src/Application/SonataBasketBundle/Resources/views or copy them in app/Resources/SonataBasketBundle/views.
But, unfortunately, both methods do not works. What's the possible problem?
I missed some configuration?
I made a little test:
my extended bundle is named "ApplicationSonataBasketBundle".
Now, if in the vendor basket index method, I change the view name this way
return $this->render('ApplicationSonataBasketBundle:Basket:index.html.twig',
array(
'basket' => $this->get('sonata.basket'),
'form' => $form->createView(),
));
the framework load the application bundle view, as I want.
But, if the application bundle extends the vendor one (SonataBasketBundle), doesn't should be loaded by default also with name SonataBasketBundle?
Thanks in advance.
Override view file by pasting correct view files in
app/Resources/bundle/views
then clearing cache afterward by console
php app/console ca:cl
or delete cache files manually from app/cache (Better)
symfony doc
when overriding child bundle, it is good to override the controllers as well as the templates
<?php
// src/Acme/UserBundle/AcmeUserBundle.php
namespace Acme\UserBundle;
use Symfony\Component\HttpKernel\Bundle\Bundle;
class AcmeUserBundle extends Bundle
{
public function getParent()
{
return 'FOSUserBundle';
}
}
I've generated a bundle (#ShopfishApiBundle) using generate:bundle like I have many times. It has automatically registered the bundle in theAppKernel and it added the loading of the bundle's routing.yml to the app/Resource/config/routing.yml as well. This is within a Sylius installation running Symfony 2.3
The #ShopfishApiBundle/Resource/config/routing.yml looks like this:
shopfish_api:
resource: "#ShopfishApiBundle/Controller/ProductController.php"
type: annotation
The product controller looks like this:
namespace Shopfish\Bundle\ApiBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
/**
* #Route("/api")
*/
class ProductController extends Controller
{
/**
* #Route("/products")
* #Method({"GET"})
*
* #Rest\View
*/
public function allAction()
{
$products = array();
return array('products' => $products);
}
}
Loading any page instantly yields the below exception:
FileLoaderLoadException: Cannot load resource "#ShopfishApiBundle/Controller/". Make sure the "ShopfishApiBundle" bundle is correctly registered and loaded in the application kernel class.
In another Symfony2 (version 2.4) application I've made a similar bundle and this worked without error, I'm thinking something in Sylius messes this up. Do you know where I might solve this issue?
NOTE: I did a little test to see if a direct-no-annotations code snippet worked, and that seems to work. Though I want to use the FOS Rest bundle, using Annotations for Routing.
sf_api_controller:
pattern: /no-annotation-test
defaults:
_controller: ShopfishApiBundle:Product:all
I hadn't registered the essential SensionFrameworkExtraBundle in my AppKernel.php:
new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle()
Thanks, #pazi!
I am trying to override the default FOSUserBundle.en.yml from the FOS user-bundle.
I have the user bundle working fine, i have registered a user and logged in.
However when I copy the FOSUserBundle.en.yml into my own UserBundle to override the wording Symfony doesn't seem to pick it up.
This is the path I have copied the transation file to:
src/Blogger/UserBundle/Resources/translations/FOSUserBundle.en.ym
But no joy.. I have cleared the caches tried another browser but the change in the override will not come through.
I can place the change the in the original and see the changes:
vendor/friendsofsymfony/user-bundle/FOS/UserBundle/Resources/translations/FOSUserBundle.en.yml
Am I missing something?
Thanks,
John
To override the bundle, you should add this :
// src/Blogger/UserBundle/BloggerUserBundle.php
namespace Blogger\UserBundle;
use Symfony\Component\HttpKernel\Bundle\Bundle;
class BloggerUserBundle extends Bundle
{
public function getParent()
{
return 'FOSUserBundle';
}
}
Here's a link from the docs : http://symfony.com/doc/current/cookbook/bundles/inheritance.html
All the steps you should follow are in there.
I'm trying to override the SonataUser/Admin/Model/UserAdmin's configureFormFields() because I need to remove some default fields from the admin form.
So I have copied the file vendor/bundles/Sonata/UserBundle/Admin/Model/UserAdmin.php in my bundle app/Application/Sonata/UserBundle/Admin/Model/UserAdmin.php and modified it. Then declared it as a service:
# app/application/Sonata/UserBundle/Resources/config/services.yml
services:
application_user.registration.form.type:
class: Application\Sonata\UserBundle\Admin\Model\UserAdmin
arguments: [%sonata_user.model.user.class%]
tags:
- { name: form.type, alias: application_user_admin }
Now questions:
Am I doing right ? How can I tell sonata admin to use it ?
The overriding class should be set in config.yml:
# app/config/config.yml
sonata_user:
admin:
user:
class: MyCompany\UserBundle\Admin\Model\UserAdmin
Extend original UserAdmin:
namespace MyCompany\UserBundle\Admin\Model;
use Sonata\AdminBundle\Form\FormMapper;
class UserAdmin extends \Sonata\UserBundle\Admin\Model\UserAdmin
{
protected function configureFormFields(FormMapper $formMapper)
{
// new logic
}
}
Of course change class name MyCompany\UserBundle\Admin\Model\UserAdmin to reflect your bundle structure.
It is a better practice to keep your bundles in the src directory instead: (See Creating a bundle section).
In this case, if you are using easy extends, make sure to use --dest=src in order to generate the bundle inside an Application namespace in src/.
php app/console sonata:easy-extends:generate SonataUserBundle --dest=src
By creating your overriding bundle in src/Application/Sonata/UserBundle and registering the vendor bundle as a parent, you won't have to create a new service. This explains you how to override the bundle properly: overriding a bundle and should save you a lot of time.
Don't forget to create the file you want to override in the same location as your parent bundle.
In your case, you would have to copy paste SonataUser/Admin/Model/UserAdmin.php from the vendor into your bundle src/Application/Sonata/UserBundle/Admin/Model/UserAdmin.php and modify it as you wish.
That's why overriding bundles can be so useful.