在几个控制器中调用相同的雄辩语句

时间:2015-11-11 18:21:40

标签: laravel laravel-5 eloquent

我有这样一个雄辩的声明:

$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();

1 个答案:

答案 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();

只是旁注,我还没有对此代码进行测试,因此如果您只是复制并粘贴它,则可能会发现一些错误。