我试图了解在 Laravel 4 中放置全局函数的最佳位置。例如,日期格式。我不认为做一个门面是值得的,因为门面太模块化了。我已经阅读了有关创建库文件夹并在其中存储类的文章,但这对于一个简单的函数来说似乎也很多。 Blade模板中不应该有这样的“工具”吗?
像这样的最佳实践是什么?我如何使它可用于 Blade 模板?
丑陋、懒惰和可怕的方式:在 bootstrap/start.php
的末尾,添加一个 include('tools.php')
并将您的函数放入该新文件中。
干净的方法:创建一个库。这样,只有在您实际使用它时才会自动加载。
在您的应用程序文件夹中创建一个库文件夹
创建您的库文件,在其中创建一个类,然后向其中添加静态函数
选项 1:编辑 start/global.php 以将 app_path().'/libraries' 添加到 ClassLoader::addDirectories( 数组。
选项 2:编辑 composer.json 以将“app/libraries”添加到自动加载数组。运行作曲家转储自动加载
从您的视图中调用您的类和静态函数。
关于您的选项,引用自 global.php
文件
除了使用 Composer,你还可以使用 Laravel 类加载器来加载你的控制器和模型。这对于在不更新 Composer 的情况下将所有类保留在“全局”命名空间中很有用。
您可以结合使用这两个选项,Laravel 类加载器将自动在注册目录中搜索类(选项 1,更简单),Composer 将记录所有类,但仅在您更新它之后(选项 2,可能会提高性能)。
我这样做的方法是在 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 将自动加载该文件夹中的所有类/文件。这样就无需深入研究任何作曲家文件或运行作曲家命令。
不确定这是否是最佳实践,但它确实有效。
如果您创建了一个名为 /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'
composer dump-autoload
- 我这样做了,花了 20 分钟挠头。
Laravel 的 helpers.php 方法是将其添加到 composer.json (https://github.com/laravel/framework/blob/master/composer.json) 中的“文件”中:
"autoload": {
"classmap": [
...
],
"files": [
"app/libraries/helpers.php"
],
},
我所做的是创建小类(每个类几个方法,每个方法一行,一切都从某物和 DRY 扩展,这是我的目标),
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) 的实例,并且它有很多方法来格式化日期和时间。
formatDDMMAAAA()
用作 static
会更好。
您还可以将 View::share()
与闭包一起使用来实现这一点 - 我刚刚发布了这个:http://www.develophp.org/2014/07/laravel-4-blade-helper-functions/
额外的好处:您不需要创建额外的类并保持全局命名空间干净。
不定期副业成功案例分享
app_path().'/library'
放在 start/global.php 中。sitehelpers.php