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

时间:2016-04-25 13:37:27

标签: 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);

    }

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

4 个答案:

答案 0 :(得分:13)

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

第1步:创建特征

shinyUI(
navbarPage("navbar",
tabPanel(strong("Buscador"),value="panel2",
tags$head(tags$style(HTML(".multicol{font-size:12px;
height:auto;
-webkit-column-count: 2;
-moz-column-count: 2;
column-count: 2;
}"))),
fluidRow(column(4,
                   strong(p("Indexada en")),
                   tags$div(align = "left", 
                            class = "multicol",
                   checkboxGroupInput("index",
                                      label=NULL,
                                      choices = list("PubMed©" = 3,
                                                     "Embase©" = 4,
                                                     "CINAHL©" = 5,
                                                     "Cuiden©" = 6,
                                                     "Scopus©" = 7,
                                                     "BVS-Lilacs©" = 8))
                   )))))

步骤2: <?php // Code in app/Traits/MyTrait.php namespace App\Traits; trait MyTrait { protected function showSearchResults(Request $request) { // Stuff } } 控制器中的特征:

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); } } 您的Trait。

请务必注意,您无需在任何地方useinclude使用特征文件,PSR-4 Autoloading负责处理文件。

您也可以像其他人提到的那样使用自定义帮助程序类,但如果您只打算在控制器之间共享代码,我建议不要使用它。 You can see how to create custom helper classes here

答案 1 :(得分:2)

您可以使用特征(如建议使用ventaquil),也可以创建自定义helpers文件并在其中添加帮助。

之后,您将能够像任何其他类Laravel helper一样使用任何类(控制器,模型,自定义类,命令等)中的助手。

答案 2 :(得分:0)

使用特征?更多信息请访问:http://php.net/manual/en/language.oop5.traits.php

答案 3 :(得分:0)

您可以在app目录中创建帮助文件。例如。 MethodHelper.php

在此文件中,您可以在任何地方提及所需的方法。 例如,

<?php namespace App;
class MethodHelper
{
 public static function reusableMethod()
    {
        //logic
    }
}

您可以在任何地方使用此方法,方法是使用命名空间并调用方法。 在上面例如。 命名空间将是:     

方法调用函数如下所示:

MethodHelper::reusableMethod();

您也可以根据功能要求发送参数。 在你的例子中。你可能有

public function showSearchResults(Request $req){
//
}

而不是reusableMethod()。 你的电话将是:

MethodHelper::showSearchResults($req);