【问题标题】:How to create custom Facade in Laravel 4如何在 Laravel 4 中创建自定义外观
【发布时间】:2014-11-16 16:55:56
【问题描述】:

查找了一些关于外观和 laravel 4 的教程...尝试了一些...不喜欢它们的工作方式。

例如,它们并没有提供一种方法来定义存储外观文件和服务提供者的位置......我试图远离它,但我的头撞到了几堵墙,直到我决定这样做这个话题。

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

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

所以我有 /app/laracms/facades、/app/laracms/serviceproviders 等等。我不想将外观与数据库模型混为一谈,我想尽可能地分开。

在我的例子中,现在让我们来看看外观的设置名称(我想实现一个设置类以在视图和管理员中使用来设置杂项)。

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

谁能解释一下如何正确设置外墙?我不知道我做错了什么,我需要一个新的开始。

谢谢, 克里斯

寻找一步一步的简单解释如何和为什么。

【问题讨论】:

    标签: php database laravel laravel-4 facade


    【解决方案1】:

    首先您需要转到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,这样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()

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

    【讨论】:

    • 我不应该将文件夹添加到 composer.json 以自动加载吗?我收到 SettingsServiceProvider 类未找到错误
    • @ied3vil 你说得对,我已经更新了我的帖子——你需要将你的文件夹添加到composer.json中的classmap
    • 我最初发现,我现在有一个不同的问题:上面的代码现在可以正常工作,但是例如我有,在 get() 方法中,我试图访问 DB:: facade。 ..那行不通-知道如何以正确的方式使其工作吗?
    • @ied3vilb 如果需要,请使用您的代码和数据库结构创建新问题
    • 我解决了 - 我所要做的就是在外观的类中添加一个 use 语句
    【解决方案2】:

    制作Facade包含三个组件:

    • 想要成为门面的类,即需要成为门面的类。
    • 外观所需的类,它告诉 Laravel 它属于哪个注册类
    • 一个Service Provider,在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');
            });
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-04-01
      • 1970-01-01
      • 2011-07-19
      • 1970-01-01
      • 2018-11-18
      • 2012-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多