Leonel Franchelli
Leonel Franchelli

Reputation: 56

Laravel 4 Aliases in custom classes

i want to use the alias classes on laravel 4 "facades" like App::method , Config::method.

Well the thing is that i create a custom class and i have to import the namespaces like

<?php

namespace Face\SocialHandlers;

use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Config;

class FacebookHandler implements SocialHandlerInterface {

    public function registrar($perfil) {
        Config::get('facebook');
    }

}

is there any way to use those classes like in controllers or routes files of the framework ?

like

<?php

namespace Face\SocialHandlers;

//use Illuminate\Support\Facades\App;
//use Illuminate\Support\Facades\Config;

class FacebookHandler implements SocialHandlerInterface {

    public function registrar($perfil) {
        Config::get('facebook');
    }

}

Cya

ps: sry for my english

Upvotes: 1

Views: 5784

Answers (5)

demve
demve

Reputation: 216

Just as a tip, you shouldn't hardcode dependencies in your code. Instead of using the facades, you could create an "ConfigInterface" to get the common dependencies you need. Then create a "LaravelConfig class" (Or Laravel4Config.php) and implement those methods.

For a Quick Fix Answer, "catch the underliying facade instance":

namespace Face\SocialHandlers;

//use Illuminate\Support\Facades\App;
//use Illuminate\Support\Facades\Config;

class FacebookHandler implements SocialHandlerInterface {
    protected $config;
    protected $app;

    public function __construct()
    {
        $this->config = \Illuminate\Support\Facades\Config::getFacadeRoot();
        $this->app = \Illuminate\Support\Facades\App::getFacadeRoot();
    }

    public function registrar($perfil) {
        $this->config->get('facebook');
    }

}

For a Real Answer, maybe tedious, but good in the long run, instead of using the facades use an interface.

interface SocialConfigInterface
{
    public function getConfigurationByKey($key)
}

Then

class Laravel4Config implements SocialConfigInterface
{
    protected $config;

    public function __construct()
    {
        $this->config = \Illuminate\Support\Facades\Config::getFacadeRoot(); //<-- hard coded, but as expected since it's a class to be used with Laravel 4
    }

    public function getConfigurationByKey($key)
    {
        return $this->config->get($key);
    }
}

And Your Code

namespace Face\SocialHandlers;

//use Illuminate\Support\Facades\App;
//use Illuminate\Support\Facades\Config;

class FacebookHandler implements SocialHandlerInterface {
    protected $config;

    public function __construct(SocialConfigInterface $config)
    {
        $this->config = $config;
    }

    public function registrar($perfil) {
        $this->config->get('facebook');
    }

}

This way, if you want to change between frameworks you just need to create a SocialConfigInterface Implementation, or imagine the scenario where Laravel 5 wont use Facades, you want your code to be independent of "outsider changes" this is inversion of control IoC

Upvotes: 2

Jeroen Noten
Jeroen Noten

Reputation: 3634

You can also prefix the class names with a backslash, to use the global namespace: \Config::get('facebook') and \App::someMethod() will work without the need to add a use statement, regardless of the file's namespace.

Upvotes: 0

Sergiu Paraschiv
Sergiu Paraschiv

Reputation: 10163

You can use use Config; instead of the more verbose use Illuminate\Support\Facades\Config; and the autoloader should handle it correctly.

Upvotes: 2

Dennis Braga
Dennis Braga

Reputation: 1478

You just have to create a folder, or place a class wherever already is listed for autoload. Me, for exemple, have this class PDFMaker, that uses a DomPDF Laravel implementation. I created a folder named libraries and put the path to it (under the app folder) in the autoload:classmap key on composer.json

"autoload": {
    "classmap": [
        "app/commands",
        "app/controllers",
        "app/libraries",
        "app/models",
        "app/helpers",
        "app/database/migrations"
    ]

I did the same with commands for artisan commands! When you do that, you only have to declare a new object for any class under that folder, or call it in a static way, if the class has defined static methods. Something like Class::method.

Hope it helps you, have a nice day! :D

EDIT: After that, don't forget the dump-autoload for placing the new class in autoload scope.

EDIT 2: Remember that once you've put the class on autoload, it will be in same scope the others, so you won't have to import it to other, neither others to it!

Upvotes: 0

Anshad Vattapoyil
Anshad Vattapoyil

Reputation: 23483

First run,

php artisan dump-autoload

This will add your class namespace to vendor/composer/autoload_classmap.php. Now locate the entry for your class in this classmap array and get the proper namespace from there.

For example, you will get something like,

'Illuminate\\Support\\Facades\\App' => $vendorDir . '/laravel/framework/src/Illuminate/Support/Facades/App.php',

For this particular entry you have an alias in app/config/app.php

'App'             => 'Illuminate\Support\Facades\App',

At the same way, locate your entry and use an alias in app/config/app.php.

Upvotes: 0

Related Questions