Laravel自定义类添加别名

4
所以我希望能够为自定义类添加别名,以便在blade中使用它们:
<?php
namespace App\Classes;

class Requirement
{
    public static function Test()
    {
        return "hello";
    }
} 

config/app.php文件中,我添加了一个别名,如下所示:
...
'Requirement' => App\Classes\Requirement::class

那么,我希望能够像这样在 Blade 模板中调用它:

{{ Requirement::Test() }}

但是别名无法正常工作。我也尝试了composer dump-autoload,但它仍然无法正常工作。

顺便问一下:像这样添加自定义类是否是实现网站特定逻辑(例如从数据库检索和处理数据)的可行方法,还是有更好的方法?

编辑1

我在app/Facades中创建了Requirement.php,其中包含以下内容

<?php
namespace App\Facades;
use Illuminate\Support\Facades\Facade;

class Requirement extends Facade{
    protected static function getFacadeAccessor() { return 'Requirement'; }
}

app/Providers中添加了PageContentProvider.php,内容如下:

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class PageContentProvider extends ServiceProvider
{
    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->bind('Requirement', function($app){
            return new \App\Classes\Requirement();
        });
    }
}

config/app.php中,将别名设置为:
'Requirement'=>App\Facades\Requirement::class

以及提供者

App\Providers\PageContentProvider::class

但是它还没有起作用。

编辑 2

通过添加例如以下内容:

exit();

或者
echo "blabla";

register() 函数中,没有任何变化。这是否意味着 PageContentProvider 没有被加载?

编辑 3

由于标准的 AppServiceProvider 已经被加载,我删除了在 config/app.php 中对应的条目... 仍然可以正常工作! 不知何故我的更改没有得到应用。有人有解决办法吗?

6个回答

7

问题并不在代码中: 在意识到更改config/app.php没有生效之后,只需

php artisan config:clear

我所提出的问题,它完美地解决了每一个问题。


1
在你的composer文件中添加:

"autoload": {
    //...
    "files" : ["app/classes/Requirement.php"]
},

接下来,按照您在config/app.php中编写的方式添加别名。

然后,您就可以在模板中使用它:

{{ Requirement::test() }}

我按照你的建议做了,但还是不行 - 我另外执行了dump-autoload,但问题仍然存在:找不到'Requirement'类。 - VGD
还有别名吗?我在laravel 5.1上测试过,它可以工作。尝试在app目录中创建一个文件,将其命名为某个名称,在其中编写一个简单的方法:function helloWorld() {echo 'hello'}。将其添加到您的自动加载文件数组中,然后运行composer dump-autoload,随后无论何时调用helloWorld() - 都可以检查是否加载了文件本身是问题所在。 - Iamzozo
也尝试使用 app/Classes/Requirement.php,如果您正在运行Linux/Unix,则可能区分大小写。 - Iamzozo
@lamzozo 如果不清楚的话:调用helloWorld()函数是可以的,但是不能调用类。 - VGD

0

既然您提到需要在Blade中使用类:

您可以在Blade文件的顶部使用Blade的@inject函数,而不是设置别名。

@inject('your_class','App\Helpers\SomeNamespace\Yourclass')

然后在 Blade 模板中:

{{$your_class->doSomething()}}

0
你要找的是“Façades”。
你可以创建一个 Façade 类,其中包含对服务容器中类绑定的引用,然后在“config/app.php”文件的“aliases”数组中使用它。
文档:http://laravel.com/docs/5.1/facades

我会试一下,谢谢你 - 但是普通类也应该可以工作吧?只是好奇... - VGD
小侧记:当我在Provider的register()函数中加上类似于exit()或echo "blabla"这样的东西时,什么也没有发生 - 看起来Provider没有被加载。 - VGD
@VGD 你还是错了。你不要将类添加到“aliases”数组中,而是将_门面_类的名称添加进去,在服务容器中含有对你的类的引用。 - Martin Bean
我可能太蠢了,或者我不明白你想说什么:我的门面类引用了我的门面,而这个门面类的名称就是Requirement,就像普通类一样。因此,在别名中我正在引用门面类。 - VGD
顺便问一下,当你写_app/config.php_时,实际上是指_config/app.php_对吗? - VGD

0

如果这个可行,请尝试:

在你的控制器中:

 $whateveryour_variable = Requirement::Test();
 return view('yourview',compact('whateveryour_variable'));

在你的视图中:

   {{$whateveryour_variable}}

你可以从数据库中获取数据,将其存储在变量中,然后将其传递到视图中。

我宁愿不这样做,因为我必须跟踪哪些数据应该随视图一起发送。 - VGD

0
你试过用斜杠吗?
{{ \Requirement::Test() }}

编辑:语法


我试过了,不起作用 - 对我来说也不是解决方案,因为我不想要任何前缀,只想要简单的<code>Requirement::Test()</code>。 - VGD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接