如何在Laravel 4中创建自定义外观?

6

我查阅了一些关于Facades和Laravel 4的教程......尝试了一些,但不喜欢它们的工作方式。

例如,它们并不都提供一种定义Facade文件和服务提供者存储位置的方法......我试图离开这个,但遇到了一些问题,直到我决定写这篇文章。

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

我想把我创建的所有内容 - Facades、服务提供者等 - 存储在名为laracms的app文件夹下的一个文件夹中。

所以我会有/app/laracms/facades、/app/laracms/serviceproviders等等。我不想将Facades与数据库模型混合在一起,我想尽可能地保持事物分离。

现在,让我们以我的情况为例,使用Settings名称作为Facade(我想实现一个设置类,在视图和管理界面中使用来设置杂项内容)。

Settings::get()、Settings::set()是方法。

有人能解释一下如何正确设置Facades吗?我不知道我做错了什么,我需要重新开始。

谢谢, Chris

寻找一个简单易懂的步骤说明。

2个回答

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->classmap部分中添加app/Laracms,以便该文件的这个部分看起来像这样:

"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()

需要注意的是,我使用了大写字母的文件夹名称,因为按照约定,命名空间以大写字母开头。


我不应该将文件夹添加到composer.json以进行自动加载吗?我遇到了一个SettingsServiceProvider类找不到的错误。 - ied3vil
@ied3vil 你是对的,我已经更新了我的帖子 - 你需要在 composer.json 中将你的文件夹添加到 classmap - Marcin Nabiałek
我发现最初的问题已经解决了,但是现在我有一个不同的问题:上面的代码现在运行良好,但是例如在get()方法中,我正在尝试访问DB::facade...但这并没有起作用 - 你有任何想法如何使其正常工作? - ied3vil
@ied3vilb 如果需要,请创建一个新的问题,并附上您的代码和数据库结构。 - Marcin Nabiałek
我解决了 - 我所要做的就是在门面类中添加一个使用语句。 - ied3vil

2

制作Facade的方法有三个组件:

  • 想要成为Facade类,即需要成为Facade的类。
  • 所需要的Facade类,告诉Laravel它所对应的已注册类。
  • 服务提供商,在App容器中注册Facade类。

1. 想要成为Facade类:

<?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. Facade模式所需的类:

<?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');
        });

    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接