如果我想为我正在进行的一些OAuth相关操作创建一个currentUser()
函数,以便我可以在视图或控制器中使用它(类似于Rails中,在应用程序控制器中执行helper_method:current_user
)。
我阅读的所有内容都指出要创建一个帮助程序文件夹并在其中添加该函数,然后您可以执行Helpers :: functionName
。这是正确的方式吗?
在Laravel中,创建可以在Blade模板和控制器中使用的辅助函数的“Laravel方式”是什么?
如果我想为我正在进行的一些OAuth相关操作创建一个currentUser()
函数,以便我可以在视图或控制器中使用它(类似于Rails中,在应用程序控制器中执行helper_method:current_user
)。
我阅读的所有内容都指出要创建一个帮助程序文件夹并在其中添加该函数,然后您可以执行Helpers :: functionName
。这是正确的方式吗?
在Laravel中,创建可以在Blade模板和控制器中使用的辅助函数的“Laravel方式”是什么?
在您的应用程序/Helpers目录中创建一个名为AnythingHelper.php的新文件。 我的助手的一个示例是:
<?php
function getDomesticCities()
{
$result = \App\Package::where('type', '=', 'domestic')
->groupBy('from_city')
->get(['from_city']);
return $result;
}
通过以下命令为您的助手生成服务提供程序
php artisan make:provider HelperServiceProvider
在您新生成的HelperServiceProvider.php文件的register函数中添加以下代码。require_once app_path('Helpers/AnythingHelper.php');
现在在您的config/app.php中加载此服务提供程序,您就完成了
'App\Providers\HelperServiceProvider',
创建全局函数文件的一种简单高效方法是直接从Composer中自动加载它。Composer的autoload部分接受一个files
数组,会被自动加载。
在任何你喜欢的地方创建一个functions.php
文件。在这个例子中,我们将在app/Helpers
目录下创建。
添加你的函数,但不要添加类或命名空间。
<?php
function global_function_example($str)
{
return 'A Global Function with '. $str;
}
在 composer.json
文件的 autoload
部分中添加以下行:
"files": ["app/Helpers/functions.php"]
Laravel 5的示例:
"autoload": {
"classmap": [
"database"
],
"psr-4": {
"App\\": "app/"
},
"files": ["app/Helpers/functions.php"] // <-- Add this line
},
运行 composer dump-autoload
完成!现在你可以在应用程序的任何部分,包括 Blade 视图中访问 global_function_example('hello world')
。
composer dump-autoload
时会发生什么?是否会创建新文件?我甚至删除了像 composer.json、gulpfile.js 这样的文件,因为我认为它们根本没有被使用。 - Johnnycomposer dump-autoload
就像清除 composer 缓存一样。基本上,它会重新评估需要从 composer.json 文件加载的类。祝你好运! - Arian Acosta你经常会发现自己需要一些在整个应用程序中都可以访问的实用函数。借鉴Laravel编写默认助手函数的方式,您可以使用自定义函数扩展其功能。
我更喜欢使用文件而不是类,因为我不想处理命名空间,并且希望它的函数可以在没有类前缀的情况下访问,就像Laravel使用其帮助程序一样:greeting('Brian');
而不是 Helper::greeting('Brian');
。
文件:app/Support/helper.php
composer.json
{
...
"autoload": {
"classmap": [
"database"
],
"files": [
"app/Support/helpers.php"
],
"psr-4": {
"App\\": "app/"
}
},
...
}
<?php
if (!function_exists('greet')) {
/**
* Greeting a person
*
* @param string $person Name
* @return string
*/
function greet($person)
{
return 'Hello ' . $person;
}
}
在尝试访问其函数之前,请记得自动加载文件:
composer dump-autoload
$ php artisan tinker
Psy Shell v0.8.17 (PHP 7.0.6 ΓÇö cli) by Justin Hileman
>>> greet('Brian');
=> "Hello Brian"
>>> exit
Exit: Goodbye.
<p>{{ greet('Brian') }}</p>
有时您会发现自己想要使用 Blade 指令而不是普通函数。
在 AppServiceProvider 的 boot 方法中注册您的 Blade 指令:app/Providers/AppServiceProvider.php
public function boot()
{
// ...
Blade::directive('greet', function ($expression) {
return "<?php echo greet({$expression}); ?>";
});
}
使用方法: <p>@greet('Brian')</p>
注意: 你可能需要清除缓存视图 php artisan view:clear
if (!function_exists('printHello')) {
function printHello()
{
return "Hello world!";
}
}
在 app/Providers/AppServiceProvider.php 文件中,在 register 方法中添加以下内容:
public function register()
{
require_once __DIR__ . "/path/to/utils.php"
}
现在,printHello函数就像任何其他Laravel全局函数一样,在代码库中的任何地方都可以访问。
如果您不想逐个注册所有帮助函数,并且想知道如何在创建新帮助函数时注册它们,还有另一种选项:
再次进入 app/Providers/AppServiceProvider.php 文件,在 register 方法中添加以下内容:
public function register()
{
foreach (glob(app_path().'/Helpers/*.php') as $filename) {
require_once($filename);
}
}