我有两个控制器文件homecontroller和backendcontroller。创建全局函数并从两个文件访问它的最佳方法是什么?
我发现here Arian Acosta的回答很有帮助,但我想知道是否有最简单的方法。我很感激任何建议。
答案 0 :(得分:46)
执行此操作的一种方法是创建一个类并使用其实例,这样您不仅可以在控制器,刀片或任何其他类中访问类的对象。
在你的app文件夹中创建一个名为帮助的文件夹,然后在其中创建一个文件名 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();
}
}
在控制器中,您可以调用各种功能
public function index()
{
//some code
//need to debug query
\App\Helpers\AppHelper::instance()->startQueryLog();
//some code that executes queries
\App\Helpers\AppHelper::instance()->showQueries();
}
假设您在刀片文件中,以下是如何调用应用程序刀片帮助程序功能
some html code
{{ \App\Helpers\AppHelper::instance()->bladeHelper($value) }}
and then some html code
您还可以通过在 config \ app.php <中为 AppHelper 类创建别名来减少调用完整函数名称空间 \ App \ Helpers 的开销。 /强>
'aliases' => [
....
'AppHelper' => App\Helpers\AppHelper::class
]
在您的控制器或刀片文件中,您可以直接拨打
\AppHelper::instance()->functioName();
答案 1 :(得分:17)
Helpers
目录中创建一个新的app
文件夹。php
文件夹中创建名为your_helper_function.php
的{{1}}个文件。在Helpers
your_helper_function.php
将此文件添加到function your_function($parameters){
//function logic
}
的{{1}}密钥
Files
然后最终重新生成作曲家自动加载文件。 (在项目目录中运行)
composer.json
那就是它!现在,您可以在laravel项目的任何部分访问
"autoload": {
...
"files": [
"app/Helpers/your_helper_function.php"
]
...
}
。
如果您希望全局使用多个功能,可以将它们全部放在一个文件中,并将该文件添加到composer dump-autoload
your_function()
键,如步骤4所示。
如果您仍然有任何疑惑,请查看我的博文,了解如何执行此操作:
答案 2 :(得分:5)
使用任何已命名的公用文件。例如。 Common.php并在其中编写所有常用功能。现在,如果要在控制器中访问此常用功能,只需使用“use”包含此Common.php文件。
use Common;
然后您可以访问Common.php中包含的所有常用功能。同样在其他控制器中也可以这样做。
答案 3 :(得分:4)
在Controller.php
extends BaseController
中,您可以创建类似的功能
public function data($arr = false)
{
$data['foo'] = 'bar';
return array_merge($data,$arr);
}
当您向视图发送数据时,从任何控制器;
public function example()
{
$data['smthg'] = 'smthgelse';
return view('myView',$this->data($data));
}
可以从所有控制器和刀片访问主控制器中的数据。
答案 4 :(得分:3)
Laravel默认使用名称空间。因此,您需要按照该答案中描述的方法设置帮助文件。
虽然在您的情况下您想要访问不同控制器中的方法。为此,这是一种更简单的方法。向基本控制器app/Http/Controllers/Controller.php
添加一个方法,您可以在每个其他控制器中访问它们,因为它们会扩展它。
// in app/Http/Controllers/Controller.php
protected function dummy()
{
return 'dummy';
}
// in homecontroller
$this->dummy();
答案 5 :(得分:1)
有几种方法,具体取决于您尝试添加的确切功能。
1)在Controller.php中创建一个函数,并使所有其他控制器扩展该控制器。你可以在某种程度上与master.blade.php
相提并论2)创建一个特质,一个特性可以为你做很多事情,并保持你的控制器清洁。我个人喜欢使用特性,因为它看起来很干净,让我的Controller.php不会被大量不同的代码行弄得一团糟。
答案 6 :(得分:1)
我在Laravel中使用全局函数已有一段时间了,我想分享我的操作方法。这篇博文中的2个答案有点混杂:https://stackoverflow.com/a/44021966/5543999和https://stackoverflow.com/a/44024328/5543999
这种方式将在ServiceProvider中加载文件并在您的Laravel应用中注册它。
范围是什么,范围总是关于范围。
Composer //Autload whitin composer.json method
|
|--->Laravel App //My method
|
|--->Controller //Trait method
|--->Blade //Trait method
|--->Listener //Trait method
|--->...
这是一个非常简单的解释我的观点的方法,所有这三种方法都将达到“全局功能”的目的。 Traits方法将需要您声明use App\Helpers\Trait;
或App\Helpers\Trait::function()
。
作曲家和服务提供商几乎是相同的。对我来说,它们对什么是全局函数的问题回答得更好,因为它们不需要在要使用它们的每个位置上声明它们。您只需使用它们function()
。主要区别在于您喜欢事物的方式。
创建功能文件:App \ Functions \ GlobalFunctions.php
//App\Functions\GlobalFunctions.php
<?php
function first_function()
{
//function logic
}
function second_function()
{
//function logic
}
创建服务提供商:
//Into the console
php artisan make:provider GlobalFunctionsServiceProvider
打开新文件App \ Providers \ GlobalFunctionsServiceProvider.php并编辑注册方法
//App\Providers\GlobalFunctionsServiceProvider.php
public function register()
{
require_once base_path().'/app/Functions/GlobalFunctions.php';
}
在提供程序中将您的提供程序注册到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
运行一些工匠的命令
//Into the console
php artisan clear-compiled
php artisan config:cache
使用新的全局函数
//Use your function anywhere within your Laravel app
first_function();
second_function();
答案 7 :(得分:0)
创建全局函数
在一个文件夹下创建一个Helpers.php文件,我们将其命名为“core”。
core
|
-- Helpers.php
namespace Helpers; // define Helper scope
if(!function_exists('html')) {
function html($string) {
// run some code
return $str;
}
}
在你的 composer.json 中
"autoload": {
"psr-4": {
},
"files": [
"core/Helpers.php"
]
}
在您要使用的文件中
// the " use " statement is not needed, core/Helpers is loaded on every page
if(condition_is_true) {
echo Helpers\html($string);die();
}
如果你想调用你的函数而不需要前缀命名空间,请删除 Helpers.php 中的命名空间。不过我建议把它留在那里。
信用:https://dev.to/kingsconsult/how-to-create-laravel-8-helpers-function-global-function-d8n