在使用laravel框架时,如何在视图中调用base_controller中定义的函数。例如:
class Base_Controller extends Controller {
public static function format_something()
{
return something;
}
}
如何在视图文件中调用format_something()?
通常我得到的错误看起来像这样: 方法[link_to_action]未在View类上定义。
可能是一个愚蠢的问题,但提前谢谢!
修改
好!首先,做这样的事情的正确位置是在libraries文件夹中。 第二,问题是你的班级不能有下划线。
因此,在应用程序/库中,我使用类
创建了AppHelper.php文件class AppHelper {
public static function format_something()
{
return something;
}
}
可以称之为:
$formated = AppHelper::format_something;
感谢您的帮助和良好的论坛找到Boofus McGoofus。
答案 0 :(得分:21)
对我而言:
创建目录“helpers”或其他文件:
// app/helpers/AppHelper.php
class AppHelper {
public static function format_something()
{
return something;
}
}
添加composer.json的路径
// composer.json
"autoload": {
"classmap": [
"app/helpers" // <-------- add this line
]
},
运行:(重新加载自动加载)
composer dump-autoload
现在你可以致电:
$formated = AppHelper::format_something();
答案 1 :(得分:10)
这个答案是为Laravel 3写的。对于Laravel 4及之后,LajdákMarek使用Composer自动加载器的答案更好。
format_something()
等函数不属于控制器。控制器应该只是从各种来源收集数据并将其传递给视图。它的工作主要是路由。
我在应用程序文件夹中为所有小helpery函数创建了一个名为“helpers”的文件夹。为了确保我的所有控制器,视图和模型都可以访问它们,我在start.php
文件中包含以下内容:
foreach(glob(path('app').'helpers/*.php') as $filename) {
include $filename;
}
我怀疑有更好的方法,但到目前为止,它对我有用。
答案 2 :(得分:2)
你可以从Laravel framework itself激励自己。
我将以格式化程序为例,并在Laravel Framework中引用jsonb_array_elements()
帮助程序。
首先创建自己的url
文件:
helpers.php
add it到<?php
if (! function_exists('format_that')) {
/**
* Generate something
*
* @param string $text
* @return string
*/
function format_that($text)
{
return app('formatter')->format_that($text);
}
}
文件:
composer.json
运行此命令以重新创建自动加载php文件:
"autoload": {
"files": [
"app/helpers/helpers.php"
]
}
创建service provider $ composer dumpautoload
:
app/Providers/FormatterServiceProvider.php
Register您的服务提供商。 Laravel框架调用<?php
namespace Illuminate\Routing;
use Illuminate\Support\ServiceProvider;
use App\Helpers\FormatGenerator;
class FormatterServiceProvider extends ServiceProvider
{
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
$this->app['formatter'] = $this->app->share(function ($app) {
return new FormatGenerator($app['request']);
});
}
}
方法,但您只需将其添加到您的应用配置文件register
:
config/app.php
最后,创建您的actual generator class 'providers' => [
/*
* Application Service Providers...
*/
App\Providers\AppServiceProvider::class,
// other providers...
App\Providers\FormatterServiceProvider::class,
]
app/Helpers/FormatGenerator.php
您可以选择创建a Facade <?php
namespace App\Helpers;
use Illuminate\Http\Request;
class FormatGenerator
{
protected $request;
/**
* Create a new URL Generator instance.
*
* @param \Illuminate\Routing\RouteCollection $routes
* @param \Illuminate\Http\Request $request
* @return void
*/
public function __construct(Request $request)
{
$this->request = $request;
}
public function format_that($text){
if ($request->path() == "home"){
return mb_strtoupper($text);
}
else{
return $text;
}
}
}
,以便能够app/Facade/Formatter.php
:
Formatter::format_that($text)
你可以问问自己:
<?php
namespace App\Facades;
use Illuminate\Support\Facades\Facade;
/**
* @see \App\Helpers\FormatGenerator
*/
class Formatter extends Facade
{
protected static function getFacadeAccessor() { return 'formatter'; }
}
而不是Formatter::format_that($text)
,即可在其他地方重复使用该组件。糖语法真的。app('formatter')->format_that($text)
或想要构建一个复杂的对象,服务提供商将为您处理这个问题并使其在Request
对象中可用。