mlwacosmos
mlwacosmos

Reputation: 4561

How to add a personal vendor to a Symfony 2 project?

I am new with Symfony 2. I would like to add classes like libraries in my project but I dont know how.

Suppose I have 2 classes A and B.

I located them at this position : vendor/my_vendor_name/xxxx/A.php and vendor/my_vendor_name/xxxx/B.php

in each classes I defined the same namespace :

namespace my_vendor_name/xxxx

Now I would like to use those 2 classes in my bundles by calling :

use my_vendor_name/xxxx/A or my_vendor_name/xxxx/B

But It is like my namespaces do not exist (class not found)... maybe I have to declare those namespaces somewhere, to register them.

My app/autoload.php

<?php

use Doctrine\Common\Annotations\AnnotationRegistry;

$loader = require __DIR__.'/../vendor/autoload.php';

// intl
if (!function_exists('intl_get_error_code')) {
require_once     __DIR__.'/../vendor/symfony/symfony/src/Symfony/Component/Locale/Resources/stubs/functions.php';

$loader->add('', __DIR__.'/../vendor/symfony/symfony/src/Symfony/Component/Locale/Resources/stubs');

}

AnnotationRegistry::registerLoader(array($loader, 'loadClass'));

return $loader;

Upvotes: 0

Views: 4979

Answers (2)

Ahmed Siouani
Ahmed Siouani

Reputation: 13891

Take a deeper look at the documentation. It's well explained in the The ClassLoader Component section.

From the documentation,

If the classes to autoload use namespaces, use the registerNamespace() or registerNamespaces() methods. For classes that follow the PEAR naming convention, use the registerPrefix() or registerPrefixes() methods.

Note, The documentation is full of examples that fit your needs (Adding external classes or PHP libraries to your project)

Also, Take a look at the autoload section of Composer documentation.

Upvotes: 2

DonCallisto
DonCallisto

Reputation: 29922

This is not the correct way to procede.

You have, in this order:

  • Create a bundle under src/ directory
  • Register your bundle into app/AppKernel.php file
  • Create your classes under your bundle
  • Use those classes wherever you want

Real example:

Bundle Creation

Create a directory under src/ dir. This dir wll contains all your bundles. By convention, this directory should have to be your "company" name (for our example, say it is Foo).

After that, create a directory for your bundle, with name of your bundle. For our example. we decide to call it FooBundle.

So, you'll have this directory tree: src/Foo/FooBundle/

Into FooBundle/ you have to create a file that is used for bundle registration. This file is reported here:

<?php

namespace Foo\FooBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;

class FooBundle extends Bundle
{
}

File name is FooFooBundle.php

Register your bundle

Go into app/AppKernel.php file and add this line

public function registerBundles()
{
    [...]
    $bundles = array(
                   [...]
                   new Foo\FooBundle\FooFooBundle());
    [...]

Congratulation! Your bundle is now registered!

Create your classes

Simply create your classes into your bundle. I suggest you to pack them into a directory like Core or whatever you want

Use your classes

Suppose that you have defined a class called A, into your brand new bundle.

Use it is quite simple:

use Foo\FooBundle\Core\A

into the file you want to use it

All should work now


Little Note:

A bundle inserted into src is different from a bundle inserted into vendor one only because your bundle (src one) is used by you, into your project only. A vendor bundle is someone else bundle that you use into your project. Behaviours (how to create bundle, how to register and use it) are exactly the same.

Little Note 2:

If you have to use external library or "old" php plain classes, Ahmed answer gives you a good point of start

Upvotes: 2

Related Questions