【问题标题】:laravel custom classes add aliaslaravel 自定义类添加别名
【发布时间】:2015-09-07 09:28:43
【问题描述】:

所以我想为自定义类添加一个别名,以便能够在刀片中使用它们:

<?php
namespace App\Classes;

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

config/app.php 我添加了一个别名,如下所示:

...
'Requirement' => App\Classes\Requirement::class

然后,我希望能够在刀片模板中调用它,例如

{{ 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.phpAppServiceProvider 的对应条目...... 它仍然有效!不知何故我的更改没有得到应用。有人有解决办法吗?

【问题讨论】:

    标签: php class laravel alias


    【解决方案1】:

    问题根本不是代码: 在意识到 config/app.php 中的更改没有被应用后,一个简单的

    php artisan config:clear
    

    修复了我在问题中提出的每个问题。

    【讨论】:

      【解决方案2】:

      添加到您的作曲家文件中:

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

      然后按照您在 config/app.php 中所写的方式添加到您的别名

      然后你就可以在你的模板中使用了:

      {{ Requirement::test() }}
      

      【讨论】:

      • 我按照你的建议做了,但没有工作 - 我另外执行了 dump-autoload 但问题仍然存在:找不到类“需求”。
      • 也有别名?我用 laravel 5.1 进行了测试,它正在工作。尝试在 app 目录中创建一个文件,将其命名,然后在其中编写一个简单的方法: function helloWorld() {echo 'hello'} 。添加到您的自动加载文件数组,然后composer dump-autoload,在任何地方调用 helloWorld() - 检查它是否正在加载文件本身就是问题。
      • 也可以试试app/Classes/Requirement.php,如果你运行的是linux/unix,它可能区分大小写
      • @lamzozo 如果不清楚:调用 helloWorld() 有效,但不调用类
      【解决方案3】:

      如果可行,试试这个:

      在您的控制器中:

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

      在你看来:

         {{$whateveryour_variable}}
      

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

      【讨论】:

      • 我不希望这样做,因为我必须跟踪视图应该附带哪些数据
      【解决方案4】:

      你试过用斜线吗?

      {{ \Requirement::Test() }}
      

      编辑:语法

      【讨论】:

      • 我做了,但不工作 - 反正对我来说不是一个解决方案,因为我不想要任何前缀,只是简单的 Requirement::Test()
      【解决方案5】:

      您正在寻找的是外墙

      您创建一个 Façade 类,其中包含对服务容器中您的类的绑定的引用,这就是您在 config/app.php 文件中的 aliases 数组中使用的内容。 p>

      文档:http://laravel.com/docs/5.1/facades

      【讨论】:

      • 我会试试的,谢谢 - 但它不应该也适用于普通类吗?只是想知道......
      • 一点旁注:当我在提供者的 register() 中放入诸如 exit() 或 echo "blabla" 之类的东西时,什么也没有发生 - 看起来提供者没有被加载。
      • @VGD 你还是做错了。您无需将类添加到 aliases 数组中,而是添加 façade 类的名称,其中包含对服务容器中您的类的引用。
      • 要么我很笨,要么我不明白你想说什么:我的门面类引用我的门面称为Requirement,就像正常的一样班级。所以我 am 引用了别名中的外观类。
      • 顺便说一句,当你写 app/config.php 你实际上是指 config/app.php 对吗?
      【解决方案6】:

      既然你提到你需要一个 Blade 中的类:

      您可以使用刀片文件顶部的刀片@inject 函数来代替设置别名。

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

      然后在刀片模板中:

      {{$your_class->doSomething()}}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-11
        • 1970-01-01
        • 2015-10-29
        • 2013-07-20
        • 1970-01-01
        • 2016-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多