我有这样一个雄辩的声明:
$constraint = function ($query) {
$query->where('session', Session::getId());
};
$selectedImages = ImageSession::with(['folder' => $constraint])
->whereHas('folder', $constraint)
->where('type', 'single')
->get();
我需要在几个控制器中调用。
如果不每次都使用此代码,最好的方法是什么?
我应该将此代码放入模型中吗?但是如果它与ImageSession类在同一个模型中,我如何放置ImageSession ::?
在控制器中,我必须写...
$imageSession_table = new ImageSession;
$selectedImages = $imageSession_table->getSelectedImages();
答案 0 :(得分:1)
有几种解决方案,但我学到的一条规则是,无论何时在同一文件中进行复制粘贴,都意味着您需要创建一个函数来封装该代码。
同样适用于在类/控制器上复制和粘贴相同代码时,这意味着您需要创建一个具有方法的类,该类将封装该代码。
现在你可以改变你的模型,这取决于你的应用程序和你有多少抽象级别。 有些人倾向于让模型尽可能纯净,然后使用变形金刚,存储库,类,无论你想要什么。所以沟通的流程是这样的: 型号 - > (变形金刚,存储库,类) - >控制器或其他类
如果是这种情况,只需创建一个ImageSessionRepository
并在那里有你的方法来获取所选图像:
<?php namespace Your\Namespace;
use ImageSession;
use Session;
class ImageSessionRepository
{
protected $imageSession;
public function __construct(ImageSession $imageSession)
{
$this->imageSession = $imageSession;
}
public function getSelectedImages($sessionId = false){
if(!$sessionId){
$sessionId = Session::getId()
}
$constraint = function ($query) use ($sessionId){
$query->where('session', $sessionId);
};
$selectedImages = ImageSession::with(['folder' => $constraint])
->whereHas('folder', $constraint)
->where('type', 'single')
->get();
return $selectedImages;
}
}
然后在你的控制器上你注入它:
<?php namespace APP\Http\Controllers;
use Your\Namespace\ImageSessionRepository;
class YourController extends Controller
{
/**
* @var ImageSessionRepository
*/
protected $imageSessionRepository;
public function __construct(ImageSessionRepository $imageSessionRepository)
{
$this->imageSessionRepository = $imageSessionRepository;
}
public function getImages()
{
$selectedImages = $this->imageSessionRepository->getSelectedImages();
//or if you want to pass a Session id
$selectedImages = $this->imageSessionRepository->getSelectedImages($sessionID = 1234);
//return the selected images as json
return response()->json($selectedImages);
}
}
另一种选择是使用范围more info here将代码直接添加到模型中
因此,在ImageSession
模型上添加此功能:
public function scopeSessionFolder($query, $session)
{
$constraint = function ($constraintQuery) use ($sessionId){
$query->where('session', $sessionId);
};
return $query->with(['folder' => $constraint])
->whereHas('folder', $constraint);
}
在您的控制器上执行此操作:
$selectedImages = ImageSession::sessionFolder(Session::getId())
->where('type', 'single')
->get();
或者,如果您的情况是
,则可以在您的范围内包含所有内容public function scopeSessionFolder($query, $session)
{
$constraint = function ($constraintQuery) use ($sessionId){
$query->where('session', $sessionId);
};
return $query->with(['folder' => $constraint])
->whereHas('folder', $constraint);
->where('type', 'single');
}
然后又在你的控制器上你会有这样的事情:
$selectedImages = ImageSession::sessionFolder(Session::getId())
->get();
只是旁注,我还没有对此代码进行测试,因此如果您只是复制并粘贴它,则可能会发现一些错误。