我试图了解在 Laravel 4 中放置全局函数的最佳位置。例如,日期格式。我不认为做一个门面是值得的,因为门面太模块化了。我已经阅读了有关创建库文件夹并在其中存储类的文章,但这对于一个简单的函数来说似乎也很多。Blade模板中不应该有这样的“工具”吗?
像这样的最佳实践是什么?我如何使它可用于 Blade 模板?
我试图了解在 Laravel 4 中放置全局函数的最佳位置。例如,日期格式。我不认为做一个门面是值得的,因为门面太模块化了。我已经阅读了有关创建库文件夹并在其中存储类的文章,但这对于一个简单的函数来说似乎也很多。Blade模板中不应该有这样的“工具”吗?
像这样的最佳实践是什么?我如何使它可用于 Blade 模板?
丑陋、懒惰和可怕的方式:在 . 末尾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,可能会提高性能)。
我这样做的方法是在/app
Laravel 4 项目的根目录中创建一个新文件夹。然后将此文件夹添加到文件的第一个数组中,/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'
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)和它有很多方法来格式化日期和时间。
您也可以View::share()
与闭包一起使用来实现这一点 - 我刚刚发布了这个: http: //www.develophp.org/2014/07/laravel-4-blade-helper-functions/
额外的好处:您不需要创建额外的类并保持全局命名空间干净。