如果我想为某些oauth的东西做一个currentUser()
函数,我可以在视图或控制器中使用它(想想rails,你在应用程序控制器中helper_method: current_user
)。
我读到的所有内容都指出要创建一个帮助文件夹并在那里添加函数,然后你可以这样做Helpers::functionName
这是正确的方法吗?
创建可在刀片模板和控制器中使用的辅助函数的“laravel方式”是什么?
答案 0 :(得分:67)
在app / 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',
答案 1 :(得分:36)
创建全局函数文件的另一种有效方法是直接从composer自动加载它。 composer的自动加载部分接受自动加载的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"]
},
composer dump-autoload
恭喜!您现在可以从应用程序的任何部分访问global_function_example('hello world')
,包括Blade视图。
我希望这对某人有用!
答案 2 :(得分:12)
通常,您会发现自己需要一个在整个应用程序中全局访问的实用程序功能。借助laravel编写默认助手的方式,您可以使用自定义函数扩展该功能。
我更喜欢你一个文件,而不是一个类,因为我不想打扰命名空间,我希望它的功能可以在没有类前缀的情况下访问,例如:greeting('Brian');
而不是Helper::greeting('Brian');
就像Laravel一样与他们的助手一起做。
文件: 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>
有时您会发现自己想要使用刀片指令而不是普通函数。
在AppServiceProvider的引导方法中注册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
答案 3 :(得分:0)
以上答案很好,但有一点复杂,因此该答案存在。
utils.php
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全局函数中一样在代码库中的任何位置访问。
答案 4 :(得分:0)
另一种选择,如果您不想一个接一个地注册所有助手功能,并且想知道每次创建新的助手功能时如何注册它们:
再次在 app / Providers / AppServiceProvider.php 中,在 register 方法中添加以下内容
public function register()
{
foreach (glob(app_path().'/Helpers/*.php') as $filename) {
require_once($filename);
}
}