如何创建一个全局函数,可以从任何控制器和 Blade 文件中访问
如何创建一个全局函数,可以从任何控制器和 Blade 文件中访问
我有两个控制器文件,homecontroller和backendcontroller。有什么最好的方法可以创建全局函数并从这两个文件中访问它?
我在这里找到了Arian Acosta的答案,链接为https://stackoverflow.com/questions/32419619/how-do-i-make-global-helper-functions-in-laravel-5,我觉得很有帮助,但我想知道是否有更简单的方法。我将非常感谢任何建议。
如何创建可以从任何控制器和Blade文件中访问的全局函数
问题的出现原因:
- 需要在多个控制器和Blade文件中共享同一个函数
- 不想在每个控制器和Blade文件中重复定义相同的函数
解决方法:
- 创建一个类,并在需要的地方使用其实例
- 在app文件夹中创建一个名为Helpers的文件夹,在其中创建一个名为AppHelper的文件
- 在AppHelper文件中定义所需的函数
- 在控制器和Blade文件中调用AppHelper类的实例来访问这些函数
代码示例:
在控制器中使用:
public function index() { //需要调试查询 \App\Helpers\AppHelper::instance()->startQueryLog(); //执行查询的代码 \App\Helpers\AppHelper::instance()->showQueries(); }
在Blade文件中使用:
{{ \App\Helpers\AppHelper::instance()->bladeHelper($value) }}
可选:减少命名空间的开销
- 在config\app.php文件中为AppHelper类创建别名
- 在控制器或Blade文件中直接调用别名即可
\AppHelper::instance()->functioName();
问题中提到的其他观点:
- 可以删除instance函数,并将其他函数都定义为静态函数,直接调用AppHelper::bladeHelper()
- 可能需要运行composer dump-autoload命令以供Laravel识别新文件
- 这种方案效率低下,因为每次调用instance时都会创建一个新的类实例。而且,这些“全局”函数似乎完全不相关,并且不使用任何需要“this”对象的内容。因此,它们不应该是同一个类的一部分。这似乎是对面向对象编程概念的完全误用,是一种糟糕的编码风格。
问题的出现原因是需要在任何控制器和模板文件中访问全局函数。为了解决这个问题,可以按照以下步骤进行操作:
更新:
步骤1:
在app文件夹内添加一个文件夹。
app->Helper
步骤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文件中编写所有的函数,它们将在任何地方都可访问。
如何在控制器中访问?
步骤1:在控制器顶部添加命名空间。
use App\Helper\Helper;
步骤2:调用函数 - 假设Helper类中有一个getInformation()函数。
$information = Helper::getInformation()
嗨,Rahul。这对我有用。我选择了这个答案作为已接受的答案,因为我认为这是最简单的方法。
你在哪里创建文件?是任何地方吗?
你的答案不完整。请更新一下,以便用户可以知道common.php文件的路径。谢谢。
有没有办法在控制器中自动运行该方法,而不需要显式调用它?
如何使用别名调用助手函数?
怎样从控制器调用助手函数?
向控制器添加一个命名空间。例如,如果类名为Helper。使用App\Library\Helper; public function getData() { Helper::getInformation(); }
如何在Lumen 8.0中使用助手函数?请分享您的观点。非常感谢。
如何在Blade文件中访问助手函数?
如何创建可以从任何控制器和Blade文件中访问的全局函数
在Laravel项目中,有时我们需要创建可以从任何控制器和Blade文件中访问的全局函数。下面提供了一种简单的解决方法:
1. 在`app`目录下创建一个名为`Helpers`的文件夹。
2. 在`Helpers`目录中创建一个名为`your_helper_function.php`的PHP文件。
3. 在`your_helper_function.php`文件中添加你的函数,例如:
function your_function($parameters){ //function logic } function your_another_function($parameters){ //function logic }
4. 在`composer.json`文件的`autoload`键下添加该文件的路径,例如:
"autoload": { ... "files": [ "app/Helpers/your_helper_function.php" ] ... }
5. 最后,重新生成Composer的自动加载文件。在项目目录中运行以下命令:
composer dump-autoload
完成以上步骤后,你就可以在Laravel项目的任何地方访问`your_function()`或`your_another_function()`了。
如果你还有疑问,可以查看我的博客文章,了解如何执行这些操作:[如何在Laravel中使用Composer添加全局函数?](https://www.kerneldev.com/2017/12/05/how-to-add-a-global-function-in-laravel-using-composer/)
关于`composer dump-autoload`命令,它的作用是重新加载Composer自动加载文件。当你对`composer.json`文件进行更改时,运行该命令会重新加载文件。这是一个良好的习惯,可以避免出现问题。
对于大型团队或未来计划扩展的项目,这种方法可能不是推荐的方式,因为它可能会带来一些"神奇"的方法。其他开发人员可能需要花费大量时间来了解这些神奇方法的实现。根据我的观点,使用Helpers的方式更好(与config/app.php结合使用)。
需要注意的是,这种方法要求文件不被命名空间所限制。因此,如果你尝试同时使用这种方法和命名空间,请注意避免冲突。
这就是如何创建一个可以从任何控制器和Blade文件中访问的全局函数的方法。希望对你有所帮助!