【发布时间】:2017-05-17 10:02:20
【问题描述】:
我有两个控制器文件 homecontroller 和 backendcontroller。创建全局函数并从两个文件访问它的最佳方法是什么?
我发现here Arian Acosta 的回答很有帮助,但我想知道是否有最简单的方法。如有任何建议,我将不胜感激。
【问题讨论】:
标签: laravel controller global
我有两个控制器文件 homecontroller 和 backendcontroller。创建全局函数并从两个文件访问它的最佳方法是什么?
我发现here Arian Acosta 的回答很有帮助,但我想知道是否有最简单的方法。如有任何建议,我将不胜感激。
【问题讨论】:
标签: laravel controller global
一种方法是创建一个类并使用它的实例,这样您不仅可以在控制器、刀片或任何其他类中访问该类的对象。
在您的应用文件夹中创建一个名为 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();
}
}
在控制器中你可以调用各种函数
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.phpAppHelper 类创建别名来减少调用完整函数命名空间 \App\Helpers 的开销/strong>
'aliases' => [
....
'AppHelper' => App\Helpers\AppHelper::class
]
在你的控制器或刀片文件中,你可以直接调用
\AppHelper::instance()->functioName();
【讨论】:
public static function instance() { return new AppHelper(); },然后使用\App\Helpers\AppHelper::instance()->functionname(); 调用任何函数?
composer dump-autoload 让 Laravel 识别新文件?
在您的app 目录中创建一个新的Helpers 文件夹。
在该Helpers 文件夹中创建一个名为your_helper_function.php 的php 文件。
在your_helper_function.php中添加你的函数
function your_function($parameters){
//function logic
}
function your_another_function($parameters){
//function logic
}
将此文件添加到您的composer.json 的Files 键中
"autoload": {
...
"files": [
"app/Helpers/your_helper_function.php"
]
...
}
然后最后重新生成作曲家自动加载文件。 (在你的项目目录中运行)
composer dump-autoload
就是这样!现在您可以在 Laravel 项目的任何部分访问 your_function() 或 your_another_function()。
如果您仍有任何困惑,请查看我的博客文章了解如何操作:
【讨论】:
composer dump-autoload 真的是做什么的?它会创建新文件吗?
composer.json 文件(作曲家使用自动加载依赖项)你应该运行composer dump-autoload,它将转储当前加载的文件并根据更改的配置文件加载。避免问题只是一种好习惯
更新:
第 1 步 在应用程序文件夹中添加文件夹 应用程序->助手
第 2 步 在 Helper 文件夹中添加 php 类 例如。 Helper.php
将命名空间和类添加到 Helper.php
namespace App\Helper;
class Helper
{
}
将此 Helper.php 注册到 config/app.php 文件中
'aliases' => [
....
'Helper' => App\Helper\Helper::class
]
现在,在 Helper.php 中编写所有函数,它可以在任何地方访问。
如何从 Controller 访问?
第 1 步 - 在控制器顶部添加命名空间。
use App\Helper\Helper;
第 2 步 - 调用函数 - 假设 Helper 类中有一个 getInformation()。
$information = Helper::getInformation()
【讨论】:
在你的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));
}
所有控制器和刀片都可以访问主控制器中的数据。
【讨论】:
我在 Laravel 中使用全局函数已经有一段时间了,我想分享一下我是如何做到的。这是这篇文章中两个答案的混合体: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();
【讨论】:
Laravel 默认使用命名空间。因此,您需要按照该答案中描述的方法来设置帮助文件。
尽管在您的情况下您想访问不同控制器中的方法。为此,有一种更简单的方法。向您的基本控制器 app/Http/Controllers/Controller.php 添加一个方法,您可以在每个其他控制器中访问它们,因为它们扩展了它。
// in app/Http/Controllers/Controller.php
protected function dummy()
{
return 'dummy';
}
// in homecontroller
$this->dummy();
【讨论】:
有几种方法,具体取决于您尝试添加的具体功能。
1) 在 Controller.php 中创建一个函数,并使所有其他控制器扩展该控制器。您可以将其与 master.blade.php 进行比较
2) 创建一个 trait,一个 trait 可以为你做很多事情,并保持你的控制器干净。我个人喜欢使用特征,因为它看起来很干净,让我的 Controller.php 不会被大量不同的代码行弄得一团糟。
【讨论】:
创建全局函数
在文件夹下创建一个 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
【讨论】: