dev-master
9999999-devIntegrate Magento into Symfony2 2.3.* applications
MIT
The Requires
- php >=5.3.2
- symfony/symfony 2.3.*
by Liip AG
Integrate Magento into Symfony2 2.3.* applications
Integrate Magento into Symfony2 applications., (*1)
The Bundle is still a work in progress but the goal is to be able to talk to Magento from inside Symfony. This means that Magento app is initialized inside Symfony2, to share a single session, enable reusing Magento login in Symfony2 and reading content and layout from Magento., (*2)
Add the following lines in your deps file:, (*3)
[LiipMagentoBundle] git=http://github.com/liip/LiipMagentoBundle.git target=/bundles/Liip/MagentoBundle
Run the vendors script:, (*4)
$ php bin/vendors install
Add the Liip namespace to your autoloader:, (*5)
// app/autoload.php $loader->registerNamespaces(array( 'Liip' => __DIR__.'/../vendor/bundles', // your other namespaces ));
Add the bundle to your application kernel:, (*6)
// app/AppKernel.php public function registerBundles() { return array( // ... new Liip\MagentoBundle\LiipMagentoBundle(), // ... ); }
Configure the bundle, (*7)
See Configuration, (*8)
Fix the Magento autoloader, (*9)
$ cd $MAGENTO_DIR $ patch -p0 < $SYMFONY_DIR/vendor/bundles/Liip/MagentoBundle/magento-autoloader.patch
# app/config/config.yml framework: session: # use the Magento session handler storage_id: liip_magento.session.storage liip_magento: # path to the Mage.php file mage_file: %kernel.root_dir%/../../magento/app/Mage.php # not for all store resolvers, mapping to store code store_mappings: de: de en: en fr: en
# app/config/security.yml security: factories: - "%kernel.root_dir%/../vendor/bundles/Liip/MagentoBundle/Resources/config/security_factories.xml" providers: magento: id: security.user.provider.magento firewalls: secured_area: pattern: ^/ anonymous: ~ magento: provider: magento check_path: /login_check login_path: /login logout: path: /logout target: /
For accessing customer data we need the correct Magento store to be initialized. Magento loads
the default store which can be configured for the respective group. You can go to System > Manage Stores
then open the item which is in the «Store Name» row (which is actually the group) and select the
«Default Store View»., (*10)
Store resolvers do figure out which Magento store to initialize. Whenever it can't determine a store it keeps the default one. Also, if it fails setting the resolved store it goes back to the default store., (*11)
The default store resolver is LocaleStore
which uses the symfony locale as store code. In case your
store codes do not match the locales you need to use the LocaleStoreResolver
which allows you to
configure the mapping with store_mappings
of the locale to the store code. This also helps if you need
multiple fallback stores depending on the locale., (*12)
For more customized resolvers you may also write your own by implementing StoreResolverInterface
. In
that case the default resolver service can be overritten as follows:, (*13)
# app/config/config.yml liip_magento: service: store_resolver: my.store_resolver.id
In this demo we load the footer block and the number of items in the Magento cart, (*14)
class MagentoController extends Controller { /** * @Template() */ public function indexAction() { $block = \Mage::getSingleton('core/layout'); $footer = $block->createBlock('page/html_footer'); $footer->setTemplate('page/html/footer.phtml'); $cart = \Mage::helper('checkout/cart')->getCart()->getItemsCount(); return array('cart' => $cart, 'footer' => $footer->toHTML()); } }
Template-snippet for the demo:, (*15)
{% block content %} You have {{ cart }} items in your cart! {{ footer | raw}} {% endblock %}
Using the Magento Symfony module you can listen to events dispatched by Magento inside your Symfony application., (*16)
Here's an example to handle the customer_address_save_after
event, e.g.
to synchronize your CRM backend with Magento customers:, (*17)
Register your listener in Symfony, (*18)
services: acme_demo_bundle.customer_save_after: class: %acme_demo_bundle.customer_save_after.class% arguments: [ @some_service_id ] tags: - { name: kernel.event_listener, event: mage.customer_save_after, method: synchronize }
Dispatch the event in Magento:, (*19)
<?xml version="1.0"?> <config> <modules> <MyModule_Core> <version>0.1.0</version> </MyModule_Core> </modules> <global> <events> <customer_address_save_after> <observers> <address_update> <type>singleton</type> <class>MyModule_Core_Customer_Synchronizer</class> <method>synchronize</method> </address_update> </observers> </customer_address_save_after> </events> </global> </config>
<?php class MyModule_Core_Customer_Synchronizer { public function synchronize(Varien_Event_Observer $observer) { $mageEvent = $observer->getEvent(); $symfonyEvent = new MageEvent($mageEvent); $container = Mage::getSingleton('Symfony_Core_DependencyInjection_Container'); $container->get('event_dispatcher')->dispatch('mage.customer_save_after', $symfonyEvent) } }
mysite.local
and shop.mysite.local
:Apache example: <VirtualHost *:80> DocumentRoot "/var/www/mysite/symfony/web" ServerName mysite.local <Directory "/var/www/mysite/symfony/web"> AllowOverride All </Directory> </VirtualHost> <VirtualHost *:80> DocumentRoot "/var/www/mysite/magento" ServerName shop.mysite.local <Directory "/var/www/mysite/magento"> AllowOverride All </Directory> </VirtualHost>
/
and the cookie domain to .local
login
and login_check
routes and setup the login form, see the Symfony docs
After that, you should have synced sessions between mysite.local
and shop.mysite.local
meaning that logging in/out on either side will login/logout the user on the opposite side., (*20)
Apache example: <VirtualHost *:80> DocumentRoot "/var/www/mysite/symfony/web" ServerName mysite.local Alias /shop /var/www/mysite/magento <Directory "/var/www/mysite/symfony/web"> AllowOverride All </Directory> <Directory "/var/www/mysite/magento"> AllowOverride All </Directory> </VirtualHost>
/
and the cookie domain to .local
login
and login_check
routes and setup the login form see the Symfony docs
After that, you should have synced sessions between mysite.local
and mysite.local/shop
meaning that logging in/out on either side will login/logout the user on the opposite side., (*21)
Integrate Magento into Symfony2 2.3.* applications
MIT