首页 文章

Laravel 5中定制助手的最佳实践

提问于
浏览
335

我想创建辅助函数以避免在Laravel 5中的视图之间重复代码:

view.blade.php

<p>Foo Formated text: {{ fooFormatText($text) }}</p>

它们基本上是文本格式化功能 . 我在哪里以及如何使用这些功能创建文件?

20 回答

  • 274

    52 Laravel 5中的自定义类,简单方法

    此答案适用于Laravel中的常规自定义类 . 有关特定于Blade的答案,请参阅Custom Blade Directives in Laravel 5 .

    Step 1: 创建Helpers(或其他自定义类)文件并为其指定匹配的命名空间 . 写你的 class 和方法:

    <?php // Code within app\Helpers\Helper.php
    
    namespace App\Helpers;
    
    class Helper
    {
        public static function shout(string $string)
        {
            return strtoupper($string);
        }
    }
    

    Step 2: 创建别名:

    <?php // Code within config/app.php
    
        'aliases' => [
         ...
            'Helper' => App\Helpers\Helper::class,
         ...
    

    Step 3: 在刀片模板中使用它:

    <!-- Code within resources/views/template.blade.php -->
    
    {!! Helper::shout('this is how to use autoloading correctly!!') !!}
    

    Extra Credit: 在Laravel应用中的任何位置使用此类:

    <?php // Code within app/Http/Controllers/SomeController.php
    
    namespace App\Http\Controllers;
    
    use Helper;
    
    class SomeController extends Controller
    {
    
        public function __construct()
        {
            Helper::shout('now i\'m using my helper class in a controller!!');
        }
        ...
    

    资料来源:http://www.php-fig.org/psr/psr-4/

    为什么会这样:https://github.com/laravel/framework/blob/master/src/Illuminate/Support/ClassLoader.php

    自动加载源自:http://php.net/manual/en/language.oop5.autoload.php

  • 46

    在laravel 5.3及更高版本中,laravel团队将所有程序文件( routes.php )移出 app/ 目录,整个 app/ 文件夹自动加载 psr-4 . 接受的答案适用于这种情况,但对我来说感觉不对 .

    所以我做的是在项目的根目录下创建了一个 helpers/ 目录并将帮助文件放在其中,在我的 composer.json 文件中我做了这个:

    ...
    "autoload": {
        "classmap": [
            "database"
        ],
        "psr-4": {
            "App\\": "app/"
        },
        "files": [
            "helpers/ui_helpers.php"
        ]
    },
    ...
    

    这样我的 app/ 目录仍然是一个psr-4自动加载的目录,并且帮助器组织得更好一些 .

    希望这有助于某人 .

  • 25

    由于OP要求最佳实践,我认为我们仍然缺少一些好的建议 .

    单个helpers.php文件远非一个好习惯 . 首先是因为你混合了很多不同类型的函数,所以你反对良好的编码原则 . 此外,这不仅会损害代码文档,还会损害Cyclomatic Complexity,Maintainability Index和Halstead Volume等代码指标 . 你拥有的功能越多,它就越糟糕 .

    代码文档可以使用像phpDocumentor这样的工具,但使用Samiwon't render procedural files . Laravel API文档就是这种情况 - 没有辅助函数文档:https://laravel.com/api/5.4

    可以使用PhpMetrics等工具分析代码指标 . 使用PhpMetrics版本1.x来分析Laravel 5.4框架代码将为src/Illuminate/Foundation/helpers.phpsrc/Illuminate/Support/helpers.php文件提供非常糟糕的CC / MI / HV指标 .

    多个上下文辅助文件(例如string_helpers.php,array_helpers.php等)肯定会改善那些不良指标,从而使代码更容易保留 . 根据使用的代码文档生成器,这将是足够好的 .

    通过使用带有静态方法的辅助类可以进一步改进它,因此可以使用命名空间对它们进行上下文化 . 就像Laravel已经使用Illuminate\Support\StrIlluminate\Support\Arr类一样 . 这改进了代码指标/组织和文档 . 类别名可用于使它们更易于使用 .

    使用类构建可以使代码组织和文档更好,但另一方面,我们最终会失去那些简短易记的全局函数 . 我们可以通过为这些静态类方法创建函数别名来进一步改进该方法 . 这可以手动或动态完成 .

    Laravel在内部使用第一种方法,在程序辅助文件中声明映射到静态类方法的函数 . 这可能不是理想的事情,因为你需要重新声明所有的东西(docblocks / arguments) .
    我个人使用动态方法和 HelperServiceProvider 类在执行时创建这些函数:

    <?php
    
    namespace App\Providers;
    
    use Illuminate\Support\ServiceProvider;
    
    class HelperServiceProvider extends ServiceProvider
    {
        /**
         * The helper mappings for the application.
         *
         * @var array
         */
        protected $helpers = [
            'uppercase' => 'App\Support\Helpers\StringHelper::uppercase',
            'lowercase' => 'App\Support\Helpers\StringHelper::lowercase',
        ];
    
        /**
         * Bootstrap the application helpers.
         *
         * @return void
         */
        public function boot()
        {
            foreach ($this->helpers as $alias => $method) {
                if (!function_exists($alias)) {
                    eval("function {$alias}(...\$args) { return {$method}(...\$args); }");
                }
            }
        }
    
        /**
         * Register the service provider.
         *
         * @return void
         */
        public function register()
        {
            //
        }
    }
    

    可以说这是过度工程,但我不这么认为 . 它工作得很好,与预期的相反,至少在使用PHP 7.x时它不会花费相关的执行时间 .

  • 1

    这是 JeffreyWayLaracasts Discussion中的建议 .

    • app/Http 目录中,创建 helpers.php 文件并添加功能 .

    • composer.json 内,在 autoload 块中,添加 "files": ["app/Http/helpers.php"] .

    • 运行 composer dump-autoload .

  • 5

    L2 Laravel 5中的自定义刀片指令

    是的,有另一种方法可以做到这一点!

    Step 1: 注册自定义Blade指令:

    <?php // code in app/Providers/AppServiceProvider.php
    
    namespace App\Providers;
    
    use Illuminate\Support\ServiceProvider;
    
    use Blade; // <-- This is important! Without it you'll get an exception.
    
    class AppServiceProvider extends ServiceProvider
    {
        /**
         * Bootstrap any application services.
         *
         * @return void
         */
         public function boot()
         {
             // Make a custom blade directive:
             Blade::directive('shout', function ($string) {
                 return trim(strtoupper($string), '(\'\')');
             });
    
             // And another one for good measure:
             Blade::directive('customLink', function () {
                 return '<a href="#">Custom Link</a>';
             });
         }
        ...
    

    Step 2: 使用您的自定义Blade指令:

    <!-- // code in resources/views/view.blade.php -->
    
    @shout('this is my custom blade directive!!')
    
    @customLink

    Outputs:

    这是我的定制刀片指令!!
    Custom Link


    资料来源:https://laravel.com/docs/5.1/blade#extending-blade

    补充阅读:https://mattstauffer.co/blog/custom-conditionals-with-laravels-blade-directives


    如果您想学习如何最好地制作可在任何地方使用的自定义类,请参阅Custom Classes in Laravel 5, the Easy Way

  • 7

    这是我的HelpersProvider.php文件:

    <?php
    
    namespace App\Providers;
    
    use Illuminate\Support\ServiceProvider;
    
    class HelperServiceProvider extends ServiceProvider
    {
        protected $helpers = [
            // Add your helpers in here
        ];
    
        /**
         * Bootstrap the application services.
         */
        public function boot()
        {
            //
        }
    
        /**
         * Register the application services.
         */
        public function register()
        {
            foreach ($this->helpers as $helper) {
                $helper_path = app_path().'/Helpers/'.$helper.'.php';
    
                if (\File::isFile($helper_path)) {
                    require_once $helper_path;
                }
            }
        }
    }
    

    您应该在 app 文件夹下创建一个名为 Helpers 的文件夹,然后在里面创建名为 whatever.php 的文件,并在$ helpers数组中添加字符串 whatever .

    完成!

    编辑

    我不再使用此选项,我目前正在使用composer来加载像helper这样的静态文件 .

    您可以直接在以下位置添加帮助:

    ...
    "autoload": {
        "files": [
            "app/helpers/my_helper.php",
            ...
        ]
    },
    ...
    
  • 9

    您可以在别名下添加到 config/app.php 文件,而不是包含自定义帮助程序类 .

    应该是这样的 .

    'aliases' => [ 
        ...
        ...
        'Helper' => App\Http\Services\Helper::class,
     ]
    

    然后到你的控制器,包括Helper使用方法'使用Helper',因此您只需调用Helper类中的某些方法即可 .

    eg. Helper::some_function();
    

    或者在资源视图中,您可以直接调用Helper类 .

    eg. {{Helper::foo()}}
    

    但这仍然是开发人员编码风格的方法 . 我们可能有不同的解决问题的方法,我只想分享我对初学者的看法 .

  • 0

    这里有一些很好的答案,但我认为这是最简单的 . 在Laravel 5.4(以及早期版本的早期版本)中,您可以在方便的地方创建一个类,例如App / Libraries / Helper.php

    class Helper() {
        public function uppercasePara($str) {
            return '<p>' .strtoupper($str). '<p>;
        }
    }
    

    然后,您只需在您的Blade模板中调用它,如下所示:

    @inject('helper', \App\Libraries\Helper)
    {{ $helper->drawTimeSelector() }}
    

    如果你不想使用@inject,那么只需将'uppercasePara'函数设置为static并将调用嵌入到Blade模板中,如下所示:

    {{ \App\Libraries\Helper::drawTimeSelector() }}
    

    不需要别名 . Laravel自动解决具体类 .

  • 2

    在dir bootstrap \ autoload.php中

    require __DIR__.'/../vendor/autoload.php';
    require __DIR__.'/../app/Helpers/function.php'; //add
    

    添加此文件

    app\Helpers\function.php
    
  • 0

    我最初的想法是作曲家自动加载,但它对我来说并没有感觉非常Laravel 5ish . L5大量使用服务提供商,它们是引导你的应用程序的东西 .

    首先,我在 app 目录中创建了一个名为 Helpers 的文件夹 . 然后在 Helpers 文件夹中我添加了我想要添加的函数的文件 . 拥有一个包含多个文件的文件夹可以让我们避免使用太长且无法管理的大文件 .

    接下来,我通过运行artisan命令创建了一个 HelperServiceProvider.php

    artisan make:provider HelperServiceProvider
    

    register 方法中,我添加了这个片段

    public function register()
    {
        foreach (glob(app_path().'/Helpers/*.php') as $filename){
            require_once($filename);
        }
    }
    

    最后在providers数组中的 config/app.php 中注册服务提供者

    'providers' => [
        'App\Providers\HelperServiceProvider',
    ]
    

    现在 Helpers 目录中的任何文件都已加载,可以使用了 .

    UPDATE 2016-02-22

    这里有很多不错的选择,但是如果我的回答对你有用,我就会继续做这个包括帮助者的方案 . 您可以使用该软件包获取灵感,也可以随意使用Composer下载它 . 它有一些我经常使用的内置帮助程序(但默认情况下都是非活动状态),并允许您使用简单的Artisan生成器创建自己的自定义帮助程序 . 它还解决了一个响应者使用映射器的建议,并允许您显式定义要加载的自定义帮助程序,或者默认情况下,自动加载帮助程序目录中的所有PHP文件 . 反馈和PR非常感谢!

    composer require browner12/helpers
    

    Github:browner12/helpers

  • 274

    通过对SO和Google的各种答案进行筛选,我仍然找不到最佳方法 . 大多数答案都建议我们离开应用程序并依靠第三方工具Composer来完成这项工作,但我不相信只是为了包含文件而工具的耦合是明智的 .

    Andrew Brown's answer最接近我认为应该接近的方式,但是(至少在5.1中),服务提供商步骤是不必要的 . Heisian's answer突出了 PSR-4 的使用,这让我们更近了一步 . 这是我在视图中帮助器的最终实现:

    首先,使用命名空间在apps目录中的任意位置创建一个帮助文件:

    namespace App\Helpers;
    
    class BobFinder
    {
        static function bob()
        {
            return '<strong>Bob?! Is that you?!</strong>';
        }
    }
    

    接下来,在 aliases 数组中的 config\app.php 中为您的类添加别名:

    'aliases' => [
        // Other aliases
        'BobFinder' => App\Helpers\BobFinder::class
    ]
    

    这应该就是你需要做的一切 . PSR-4 并且别名应该将助手公开给您的视图,因此在您的视图中,如果键入:

    {!! BobFinder::bob() !!}
    

    它应该输出:

    <strong>Bob?! Is that you?!</strong>
    
  • 3

    这是我创建的一个bash shell脚本,可以非常快速地创建Laravel 5外观 .

    在Laravel 5安装目录中运行它 .

    这样称呼它:

    make_facade.sh -f <facade_name> -n '<namespace_prefix>'
    

    例:

    make_facade.sh -f helper -n 'App\MyApp'
    

    如果运行该示例,它将在'your_laravel_installation_dir/app/MyApp'下创建目录 FacadesProviders .

    它将创建以下3个文件,并将它们输出到屏幕:

    ./app/MyApp/Facades/Helper.php
    ./app/MyApp/Facades/HelperFacade.php
    ./app/MyApp/Providers/HelperServiceProvider.php
    

    完成后,它将显示类似于以下内容的消息:

    ===========================
        Finished
    ===========================
    
    Add these lines to config/app.php:
    ----------------------------------
    Providers: App\MyApp\Providers\HelperServiceProvider,
    Alias: 'Helper' => 'App\MyApp\Facades\HelperFacade',
    

    所以更新'config / app.php'中的Providers和Alias列表

    运行 composer -o dumpautoload

    “./app/MyApp/Facades/Helper.php”最初看起来像这样:

    <?php
    
    namespace App\MyApp\Facades;
    
    
    class Helper
    {
        //
    }
    

    现在只需在“./app/MyApp/Facades/Helper.php”中添加方法即可 .

    添加帮助函数后,这就是“./app/MyApp/Facades/Helper.php”的样子 .

    <?php
    
    namespace App\MyApp\Facades;
    
    use Request;
    
    class Helper
    {
        public function isActive($pattern = null, $include_class = false)
        {
            return ((Request::is($pattern)) ? (($include_class) ? 'class="active"' : 'active' ) : '');
        }
    }
    
    This is how it would be called:
    ===============================
    
    {!!  Helper::isActive('help', true) !!}
    

    此函数需要一个模式,并且可以接受可选的第二个布尔参数 .

    如果当前URL与传递给它的模式匹配,它将输出'active'(或'class =“active”',如果你添加'true'作为函数调用的第二个参数) .

    我用它来突出显示活动的菜单 .

    以下是我的脚本的源代码 . 我希望你觉得它很有用,如果你有任何问题请告诉我 .

    #!/bin/bash
    
    display_syntax(){
        echo ""
        echo "  The Syntax is like this:"
        echo "  ========================"
        echo "      "$(basename $0)" -f <facade_name> -n '<namespace_prefix>'"
        echo ""
        echo "  Example:"
        echo "  ========"
        echo "      "$(basename $0) -f test -n "'App\MyAppDirectory'"
        echo ""
    }
    
    
    if [ $# -ne 4 ]
    then
        echo ""
        display_syntax
        exit
    else
    # Use > 0 to consume one or more arguments per pass in the loop (e.g.
    # some arguments don't have a corresponding value to go with it such
    # as in the --default example).
        while [[ $# > 0 ]]
        do
            key="$1"
                case $key in
                -n|--namespace_prefix)
                namespace_prefix_in="$2"
                echo ""
                shift # past argument
                ;;
                -f|--facade)
                facade_name_in="$2"
                shift # past argument
                ;;
                *)
                        # unknown option
                ;;
            esac
            shift # past argument or value
        done
    fi
    echo Facade Name = ${facade_name_in}
    echo Namespace Prefix = $(echo ${namespace_prefix_in} | sed -e 's#\\#\\\\#')
    echo ""
    }
    
    
    function display_start_banner(){
    
        echo '**********************************************************'
        echo '*          STARTING LARAVEL MAKE FACADE SCRIPT'
        echo '**********************************************************'
    }
    
    #  Init the Vars that I can in the beginning
    function init_and_export_vars(){
        echo
        echo "INIT and EXPORT VARS"
        echo "===================="
        #   Substitution Tokens:
        #
        #   Tokens:
        #   {namespace_prefix}
        #   {namespace_prefix_lowerfirstchar}
        #   {facade_name_upcase}
        #   {facade_name_lowercase}
        #
    
    
        namespace_prefix=$(echo ${namespace_prefix_in} | sed -e 's#\\#\\\\#')
        namespace_prefix_lowerfirstchar=$(echo ${namespace_prefix_in} | sed -e 's#\\#/#g' -e 's/^\(.\)/\l\1/g')
        facade_name_upcase=$(echo ${facade_name_in} | sed -e 's/\b\(.\)/\u\1/')
        facade_name_lowercase=$(echo ${facade_name_in} | awk '{print tolower($0)}')
    
    
    #   Filename: {facade_name_upcase}.php  -  SOURCE TEMPLATE
    source_template='<?php
    
    namespace {namespace_prefix}\Facades;
    
    class {facade_name_upcase}
    {
        //
    }
    '
    
    
    #  Filename: {facade_name_upcase}ServiceProvider.php    -   SERVICE PROVIDER TEMPLATE
    serviceProvider_template='<?php
    
    namespace {namespace_prefix}\Providers;
    
    use Illuminate\Support\ServiceProvider;
    use App;
    
    
    class {facade_name_upcase}ServiceProvider extends ServiceProvider {
    
        public function boot()
        {
            //
        }
    
        public function register()
        {
            App::bind("{facade_name_lowercase}", function()
            {
                return new \{namespace_prefix}\Facades\{facade_name_upcase};
            });
        }
    
    }
    '
    
    #  {facade_name_upcase}Facade.php   -   FACADE TEMPLATE
    facade_template='<?php
    
    namespace {namespace_prefix}\Facades;
    
    use Illuminate\Support\Facades\Facade;
    
    class {facade_name_upcase}Facade extends Facade {
    
        protected static function getFacadeAccessor() { return "{facade_name_lowercase}"; }
    }
    '
    }
    
    
    function checkDirectoryExists(){
        if [ ! -d ${namespace_prefix_lowerfirstchar} ]
        then
            echo ""
            echo "Can't find the namespace: "${namespace_prefix_in}
            echo ""
            echo "*** NOTE:"
            echo "           Make sure the namspace directory exists and"
            echo "           you use quotes around the namespace_prefix."
            echo ""
            display_syntax
            exit
        fi
    }
    
    function makeDirectories(){
        echo "Make Directories"
        echo "================"
        mkdir -p ${namespace_prefix_lowerfirstchar}/Facades
        mkdir -p ${namespace_prefix_lowerfirstchar}/Providers
        mkdir -p ${namespace_prefix_lowerfirstchar}/Facades
    }
    
    function createSourceTemplate(){
        source_template=$(echo "${source_template}" | sed -e 's/{namespace_prefix}/'${namespace_prefix}'/g' -e 's/{facade_name_upcase}/'${facade_name_upcase}'/g' -e 's/{facade_name_lowercase}/'${facade_name_lowercase}'/g')
        echo "Create Source Template:"
        echo "======================="
        echo "${source_template}"
        echo ""
        echo "${source_template}" > ./${namespace_prefix_lowerfirstchar}/Facades/${facade_name_upcase}.php
    }
    
    function createServiceProviderTemplate(){
        serviceProvider_template=$(echo "${serviceProvider_template}" | sed -e 's/{namespace_prefix}/'${namespace_prefix}'/g' -e 's/{facade_name_upcase}/'${facade_name_upcase}'/g' -e 's/{facade_name_lowercase}/'${facade_name_lowercase}'/g')
        echo "Create ServiceProvider Template:"
        echo "================================"
        echo "${serviceProvider_template}"
        echo ""
        echo "${serviceProvider_template}" > ./${namespace_prefix_lowerfirstchar}/Providers/${facade_name_upcase}ServiceProvider.php
    }
    
    function createFacadeTemplate(){
        facade_template=$(echo "${facade_template}" | sed -e 's/{namespace_prefix}/'${namespace_prefix}'/g' -e 's/{facade_name_upcase}/'${facade_name_upcase}'/g' -e 's/{facade_name_lowercase}/'${facade_name_lowercase}'/g')
        echo "Create Facade Template:"
        echo "======================="
        echo "${facade_template}"
        echo ""
        echo "${facade_template}" > ./${namespace_prefix_lowerfirstchar}/Facades/${facade_name_upcase}Facade.php
    }
    
    
    function serviceProviderPrompt(){
        echo "Providers: ${namespace_prefix_in}\Providers\\${facade_name_upcase}ServiceProvider,"
    }
    
    function aliasPrompt(){
        echo "Alias: '"${facade_name_upcase}"' => '"${namespace_prefix_in}"\Facades\\${facade_name_upcase}Facade'," 
    }
    
    #
    #   END FUNCTION DECLARATIONS
    #
    
    
    ###########################
    ## START RUNNING SCRIPT  ##
    ###########################
    
    display_start_banner
    
    init_and_export_vars
    makeDirectories 
    checkDirectoryExists
    echo ""
    
    createSourceTemplate
    createServiceProviderTemplate
    createFacadeTemplate
    echo ""
    echo "==========================="
    echo "  Finished TEST"
    echo "==========================="
    echo ""
    echo "Add these lines to config/app.php:"
    echo "----------------------------------"
    serviceProviderPrompt
    aliasPrompt
    echo ""
    
  • 7

    首先在App \ Http目录中创建helpers.php . 然后在composer.json中添加以下代码

    "autoload": {
            "classmap": [
                "database"
            ],
            "files": [
                "app/Http/helpers.php"
            ],
            "psr-4": {
                "App\\": "app/"
            }
        },
    

    接下来运行以下命令

    composer dump-autoload
    

    现在,您可以在helpers.php文件中定义自定义函数 .

  • 3

    在app文件夹中创建一个 helpers.php 文件,然后使用composer加载它:

    "autoload": {
        "classmap": [
            ...
        ],
        "psr-4": {
            "App\\": "app/"
        },
        "files": [
            "app/helpers.php" // <---- ADD THIS
        ]
    },
    

    将其添加到 composer.json 文件后,运行以下命令:

    composer dump-autoload
    

    如果您不喜欢将 helpers.php 文件保留在您的文件中 app 目录(因为它不是PSR-4命名空间类文件),您可以执行 laravel.com 网站的操作:存储 helpers.php in the bootstrap directory . 请记住在 composer.json 文件中设置它:

    "files": [
        "bootstrap/helpers.php"
    ]
    
  • 19

    **

    • Status Helper

    **创造新的帮手

    <?php
    
    namespace App\Helpers;
    
    use Illuminate\Database\Eloquent\Collection;
    
    class StatusHelper
    {
     protected static $_status = [
            1=> [
                'value' => 1,
                'displayName' => 'Active',
            ],
            2 => [
                'value' => 2,
                'displayName' => 'Inactive',
            ],
            3 => [
                'value' => 3,
                'displayName' => 'Delete',
            ],
    
        ];
    
         public static function getStatusesList()
        {
            $status = (new Collection(self::$_status))->pluck('displayName', 'value')->toArray();
    
    
            return $status;
        }
    }
    

    用于控制器和任何视图文件

    use App\Helpers\StatusHelper;
    
    class ExampleController extends Controller
    {
            public function index()
            {
                $statusList = StatusHelper::getStatusesList();
    
                return view('example.index', compact('statusList'));
            }
    }
    
  • 3

    编写自定义助手的最佳实践是

    1)在项目根目录的 app 目录中,创建一个名为Helpers的文件夹(仅用于分隔和构造代码) .

    2)在文件夹内写入psr-4文件或普通的php文件

    如果PHP文件的格式为psr-4,那么它将自动加载,否则在项目根目录下的composer.json中添加以下行

    autoload 键内,创建一个名为 files 的新键,以便在自动加载时加载文件,在 files 对象中添加从app目录开始的路径 . 这是一个示例 .

    "autoload": {
        "classmap": [
            "database"
        ],
        "psr-4": {
            "App\\": "app/"
        },
        "files": [
            "app/Helpers/customHelpers.php"
        ]
    },
    "autoload-dev": {
        "classmap": [
            "tests/TestCase.php"
        ]
    },
    

    PS:如果文件没有加载,请尝试运行 composer dump-autoload .

  • 431

    对于我的Laravel项目中的自定义帮助程序库,我在 Laravel/App 目录中创建了一个名为 Libraries 的文件夹,在Libraries目录中,我为不同的帮助程序库创建了各种文件 .

    创建我的帮助文件后,我只需在我的 composer.json 文件中包含所有这些文件

    ...
    "autoload": {
            "classmap": [
                "database"
            ],
            "files": [
                "app/Libraries/commonFunctions.php"
            ],
            "psr-4": {
                "App\\": "app/"
            }
        },
    ...
    

    并执行

    composer dumpautoload
    
  • 0

    Create custom helpers’ directory: 首先在app目录中创建Helpers目录 . Create hlper class definition: 现在让我们创建一个简单的辅助函数,它将连接两个字符串 . 在/app/Helpers/MyFuncs.php中创建一个新文件MyFuncs.php添加以下代码

    <?php
    
    namespace App\Helpers;
    
    class MyFuncs {
    
        public static function full_name($first_name,$last_name) {
            return $first_name . ', '. $last_name;   
        }
    }
    

    命名空间App \ Helpers;在App命名空间下定义Helpers名称空间 . class MyFuncs 定义了助手类MyFuncs . public static function full_name($ first_name,$ last_name)定义一个静态函数,它接受两个字符串参数并返回一个连接字符串

    助手服务提供课程

    服务提供程序用于自动加载类 . 我们需要定义一个服务提供程序,它将在/ app / Helpers目录中加载所有帮助程序类 .

    运行以下artisan命令:

    php artisan make:provider HelperServiceProvider

    该文件将在 /app/Providers/HelperServiceProvider.php 中创建

    Open /app/Providers/HelperServiceProvider.php
    

    添加以下代码:

    <?php 
    
    namespace App\Providers;
    
    use Illuminate\Support\ServiceProvider;
    
    class HelperServiceProvider extends ServiceProvider {
    
       /**
        * Bootstrap the application services.
        *
        * @return void
        */
       public function boot()
       {
          //
       }
    
       /**
        * Register the application services.
        *
        * @return void
        */
       public function register()
       {
            foreach (glob(app_path().'/Helpers/*.php') as $filename){
                require_once($filename);
            }
       }
    }
    

    这里,

    namespace App\Providers; defines the namespace provider
    use Illuminate\Support\ServiceProvider; imports the ServiceProvider class namespace
    class HelperServiceProvider extends ServiceProvider {…} defines a class HelperServiceProvider that extends the ServiceProvider class
    public function boot(){…} bootstraps the application service
    public function register(){…} is the function that loads the helpers
    foreach (glob(app_path().'/Helpers/*.php') as $filename){…} loops through all the files in /app/Helpers directory and loads them.
    

    我们现在需要注册HelperServiceProvider并为我们的帮助器创建别名 .

    打开 /config/app.php 文件

    找到providers数组变量

    添加以下行

    App\Providers\HelperServiceProvider::class,
    

    找到别名数组变量

    添加以下行

    'MyFuncs' => App\Helpers\MyFuncs::class,
    

    保存更改使用我们的自定义帮助程序

    我们将创建一个路由,调用我们的自定义帮助函数Open /app/routes.php

    添加以下路由定义

    Route::get('/func', function () {
        return MyFuncs::full_name("John","Doe");
    });
    

    这里,

    return MyFuncs::full_name("John","Doe"); calls the static function full_name in MyFuncs class
    
  • 2

    我使用的另一种方法是:1)在app \ FolderName \ fileName.php中创建一个文件,并在其中包含此代码,即

    <?php
    namespace App\library
    {
     class hrapplication{
      public static function libData(){
       return "Data";
      }
     }
    }
    ?>
    

    2)在我们的刀片之后

    $FmyFunctions = new \App\FolderName\classsName;
      echo $is_ok = ($FmyFunctions->libData());
    

    而已 . 它的工作原理

  • 69

    在app / Helper / Helpers.php中创建Helpers.php

    namespace App\Helper
    class Helpers
    {
    
    
    }
    

    添加作曲家和作曲家更新

    "autoload": {
            "classmap": [
                "database/seeds",
                "database/factories",
                "database","app/Helper/Helpers.php"
            ],
            "psr-4": {
                "App\\": "app/"
            },
             "files": ["app/Helper/Helpers.php"]
        },
    

    use in Controller

    use App\Helper\Helpers
    

    use in view 在config-> app.php文件中更改

    'aliases' => [
        ...
        'Helpers'   => 'App\Helper\Helpers'
        ],
    

    call in view

    <?php echo Helpers::function_name();  ?>
    

相关问题