我想了解将全局函数放置在Laravel 4中的最佳位置。例如,日期格式化。我认为创建一个门面不值得,因为门面过于模块化。我阅读了有关创建库文件夹并在其中存储类的文章,但对于一个简单的功能来说,这似乎也太多了。这样的“工具”难道不应该在Blade模板中可用吗?
对于这样的问题,最佳实践是什么,如何使其在Blade模板中可用?
我想了解将全局函数放置在Laravel 4中的最佳位置。例如,日期格式化。我认为创建一个门面不值得,因为门面过于模块化。我阅读了有关创建库文件夹并在其中存储类的文章,但对于一个简单的功能来说,这似乎也太多了。这样的“工具”难道不应该在Blade模板中可用吗?
对于这样的问题,最佳实践是什么,如何使其在Blade模板中可用?
bootstrap/start.php
末尾添加include('tools.php')
,并将您的函数放置在新文件中。app
文件夹内创建一个libraries
文件夹
- 创建您的库文件,在其中创建一个类,并添加静态函数
- 选项1: 编辑start/global.php
文件,将app_path().'/libraries'
添加到ClassLoader::addDirectories(
数组中。
- 选项2: 编辑composer.json
文件,将"app/libraries"
添加到autoload
数组中。运行composer dump-autoload
- 从视图中调用您的类和静态函数。global.php
文件:
您可以结合两个选项,其中Laravel类加载器将自动搜索已注册的目录(选项1,更容易),而Composer将记录所有类,但只有在更新后才会生效(选项2,可能提高性能)。除了使用Composer,您还可以使用Laravel类加载器来加载控制器和模型。这对于使所有类保持在“全局”命名空间中而不更新Composer非常有用。
我做这件事情的方式是在 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 文件或运行 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'
composer dump-autoload
- 我曾经因此浪费了20分钟。 - al_manchesterLaravel中的helpers.php方法是将其添加到您的composer.json文件中的“files”中(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
会更好。 - XedinUnknownView::share()
与闭包一起来实现这个效果 - 我刚刚发了一篇文章介绍这个方法: http://www.develophp.org/2014/07/laravel-4-blade-helper-functions/
另外一个好处是,你不需要创建额外的类,并且保持全局命名空间的整洁。
app_path().'/library'
。 - Alexandre Butynskisitehelpers.php
。 - Alexandre Danault