如何创建可从任何控制器和刀片文件访问的全局功能

Joh*_*nny 21 controller global laravel

我有两个控制器文件homecontroller和backendcontroller.创建全局函数并从两个文件访问它的最佳方法是什么?

我在这里发现Arian Acosta的答案很有帮助,但我想知道是否有最简单的方法.我将不胜感激任何建议.

Max*_*rav 53

一种方法是创建一个类并使用它的实例,这样你不仅可以访问控制器,刀片或任何其他类中的类的对象.

AppHelper文件

在你的app文件夹中创建一个名为Helpers的文件夹,在其中创建一个文件名AppHelper或任何你选择的文件夹

<?php
namespace App\Helpers;

class AppHelper
{
      public function bladeHelper($someValue)
      {
             return "increment $someValue";
      }

     public function startQueryLog()
     {
           \DB::enableQueryLog();
     }

     public function showQueries()
     {
          dd(\DB::getQueryLog());
     }

     public static function instance()
     {
         return new AppHelper();
     }
}
Run Code Online (Sandbox Code Playgroud)

用法

在控制器中

在控制器中,您可以调用各种功能

public function index()
{
    //some code

   //need to debug query
   \App\Helpers\AppHelper::instance()->startQueryLog();

   //some code that executes queries
   \App\Helpers\AppHelper::instance()->showQueries();
}
Run Code Online (Sandbox Code Playgroud)

在刀片文件中

假设您在刀片文件中,以下是如何调用应用程序刀片帮助程序功能

some html code
{{ \App\Helpers\AppHelper::instance()->bladeHelper($value) }}
and then some html code
Run Code Online (Sandbox Code Playgroud)

减少命名空间的开销(可选)

您还可以通过在config\app.php中AppHelper类创建别名来减少调用完整函数namespace \ App\Helpers的开销

'aliases' => [
       ....
       'AppHelper' => App\Helpers\AppHelper::class
 ]
Run Code Online (Sandbox Code Playgroud)

在您的控制器或刀片文件中,您可以直接拨打电话

\AppHelper::instance()->functioName();
Run Code Online (Sandbox Code Playgroud)

  • 您可以删除实例函数并使所有其他函数变为静态函数,然后直接调用** AppHelper :: bladeHelper()**。实例函数可帮助我在构造函数或链函数调用中初始化事物。 (2认同)

Sap*_*aik 23

这很容易:

  1. Helpersapp目录中创建一个新文件夹.
  2. 创建一个在刚刚创建的目录中php命名的文件.your_helper_function.phpHelpers
  3. 内部your_helper_function.php:

    function your_function($parameters){
    
        //function logic
    
    } 
    
    Run Code Online (Sandbox Code Playgroud)
  4. 然后将此文件添加到Filescomposer.json喜欢的密钥中:

    
    "autoload": {
        ...
        "files": [
            "app/Helpers/your_helper_function.php"
        ]
        ...
    }
    
    Run Code Online (Sandbox Code Playgroud)
  5. 最后在终端中运行此命令(在您的项目目录中),

    composer dump-autoload
    Run Code Online (Sandbox Code Playgroud)

而已!现在您可以访问your_function()laravel项目的任何部分.

P. S:如果您希望多个功能全局可用,您可以将它们全部放在一个文件中,并将该文件添加到Files密钥composer.json

如果您仍有任何疑惑,请查看我的博客文章,了解如何执行此操作:

如何使用Composer在Laravel中添加Global功能?

  • @hijacker83 当您的项目运行时,composer 将一些文件加载​​到内存中,以获得无缝的编码体验(没有命名空间的麻烦等等),因此每当您对 `composer.json` 文件(作曲家用于自动加载依赖项)进行任何更改时应该运行`composer dump-autoload`,它将转储当前加载的文件并根据更改的配置文件加载。这是避免问题的好习惯 (3认同)
  • 如果您正在与大团队合作或者您正在规划功能,则不推荐这种方式,因为它可能是一种“神奇”的方法。其他开发人员可以花大量时间来理解魔术方法是如何进来的。在我看来,Helpers 方式要好得多(使用 config/app.php)。 (2认同)

Eli*_*rin 16

Laravel 服务提供商方式

我在 Laravel 中使用全局函数已经有一段时间了,我想分享一下我是如何做到的。这是这篇文章中两个答案的混合: https: //stackoverflow.com/a/44021966/5543999/sf/answers/3081702991/

这种方式将在 ServiceProvider 中加载文件并将其注册到您的 Laravel 应用程序中。

区别在哪里,范围,总是关于范围的。

Composer //Autload whitin composer.json method
|
|--->Laravel App //My method
     |
     |--->Controller //Trait method
     |--->Blade //Trait method
     |--->Listener //Trait method
     |--->...
Run Code Online (Sandbox Code Playgroud)

这是解释我的观点的一种非常简单的方法,所有三种方法都将达到“全局函数”的目的。Traits 方法需要您声明use App\Helpers\Trait;or App\Helpers\Trait::function()

作曲家和服务提供者几乎是一样的。对我来说,它们更好地回答了什么是全局函数的问题,因为它们不需要在您想要使用它们的每个地方声明它们。你只需使用它们function()。主要区别在于您对事物的偏好。

如何

  1. 创建函数文件:App\Functions\GlobalFunctions.php

    //App\Functions\GlobalFunctions.php
    <?php
    
        function first_function()
        {
            //function logic
        }
    
        function second_function()
        {
            //function logic
        }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建服务提供者:

     //Into the console
     php artisan make:provider GlobalFunctionsServiceProvider
    
    Run Code Online (Sandbox Code Playgroud)
  3. 打开新文件 App\Providers\GlobalFunctionsServiceProvider.php 并编辑注册方法

     //App\Providers\GlobalFunctionsServiceProvider.php
    
     public function register()
     {
         require_once base_path().'/app/Functions/GlobalFunctions.php';
     }
    
    Run Code Online (Sandbox Code Playgroud)
  4. 将您的提供程序注册到提供程序中的 App\Config\App.php 中

     //App\Config\App.php
    
     'providers' => [
    
         /*
         * Laravel Framework Service Providers...
         */
         Illuminate\Auth\AuthServiceProvider::class,
         ...
         Illuminate\Validation\ValidationServiceProvider::class,
         Illuminate\View\ViewServiceProvider::class,
         App\Providers\GlobalFunctionsServiceProvider::class, //Add your service provider
    
    Run Code Online (Sandbox Code Playgroud)
  5. 运行一些 artisan 的命令

     //Into the console
     php artisan clear-compiled
     php artisan config:cache
    
    Run Code Online (Sandbox Code Playgroud)
  6. 使用新的全局函数

     //Use your function anywhere within your Laravel app
     first_function();
     second_function();
    
    Run Code Online (Sandbox Code Playgroud)


小智 9

在您的Controller.phpwhich 中extends BaseController,您可以创建一个函数,例如;

public function data($arr = false)
{
 $data['foo'] = 'bar';
 return array_merge($data,$arr);
}
Run Code Online (Sandbox Code Playgroud)

当您将数据发送到视图时,来自任何控制器;

public function example()
{
 $data['smthg'] = 'smthgelse';
 return view('myView',$this->data($data));
}
Run Code Online (Sandbox Code Playgroud)

可以从所有控制器和刀片访问主控制器中的数据。


小智 7

使用任何命名的公用文件.例如.Common.php并在其中编写所有常用功能.现在,如果要在控制器中访问此常用功能,只需使用"use"包含此Common.php文件即可.

use Common;
Run Code Online (Sandbox Code Playgroud)

然后,您可以访问Common.php中包含的所有常用功能.同样在其他控制器中执行.

  • 你在哪里制作文件?它在任何地方吗? (4认同)
  • @Rahul你的答案不完整。请更新它,以便用户知道 common.php 文件的路径是什么。谢谢。 (3认同)