冲突的Laravel控制器 - 一个可以调用方法另一个给出非静态错误

时间:2017-06-21 04:21:15

标签: laravel-5.4

我接管了另一个开发人员的代码,我很困惑和困惑:一个控制器我可以完全调用类方法CLASSS::method。另一个Controller拥有原始代码的副本并进行了修改。在第二个,我得到“非静态方法”错误。

致电链: Controller->Class->filtered results->Controller response

1A)(工作)控制器

<?php

namespace App\Http\Controllers\V1;

use App\Site as SiteClass;
use Facades\App\Site;

use Illuminate\Support\Facades\Log;

use Illuminate\Http\Request;

use App\{
    Http\Controllers\Controller,
    Http\Requests\SiteRequest,
    Helper\ResourceTrait,
    Assets,
    Alerts,
    Licensee,
    Permits,
    LandOwner,
    Utility
};
use Illuminate\Support\Collection;

class SiteController extends Controller
{
    private $obj;

    public function __construct()
    {
        $this->obj = new SiteClass();
    }


    public function index(Request $request)
    {
        try
        {

            $data = Site::filter(
                ($request->has('sort')? $request->input('sort') : ''),
                ($request->has('filter')? $request->input('filter') : '')
                );

      ...removed some extra code that's not relevant ...

            return response($data);

        }
        catch(\Exception $e)
        {
        Log::info('Create exception from here?' . $e);
            return response(array('error'=>$e->getMessage()),422);
        }

    }  // index

    ....
}

1B)(工作)班级

<?php

namespace App;

use Illuminate\Support\Facades\Config;
use \App\BaseModel;

class Site extends BaseModel
{
    protected $table = 'sites';

    protected $fillable = [
      "status","structureType","siteId","name","coverage","address","postCode", "subdistrict", "district", "region", "state", "country", "localCouncil", "latitude", "longitude", "dimensions",
    "siteHandover", "startBilling", "utilityBillAcct", "utilityBillingAddress", "renewalTerm",
    "capex", "opex", "siteManager", "siteManagerPhone", "siteManagerEmail", "siteOwnerManager", "siteOwnerManagerPhone", "siteOwnerManagerEmail"
    ];

    ...
    // Working Static method call.
    public function filter($sort = null, $search = null)
    {
        $data = $this;

        // check if search variable not empty
        if ($search != null)
        {
            $data = $data->where(function ($query) use ($search){
                return $query->where($this->table.'.name','like','%'.$search.'%')
                    ->orWhere($this->table.'.status','=',$search)
                    ->orWhere($this->table.'.siteId','like','%'.$search.'%')
                    ->orWhere($this->table.'.address','like','%'.$search.'%')
                    ->orWhere($this->table.'.subdistrict','like','%'.$search.'%')
                    ->orWhere($this->table.'.district','like','%'.$search.'%')
                    ->orWhere($this->table.'.region','like','%'.$search.'%')
                    ->orWhere($this->table.'.state','like','%'.$search.'%')
                    ->orWhere($this->table.'.country','like','%'.$search.'%')
                    ->orWhere($this->table.'.localCouncil','like','%'.$search.'%')
                    ;
            });

             if ($sort != null)
                {
                $sorts = explode('|', $sort);

                $data = $data->orderBy($sorts[0],$sorts[1]);
                }

        }

        // check if sort variable not empty
        if ($sort != null)
        {
            $sorts = explode('|', $sort);

            $data = $data->orderBy($sorts[0],$sorts[1]);
        }
        else
        {
            $data = $data->orderBy('siteId','desc');
        }

        // return data
        return $data->paginate(Config::get('api.records'));
    }

}

2A)(失败)控制器

<?php

namespace App\Http\Controllers\V1;

use App\{
    Http\Controllers\Controller,
    Helper\ResourceTrait,
    Http\Requests\OrganisationRequest,
    Organisation
};


use Illuminate\{
    Http\Request,
    Support\Facades\Config,
        Support\Facades\Log
};

class OrganisationController extends Controller
{
    private $org;

    public function __construct()
    {
        $this->org = new Organisation();
    }


    public function index(Request $request)
    {
        try
        {
            //WORKAROUND: $this->org->... works
            $data = Organisation::filter(
                ($request->has('sort')? $request->input('sort') : ''),
                ($request->has('filter')? $request->input('filter') : '')
                );   // FAILS with non-static method call error

            return response($data);

        }
        catch(\Exception $e)
        {
            return response(array('error'=>$e->getMessage()),422);
        }

    }  // index
}        

...

2B)失败的课程

<?php
namespace App;

use Illuminate\Support\Facades\Config;

use \App\BaseModel;

class Organisation extends BaseModel
{

protected $table = 'organisation';

public function filter($sort = null, $search = null)
    {
        $data = $this;

        // check if search variable not empty
        if ($search != null)
        {
            $data = $data->where(function ($query) use ($search){
                return $query->where($this->table.'.name','like','%'.$search.'%')
                    ;
            });

             if ($sort != null)
                {
                $sorts = explode('|', $sort);

                $data = $data->orderBy($sorts[0],$sorts[1]);
                }

        }

        // check if sort variable not empty
        if ($sort != null)
        {
            $sorts = explode('|', $sort);

            $data = $data->orderBy($sorts[0],$sorts[1]);
        }
        else
        {
            $data = $data->orderBy('name');
        }

        // return data
        return $data->paginate(Config::get('api.records'));
    }

}

对于我的未经训练的眼睛,它们看起来相同,但是一个有效,另一个没有。提前为代码量道歉,但我不知道哪些部分会影响什么。我怀疑这与进口课程有些不同,但我坦率地说: - D

1 个答案:

答案 0 :(得分:1)

SiteFacadeOrganisation没有。

Facades(来自文档)为应用程序服务容器中可用的类提供了“静态”接口。