使用Blade返回的辅助方法'无法重新声明Class'错误

时间:2016-12-12 23:19:01

标签: php laravel oop ioc-container

我正在尝试从我的刀片视图中调用App\Http\Timeslot::isOpen(),但我不明白如何在不将isOpen()声明为静态的情况下调用此方法。我无法将其声明为静态,因为我需要在构造中使用$ this->小时。如果我没有声明它,静态laravel返回Cannot redclare Class error

有人可以建议我应该如何写这个,这样我仍然可以访问$ this->小时变量吗?

刀片模板:

@if(App\Http\Timeslot::isOpen())
    We're open
@else
    We're closed
@endif

时段类

<?php namespace App\Http;

use App\OpeningHour;
use Carbon\Carbon;

class Timeslot
{
    protected $hours;

    public function __construct()
    {
        $this->hours = OpeningHour::all();
    }

    public static function isOpen()
    {
        // get current date
        Carbon::now()->format('w');
        $open_window =  $this->hours->get(Carbon::now()->format('w'));

        // is it over current days' opening hours?
        if(Carbon::now()->toTimeString() > $open_window->opening_time)
            return true;
        else
            return false;
    }
}

1 个答案:

答案 0 :(得分:0)

您也可以将$ hours声明为静态,并调用isOpen()中的方法来检索/缓存它们。

类似的东西:

<?php namespace App\Http;

use App\OpeningHour;
use Carbon\Carbon;

class Timeslot
{
     static protected $hours = null;

     public static function getOpeningHours()
     {
         if (self::$hours == null) {
            self::$hours = OpeningHour::all();
         }
     }

     public static function isOpen()
     {
         self::getOpeningHours();

        // get current date
        Carbon::now()->format('w');
        $open_window = self::$hours->get(Carbon::now()->format('w'));

        // is it over current days' opening hours?
        if (Carbon::now()->toTimeString() > $open_window->opening_time)
            return true;
        else
            return false;
     }
 }

像这样,您不必使用构造函数。

另一种方法(可能更多'Laravelish'方式)是将您的班级迁移到服务提供者: https://laravel.com/docs/5.3/providers

寻找“查看作曲家”,它们是将数据注入视图的方法。