如何在Laravel 4中创建自定义Facade

时间:2014-09-22 16:33:48

标签: php database laravel laravel-4 facade

查看了几个关于外墙和laravel 4的教程......尝试了一些......不喜欢他们工作的方式。

例如,他们并没有提供一种方法来定义外观文件和服务提供商的存储地点......我试图远离那个并让我的头撞到几面墙直到我决定做这个帖子。

所以:假设我有一个名为Laracms(laravel cms)的应用程序。

我想将我创建的所有内容 - 外墙,服务提供商等存储在名为laracms的应用程序下的文件夹中。

所以我有/ app / laracms / facades,/ app / laracms / serviceproviders等等。我不想将外观与数据库模型混合在一起,我希望尽可能保持分离。

现在让我们看一下外观的设置名称(我希望实现一个设置类在视图中使用,管理员设置misc。的东西)。

设置:: get(),Settings :: set()作为方法。

任何人都可以解释如何正确设置外墙吗?我不知道我做错了什么,我需要一个新的开始。

谢谢, 克里斯

通过简单解释如何以及为什么一步一步地寻找。

2 个答案:

答案 0 :(得分:13)

首先,您需要转到app/config/app.php并在providers部分添加:

'Laracms\Providers\SettingsServiceProvider',

aliases部分的同一文件中,您应添加:

 'Settings' => 'Laracms\Facades\Settings',

app/Laracms/Providers中,您应该创建文件SettingsServiceProvider.php

<?php

namespace Laracms\Providers;

use Illuminate\Support\ServiceProvider;

class SettingsServiceProvider extends ServiceProvider {

    public function register()
    {
        $this->app->bind('settings', function()
            {
                return new \Laracms\Settings();
            });
    }

}

在您的app/Laracms/Facades/中,您应该创建文件Settings.php

<?php

namespace Laracms\Facades;

use Illuminate\Support\Facades\Facade;

class Settings extends Facade {

    protected static function getFacadeAccessor() { return 'settings'; }

}

现在,您应在app/Laracms目录中创建文件Settings.php

<?php

namespace Laracms;

class Settings {
   public function get() {echo "get"; }

   public function set() {echo "set"; }
}

由于您希望将文件保存在自定义文件夹Laracms中,因此需要将此文件夹添加到composer.json(如果您使用的是标准app/models文件夹,则不需要在此文件中添加任何内容)。现在打开composer.json文件,在autoload部分 - &gt; classmap您应该添加app/Laracms,因此composer.json的这一部分可能如下所示:

"autoload": {
    "classmap": [
        "app/commands",
        "app/controllers",
        "app/models",
        "app/database/migrations",
        "app/database/seeds",
        "app/tests/TestCase.php",
        "app/Laracms"
    ]
},

现在您需要在项目内部的控制台中运行:

composer dump-autoload

创建类映射

如果一切正常,您现在应该可以在您的应用中使用Settings::get()Settings:set()

您需要注意我使用了带有大写字母的文件夹,因为按照惯例,命名空间以大写字母开头。

答案 1 :(得分:2)

制作Facade有三个组成部分:

  • 想成为立面课,那个需要成为立面的课程。
  • Facade要求Class,告诉Laravel它所属的注册类
  • 服务提供商,在App容器中注册Facade类

<强> 1。想成为门面课程:

<?php namespace Moubarmij\Services\ModelsServices;

class AuthenticationService extends MoubarmijService implements AuthenticationServiceInterface{


    /**
     * @param $email
     * @param $password
     *
     * @return mixed
     */
    public function login($email, $password)
    {
        return Sentry::authenticate([
            'email'    => $email,
            'password' => $password,
        ]);
    }

    /**
     * @return mixed
     */
    public function logout()
    {
        return Sentry::logout();
    }

}

<强> 2。立面工作所需的类别:

<?php namespace Moubarmij\Facades;


use Illuminate\Support\Facades\Facade;

/**
 * Class AuthenticationServiceFacade
 * @package Moubarmij\Services\ModelsServices
 */
class AuthenticationServiceFacade extends Facade{

    /**
     * Get the registered name of the component.
     *
     * @return string
     */
    protected static function getFacadeAccessor() { return 'authentication_service'; }


}

注意:authentication_service可以是您想要的任何内容(它是在IOC中注册的组件的名称)

第3。服务提供商

<?php namespace Moubarmij\Providers;


use Illuminate\Support\ServiceProvider;

/**
 *  A service provider for the Authentication Service
 *
 * Class AuthenticationServiceSP
 * @package Moubarmij\Providers
 */
class AuthenticationServiceSP extends ServiceProvider {

    /**
     * bind interfaces
     *
     * @return void
     */
    public function register()
    {
        // Register 'authentication_service' instance container to our AuthenticationService object
        $this->app['authentication_service'] = $this->app->share(function($app)
        {
            return $app->make('Moubarmij\Services\ModelsServices\AuthenticationService');
        });

        // Shortcut to auto add the Alias in app/config/app.php
        $this->app->booting(function()
        {
            $loader = \Illuminate\Foundation\AliasLoader::getInstance();
            $loader->alias('AuthenticationService', 'Moubarmij\Facades\AuthenticationServiceFacade');
        });

    }
}