使用模式设计但仅在Laravel 7中的服务器中使用不兼容的存储库声明



我在本地环境和生产服务器中都有一个应用程序。此应用程序有一个名为ArticlesController的控制器,代码为:

<?php
namespace AppAdminControllers;
use AppCoreControllersCoreController;
use AppAdminRequestsArticlesRequest;
use AppAdminInterfacesArticlesRepositoryInterface;
class ArticlesController extends CoreController
{
/**
* @var ArticlesRepositoryInterface
*/
private $articleRepository;
public function __construct(ArticlesRepositoryInterface $articleRepository)
{
$this->articleRepository = $articleRepository;
}
/**
* Display a listing of the resource.
*
* @return IlluminateViewView
*/
public function index()
{
$articles = $this->articleRepository->all();
return view('admin.articles.index')->with(compact('articles'));
}
/**
* Show the form for creating a new resource.
*
* @return IlluminateViewView
*/
public function create()
{
return view('admin.articles.create');
}
/**
* Store a newly created resource in storage.
*
* @param AppAdminRequestsArticlesRequest $request
* @return IlluminateRoutingRedirector
*/
public function store(ArticlesRequest $request)
{
$data = $request->validated();
$article = $this->articleRepository->create($data);
return redirect()->route('articles.edit', $article)->with('successMessage', 'Article created! Now you can edit the article with new information');
}
/**
* Display the specified resource.
*
* @param int $id
* @return IlluminateHttpResponse
*/
public function show(int $id)
{
}
/**
* Show the form for editing the specified resource.
*
* @param  int  $id
* @return IlluminateHttpResponse
*/
public function edit($id)
{
$article = $this->articleRepository->find($id);
return view('admin.articles.edit')->with(compact('article'));
}
/**
* Update the specified resource in storage.
*
* @param AppAdminRequestsArticlesRequest $request
* @param int $id
* @return IlluminateRoutingRedirector
*/
public function update(ArticlesRequest $request, int $id)
{
$data = $request->validated();
$this->articleRepository->update($data, $id);
return redirect()->route('articles.index')->with('successMessage', 'Article updated!');
}
/**
* Remove the specified resource from storage.
*
* @param  int  $id
* @return IlluminateHttpResponse
*/
public function destroy($id)
{
$this->articleRepository->delete($id);
return redirect()->route('articles.index')->with('successMessage', 'Article deleted!');;
}
}

您可以看到,此控制器使用ArticlesPositionInterface。这是代码:

<?php
namespace AppAdminInterfaces;
use AppAdminModelsArticle;
use IlluminateDatabaseEloquentCollection;
interface ArticlesRepositoryInterface extends BaseRepositoryInterface
{
/**
* @return Collection
*/
public function all(): Collection;
/**
* @param array $data
* @return Article
*/
public function create(array $data): Article;
/**
* @param array $data
* @param int $id
* @return int
*/
public function update(array $data, int $id): int;
/**
* @param int $id
* @return int
*/
public function delete(int $id): int;
/**
* @param int $id
* @return Article
*/
public function find(int $id): ?Article;
}

另外,我有一个提供程序,我用它来实例化带有以下代码的存储库:

<?php
namespace AppProviders;
use IlluminateSupportServiceProvider;
use AppAdminInterfacesBaseRepositoryInterface;
use AppAdminInterfacesArticlesRepositoryInterface;
use AppAdminInterfacesFilesRepositoryInterface;
use AppAdminRepositoriesBaseRepository;
use AppAdminRepositoriesArticlesRepository;
use AppAdminRepositoriesFilesRepository;
class RepositoryServiceProvider extends ServiceProvider
{
/**
* Register services.
*
* @return void
*/
public function register()
{
$this->app->bind(BaseRepositoryInterface::class, BaseRepository::class);
$this->app->bind(ArticlesRepositoryInterface::class, ArticlesRepository::class);
$this->app->bind(FilesRepositoryInterface::class, FilesRepository::class);
}
/**
* Bootstrap services.
*
* @return void
*/
public function boot()
{
//
}
}

BaseRepository的代码如下:

<?php
namespace AppAdminRepositories;
use AppAdminInterfacesBaseRepositoryInterface;
use IlluminateDatabaseEloquentModel;
use IlluminateDatabaseEloquentCollection;
class BaseRepository implements BaseRepositoryInterface
{
/**
* @var Model
*/
protected $model;
/**
* @param Model $model
*/
public function __construct(Model $model)
{
$this->model = $model;
}
/**
* @return Collection
*/
public function all(): Collection
{
return $this->model->all();
}
/**
* @param array $data
* @return Model
*/
public function create(array $data): Model
{
return $this->model->create($data);
}
/**
* @param array $data
* @param int $id
* @return int
*/
public function update(array $data, int $id): int
{
return $this->model->where('id', $id)->update($data);
}
/**
* @param int $id
* @return int
*/
public function delete(int $id): int
{
return $this->model->destroy($id);
}
/**
* @param int $id
* @return Model
*/
public function find($id): ?Model
{
return $this->model->find($id);
}
}

最后,文章库的代码是:

<?php
namespace AppAdminRepositories;
use AppAdminInterfacesArticlesRepositoryInterface;
use AppAdminModelsArticle;
use IlluminateDatabaseEloquentCollection;
use AppAdminRepositoriesBaseRepository;
class ArticlesRepository extends BaseRepository implements ArticlesRepositoryInterface
{
/**
* @var Article
*/
protected $article;
/**
* @param Article $article
*/
public function __construct(Article $article)
{
$this->article = $article;
}
/**
* @return Collection
*/
public function all(): Collection
{
return $this->article->all();
}
/**
* @param array $data
* @return Article
*/
public function create(array $data): Article
{
return $this->article->create($data);
}
/**
* @param array $data
* @param int $id
* @return int
*/
public function update(array $data, int $id): int
{
return $this->article->where('id', $id)->update($data);
}
/**
* @param int $id
* @return int
*/
public function delete(int $id): int
{
return $this->article->destroy($id);
}
/**
* @param int $id
* @return Article
*/
public function find($id): ?Article
{
return $this->article->find($id);
}

}

它在我的本地环境中运行得很好,但很奇怪,因为在远程服务器中,使用完全相同的代码,它会抛出一个错误:

App\Admin\Repository\ArticlesRepository::create(array$data(:App\Admin\Models\Article必须与App\Admin\Srepositories\BaseRepository::create(array$data(:Illuminate\Database\Eloquent\Model 兼容

有什么想法吗?

所有函数声明都应该完全相同,包括返回类型声明:

文章库接口:

public function create(array $data): Article;

BaseRepository:

public function create(array $data): Model

文章库:

public function create(array $data): Article;

CCD_ 1和CCD_ 2不能同时使用。

也许这不会因为不同的PHP版本而在本地引发异常?

注意:您可能需要考虑从单个BaseRepository扩展所有存储库。

最新更新