我正在尝试了解在Laravel 4中放置全局函数的最佳位置。例如,日期格式化。我不认为制作外立面是值得的,因为外墙过于模块化。我已经阅读了有关创建库文件夹和存储类的文章,但对于一个简单的函数来说,这似乎也很多。刀片模板中不应该有这样的“工具”吗?
此类内容的最佳做法是什么?如何将其提供给Blade模板?
答案 0 :(得分:232)
丑陋,懒惰和糟糕的方式:在bootstrap/start.php
结束时,添加include('tools.php')
并将您的函数放入该新文件中。
干净的方式:创建一个库。这样,只有当你真正使用它时才会自动加载。
libraries
文件夹app
文件夹
start/global.php
以将app_path().'/libraries'
添加到ClassLoader::addDirectories(
阵列。composer.json
以将"app/libraries"
添加到autoload
数组。运行composer dump-autoload
关于您的选项,引自global.php
文件
除了使用Composer之外,您还可以使用Laravel类加载器 加载您的控制器和模型。这对于保留所有内容非常有用 您的类在“全局”命名空间中没有更新Composer。
您可以组合这两个选项,Laravel类加载器将自动搜索已注册目录中的类(选项1 ,更容易),Composer将保留所有类的记录,但仅在更新后它(选项2 ,可能会提高性能)。
答案 1 :(得分:82)
我这样做的方法是在Laravel 4项目根目录的/app
目录中创建一个新文件夹。然后将此文件夹添加到/app/start/global.php
文件的第一个数组中,如下所示:
<?php
ClassLoader::addDirectories(array(
app_path().'/commands',
app_path().'/controllers',
app_path().'/models',
app_path().'/database/seeds',
app_path().'/classes', // This line is the one I've added.
));
只要新/app/classes
文件夹中的文件夹结构遵循命名空间约定即可。 Laravel 4将自动加载此文件夹中的所有类/文件。这样就不需要深入研究任何作曲家文件或运行composer命令。
不确定这是否是最佳做法但确实有效。
如果您创建了一个名为/app/classes/Helpers/Helper.php
的简单文件,例如:
<?php namespace Helpers;
class Helper {
public static function helloWorld()
{
return 'Hello World';
}
}
您需要做的就是致电Helpers\Helper::helloWorld();
您也可以在/app/config/app.php
文件中为此助手类添加别名。只需将这样的内容添加到aliases
数组的末尾:
'Helper' => 'Helpers\Helper'
答案 2 :(得分:25)
Laravel的helpers.php方法是将它添加到composer.json(https://github.com/laravel/framework/blob/master/composer.json)中的“文件”中:
"autoload": {
"classmap": [
...
],
"files": [
"app/libraries/helpers.php"
],
},
我所做的是创建小类(每个类有几个方法,每个方法一行,从某些东西扩展到干,这是我的目标),
class ExtendedCarbon extends Carbon\Carbon {
public function formatDDMMAAAA($date)
{
/// format and return
}
}
将它们保存到app / libraries中并添加到composer.json:
"autoload": {
"classmap": [
...
"app/libraries",
...
],
},
执行
composer dump
然后只需在任何需要的地方使用它们
$formatted = (new ExtendedCarbon)->formatDDMMAAAA($date);
观看有关重构的视频:http://www.youtube.com/watch?v=DC-pQPq0acs
顺便说一下,我确定这只是一个例子,但你可能不需要帮助器来设置日期格式,因为Laravel中的所有日期都是Carbon(https://github.com/briannesbitt/Carbon)的实例并且它有负载格式化日期和时间的方法。
答案 3 :(得分:7)
你也可以使用View::share()
和闭包来实现这一点 - 我刚发布了这个:http://www.develophp.org/2014/07/laravel-4-blade-helper-functions/
增加了好处:您不需要创建额外的类,也可以保持全局命名空间的清洁。