Step 1: 创建Helpers(或其他自定义类)文件并为其指定匹配的命名空间 . 写你的 class 和方法:
<?php // Code within app\Helpers\Helper.php
namespace App\Helpers;
class Helper
{
public static function shout(string $string)
{
return strtoupper($string);
}
}
<!-- Code within resources/views/template.blade.php -->
{!! Helper::shout('this is how to use autoloading correctly!!') !!}
Extra Credit: 在Laravel应用中的任何位置使用此类:
<?php // Code within app/Http/Controllers/SomeController.php
namespace App\Http\Controllers;
use Helper;
class SomeController extends Controller
{
public function __construct()
{
Helper::shout('now i\'m using my helper class in a controller!!');
}
...
<?php // code in app/Providers/AppServiceProvider.php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Blade; // <-- This is important! Without it you'll get an exception.
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
// Make a custom blade directive:
Blade::directive('shout', function ($string) {
return trim(strtoupper($string), '(\'\')');
});
// And another one for good measure:
Blade::directive('customLink', function () {
return '<a href="#">Custom Link</a>';
});
}
...
Step 2: 使用您的自定义Blade指令:
<!-- // code in resources/views/view.blade.php -->
@shout('this is my custom blade directive!!')
@customLink
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class HelperServiceProvider extends ServiceProvider
{
protected $helpers = [
// Add your helpers in here
];
/**
* Bootstrap the application services.
*/
public function boot()
{
//
}
/**
* Register the application services.
*/
public function register()
{
foreach ($this->helpers as $helper) {
$helper_path = app_path().'/Helpers/'.$helper.'.php';
if (\File::isFile($helper_path)) {
require_once $helper_path;
}
}
}
}
===========================
Finished
===========================
Add these lines to config/app.php:
----------------------------------
Providers: App\MyApp\Providers\HelperServiceProvider,
Alias: 'Helper' => 'App\MyApp\Facades\HelperFacade',
所以更新'config / app.php'中的Providers和Alias列表
运行 composer -o dumpautoload
“./app/MyApp/Facades/Helper.php”最初看起来像这样:
<?php
namespace App\MyApp\Facades;
class Helper
{
//
}
现在只需在“./app/MyApp/Facades/Helper.php”中添加方法即可 .
添加帮助函数后,这就是“./app/MyApp/Facades/Helper.php”的样子 .
<?php
namespace App\MyApp\Facades;
use Request;
class Helper
{
public function isActive($pattern = null, $include_class = false)
{
return ((Request::is($pattern)) ? (($include_class) ? 'class="active"' : 'active' ) : '');
}
}
This is how it would be called:
===============================
{!! Helper::isActive('help', true) !!}
use App\Helpers\StatusHelper;
class ExampleController extends Controller
{
public function index()
{
$statusList = StatusHelper::getStatusesList();
return view('example.index', compact('statusList'));
}
}
<?php
namespace App\Helpers;
class MyFuncs {
public static function full_name($first_name,$last_name) {
return $first_name . ', '. $last_name;
}
}
命名空间App \ Helpers;在App命名空间下定义Helpers名称空间 . class MyFuncs 定义了助手类MyFuncs . public static function full_name($ first_name,$ last_name)定义一个静态函数,它接受两个字符串参数并返回一个连接字符串
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class HelperServiceProvider extends ServiceProvider {
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
//
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{
foreach (glob(app_path().'/Helpers/*.php') as $filename){
require_once($filename);
}
}
}
这里,
namespace App\Providers; defines the namespace provider
use Illuminate\Support\ServiceProvider; imports the ServiceProvider class namespace
class HelperServiceProvider extends ServiceProvider {…} defines a class HelperServiceProvider that extends the ServiceProvider class
public function boot(){…} bootstraps the application service
public function register(){…} is the function that loads the helpers
foreach (glob(app_path().'/Helpers/*.php') as $filename){…} loops through all the files in /app/Helpers directory and loads them.
我们现在需要注册HelperServiceProvider并为我们的帮助器创建别名 .
打开 /config/app.php 文件
找到providers数组变量
添加以下行
App\Providers\HelperServiceProvider::class,
找到别名数组变量
添加以下行
'MyFuncs' => App\Helpers\MyFuncs::class,
保存更改使用我们的自定义帮助程序
我们将创建一个路由,调用我们的自定义帮助函数Open /app/routes.php
添加以下路由定义
Route::get('/func', function () {
return MyFuncs::full_name("John","Doe");
});
这里,
return MyFuncs::full_name("John","Doe"); calls the static function full_name in MyFuncs class
20 回答
52 Laravel 5中的自定义类,简单方法
此答案适用于Laravel中的常规自定义类 . 有关特定于Blade的答案,请参阅Custom Blade Directives in Laravel 5 .
Step 1: 创建Helpers(或其他自定义类)文件并为其指定匹配的命名空间 . 写你的 class 和方法:
Step 2: 创建别名:
Step 3: 在刀片模板中使用它:
Extra Credit: 在Laravel应用中的任何位置使用此类:
资料来源:http://www.php-fig.org/psr/psr-4/
为什么会这样:https://github.com/laravel/framework/blob/master/src/Illuminate/Support/ClassLoader.php
自动加载源自:http://php.net/manual/en/language.oop5.autoload.php
在laravel 5.3及更高版本中,laravel团队将所有程序文件(
routes.php
)移出app/
目录,整个app/
文件夹自动加载psr-4
. 接受的答案适用于这种情况,但对我来说感觉不对 .所以我做的是在项目的根目录下创建了一个
helpers/
目录并将帮助文件放在其中,在我的composer.json
文件中我做了这个:这样我的
app/
目录仍然是一个psr-4自动加载的目录,并且帮助器组织得更好一些 .希望这有助于某人 .
由于OP要求最佳实践,我认为我们仍然缺少一些好的建议 .
单个helpers.php文件远非一个好习惯 . 首先是因为你混合了很多不同类型的函数,所以你反对良好的编码原则 . 此外,这不仅会损害代码文档,还会损害Cyclomatic Complexity,Maintainability Index和Halstead Volume等代码指标 . 你拥有的功能越多,它就越糟糕 .
代码文档可以使用像phpDocumentor这样的工具,但使用Sami它won't render procedural files . Laravel API文档就是这种情况 - 没有辅助函数文档:https://laravel.com/api/5.4
可以使用PhpMetrics等工具分析代码指标 . 使用PhpMetrics版本1.x来分析Laravel 5.4框架代码将为src/Illuminate/Foundation/helpers.php和src/Illuminate/Support/helpers.php文件提供非常糟糕的CC / MI / HV指标 .
多个上下文辅助文件(例如string_helpers.php,array_helpers.php等)肯定会改善那些不良指标,从而使代码更容易保留 . 根据使用的代码文档生成器,这将是足够好的 .
通过使用带有静态方法的辅助类可以进一步改进它,因此可以使用命名空间对它们进行上下文化 . 就像Laravel已经使用Illuminate\Support\Str和Illuminate\Support\Arr类一样 . 这改进了代码指标/组织和文档 . 类别名可用于使它们更易于使用 .
使用类构建可以使代码组织和文档更好,但另一方面,我们最终会失去那些简短易记的全局函数 . 我们可以通过为这些静态类方法创建函数别名来进一步改进该方法 . 这可以手动或动态完成 .
Laravel在内部使用第一种方法,在程序辅助文件中声明映射到静态类方法的函数 . 这可能不是理想的事情,因为你需要重新声明所有的东西(docblocks / arguments) .
我个人使用动态方法和
HelperServiceProvider
类在执行时创建这些函数:可以说这是过度工程,但我不这么认为 . 它工作得很好,与预期的相反,至少在使用PHP 7.x时它不会花费相关的执行时间 .
这是
JeffreyWay
在Laracasts Discussion中的建议 .在
app/Http
目录中,创建helpers.php
文件并添加功能 .在
composer.json
内,在autoload
块中,添加"files": ["app/Http/helpers.php"]
.运行
composer dump-autoload
.L2 Laravel 5中的自定义刀片指令
是的,有另一种方法可以做到这一点!
Step 1: 注册自定义Blade指令:
Step 2: 使用您的自定义Blade指令:
Outputs:
这是我的定制刀片指令!!
Custom Link
资料来源:https://laravel.com/docs/5.1/blade#extending-blade
补充阅读:https://mattstauffer.co/blog/custom-conditionals-with-laravels-blade-directives
如果您想学习如何最好地制作可在任何地方使用的自定义类,请参阅Custom Classes in Laravel 5, the Easy Way
这是我的HelpersProvider.php文件:
您应该在
app
文件夹下创建一个名为Helpers
的文件夹,然后在里面创建名为whatever.php
的文件,并在$ helpers数组中添加字符串whatever
.完成!
编辑
我不再使用此选项,我目前正在使用composer来加载像helper这样的静态文件 .
您可以直接在以下位置添加帮助:
您可以在别名下添加到
config/app.php
文件,而不是包含自定义帮助程序类 .应该是这样的 .
然后到你的控制器,包括Helper使用方法'使用Helper',因此您只需调用Helper类中的某些方法即可 .
或者在资源视图中,您可以直接调用Helper类 .
但这仍然是开发人员编码风格的方法 . 我们可能有不同的解决问题的方法,我只想分享我对初学者的看法 .
这里有一些很好的答案,但我认为这是最简单的 . 在Laravel 5.4(以及早期版本的早期版本)中,您可以在方便的地方创建一个类,例如App / Libraries / Helper.php
然后,您只需在您的Blade模板中调用它,如下所示:
如果你不想使用@inject,那么只需将'uppercasePara'函数设置为static并将调用嵌入到Blade模板中,如下所示:
不需要别名 . Laravel自动解决具体类 .
在dir bootstrap \ autoload.php中
添加此文件
我最初的想法是作曲家自动加载,但它对我来说并没有感觉非常Laravel 5ish . L5大量使用服务提供商,它们是引导你的应用程序的东西 .
首先,我在
app
目录中创建了一个名为Helpers
的文件夹 . 然后在Helpers
文件夹中我添加了我想要添加的函数的文件 . 拥有一个包含多个文件的文件夹可以让我们避免使用太长且无法管理的大文件 .接下来,我通过运行artisan命令创建了一个
HelperServiceProvider.php
:在
register
方法中,我添加了这个片段最后在providers数组中的
config/app.php
中注册服务提供者现在
Helpers
目录中的任何文件都已加载,可以使用了 .UPDATE 2016-02-22
这里有很多不错的选择,但是如果我的回答对你有用,我就会继续做这个包括帮助者的方案 . 您可以使用该软件包获取灵感,也可以随意使用Composer下载它 . 它有一些我经常使用的内置帮助程序(但默认情况下都是非活动状态),并允许您使用简单的Artisan生成器创建自己的自定义帮助程序 . 它还解决了一个响应者使用映射器的建议,并允许您显式定义要加载的自定义帮助程序,或者默认情况下,自动加载帮助程序目录中的所有PHP文件 . 反馈和PR非常感谢!
Github:browner12/helpers
通过对SO和Google的各种答案进行筛选,我仍然找不到最佳方法 . 大多数答案都建议我们离开应用程序并依靠第三方工具Composer来完成这项工作,但我不相信只是为了包含文件而工具的耦合是明智的 .
Andrew Brown's answer最接近我认为应该接近的方式,但是(至少在5.1中),服务提供商步骤是不必要的 . Heisian's answer突出了
PSR-4
的使用,这让我们更近了一步 . 这是我在视图中帮助器的最终实现:首先,使用命名空间在apps目录中的任意位置创建一个帮助文件:
接下来,在
aliases
数组中的config\app.php
中为您的类添加别名:这应该就是你需要做的一切 .
PSR-4
并且别名应该将助手公开给您的视图,因此在您的视图中,如果键入:它应该输出:
这是我创建的一个bash shell脚本,可以非常快速地创建Laravel 5外观 .
在Laravel 5安装目录中运行它 .
这样称呼它:
例:
如果运行该示例,它将在'your_laravel_installation_dir/app/MyApp'下创建目录
Facades
和Providers
.它将创建以下3个文件,并将它们输出到屏幕:
完成后,它将显示类似于以下内容的消息:
所以更新'config / app.php'中的Providers和Alias列表
运行
composer -o dumpautoload
“./app/MyApp/Facades/Helper.php”最初看起来像这样:
现在只需在“./app/MyApp/Facades/Helper.php”中添加方法即可 .
添加帮助函数后,这就是“./app/MyApp/Facades/Helper.php”的样子 .
此函数需要一个模式,并且可以接受可选的第二个布尔参数 .
如果当前URL与传递给它的模式匹配,它将输出'active'(或'class =“active”',如果你添加'true'作为函数调用的第二个参数) .
我用它来突出显示活动的菜单 .
以下是我的脚本的源代码 . 我希望你觉得它很有用,如果你有任何问题请告诉我 .
首先在App \ Http目录中创建helpers.php . 然后在composer.json中添加以下代码
接下来运行以下命令
现在,您可以在helpers.php文件中定义自定义函数 .
在app文件夹中创建一个
helpers.php
文件,然后使用composer加载它:将其添加到
composer.json
文件后,运行以下命令:如果您不喜欢将
helpers.php
文件保留在您的文件中app
目录(因为它不是PSR-4命名空间类文件),您可以执行laravel.com
网站的操作:存储helpers.php
in the bootstrap directory . 请记住在composer.json
文件中设置它:**
**创造新的帮手
用于控制器和任何视图文件
编写自定义助手的最佳实践是
1)在项目根目录的
app
目录中,创建一个名为Helpers的文件夹(仅用于分隔和构造代码) .2)在文件夹内写入psr-4文件或普通的php文件
如果PHP文件的格式为psr-4,那么它将自动加载,否则在项目根目录下的composer.json中添加以下行
在
autoload
键内,创建一个名为files
的新键,以便在自动加载时加载文件,在files
对象中添加从app目录开始的路径 . 这是一个示例 .PS:如果文件没有加载,请尝试运行
composer dump-autoload
.对于我的Laravel项目中的自定义帮助程序库,我在
Laravel/App
目录中创建了一个名为Libraries
的文件夹,在Libraries目录中,我为不同的帮助程序库创建了各种文件 .创建我的帮助文件后,我只需在我的 composer.json 文件中包含所有这些文件
并执行
Create custom helpers’ directory: 首先在app目录中创建Helpers目录 . Create hlper class definition: 现在让我们创建一个简单的辅助函数,它将连接两个字符串 . 在/app/Helpers/MyFuncs.php中创建一个新文件MyFuncs.php添加以下代码
命名空间App \ Helpers;在App命名空间下定义Helpers名称空间 . class MyFuncs 定义了助手类MyFuncs . public static function full_name($ first_name,$ last_name)定义一个静态函数,它接受两个字符串参数并返回一个连接字符串
助手服务提供课程
服务提供程序用于自动加载类 . 我们需要定义一个服务提供程序,它将在/ app / Helpers目录中加载所有帮助程序类 .
运行以下artisan命令:
php artisan make:provider HelperServiceProvider
该文件将在
/app/Providers/HelperServiceProvider.php
中创建添加以下代码:
这里,
我们现在需要注册HelperServiceProvider并为我们的帮助器创建别名 .
打开
/config/app.php
文件找到providers数组变量
添加以下行
找到别名数组变量
添加以下行
保存更改使用我们的自定义帮助程序
我们将创建一个路由,调用我们的自定义帮助函数Open /app/routes.php
添加以下路由定义
这里,
我使用的另一种方法是:1)在app \ FolderName \ fileName.php中创建一个文件,并在其中包含此代码,即
2)在我们的刀片之后
而已 . 它的工作原理
在app / Helper / Helpers.php中创建Helpers.php
添加作曲家和作曲家更新
use in Controller
use in view 在config-> app.php文件中更改
call in view