控制器之间的共享方法Laravel 5.2

use*_*668 5 php laravel laravel-5

在几个控制器中,我必须使用相同的方法将结果显示为具有列排序功能的表:

 public function showSearchResults(Request $req){

        $query=Service::where('title', $req->search);

        // Columns sorting 
        if ($req->has('order')){
            $order= $req->order=='asc' ? 'asc' : 'desc';
            $order_inverse=$req->order=='asc' ? 'desc' : 'asc';
        } else {
            $order='desc';
            $order_inverse='asc';
        }

         ...


        $url=$req->url().'?'.http_build_query($req->except('sortby','order','page'));
        $results=$query->with('type')->paginate(15)->appends($req->all());


        return View::make('services.search_results')
                    ->with('results', $results)
                    ->with('url',$url)
                    ->with('sortby', $sortby)
                    ->with('order', $order)
                    ->with('order_inverse', $order_inverse);

    }
Run Code Online (Sandbox Code Playgroud)

在这种情况下避免DRY的最佳方法是什么?

hei*_*ian 13

具有特征的控制器之间的共享方法

第1步:创建特征

<?php // Code in app/Traits/MyTrait.php

namespace App\Traits;

trait MyTrait
{
    protected function showSearchResults(Request $request)
    {
        // Stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

第2步: use控制器中的特征:

<?php // Code in app/Http/Controllers/MyController.php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Traits\MyTrait; // <-- you'll need this line...

class MyController extends Controller
{
    use MyTrait; // <-- ...and also this line.

    public function getIndex(Request $request)
    {
        // Now you can call your function with $this context
        $this->showSearchResults($request);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以use以相同的方式在任何其他控制器中使用Trait.

重要的是要注意您不需要includerequire任何地方的Trait文件,PSR-4自动加载负责文件包含.

您也可以像其他人提到的那样使用自定义帮助程序类,但如果您只打算在控制器之间共享代码,我建议不要使用它. 您可以在此处查看如何创建自定义帮助程序类.