laravelphp:Request';s和$this->;在静态函数中

laravelphp:Request';s和$this->;在静态函数中,php,laravel,Php,Laravel,我已经创建了一个名为ProductController的控制器。在该控制器中,我添加了分页,但在其他每个控制器中重复相同的代码。这是一个禁忌。我不知道如何将下面的代码移动到它自己的静态助手函数,主要是因为Request对象和$this->validate函数。我是一个老的程序程序员,我仍然对Laravel耿耿于怀。如有任何建议,将不胜感激 class ProductController extends Controller { /** * Display a listing

我已经创建了一个名为ProductController的控制器。在该控制器中,我添加了分页,但在其他每个控制器中重复相同的代码。这是一个禁忌。我不知道如何将下面的代码移动到它自己的静态助手函数,主要是因为Request对象和$this->validate函数。我是一个老的程序程序员,我仍然对Laravel耿耿于怀。如有任何建议,将不胜感激

class ProductController extends Controller 
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index(Request $request)
     {

        // Pagination. Grab sort_by, direction and page size.  If empty assign defaults
        $sort_by = (empty($request->input('sort_by'))) ? 'id' : $request->input('sort_by');
        $direction = (empty($request->input('direction'))) ? 'asc' : $request->input('direction');
        $page_size = (empty($request->input('page_size'))) ? '10' : $request->input('page_size');

        // Validate pagination input from URL
        $this->validate($request, [
            'sort_by' => 'alpha_dash',
            'direction' => 'alpha_dash',
            'page_size' => 'integer'
        ]);
        // Keeps page size less than a 1000 records being pulled
        if ($page_size > 1000) $page_size = 1000;

        $records = Product::with('manufacturer')->with('source')->where('active', 1)->orderBy($sort_by, $direction)->paginate($page_size);
        $record_count = Product::where('active', 1)->count();

        return view('pages.products.index', compact('records','sort_by','direction','page_size','record_count'));
     }

您可以创建一个包含重复代码的基本控制器,并在其他控制器中扩展该基本控制器

namespace App\Http\Controllers;

class myController extends Controller {

    public function paginate(Request $request){

        // Pagination. Grab sort_by, direction and page size.  If empty assign defaults
        $sort_by = (empty($request->input('sort_by'))) ? 'id' : $request->input('sort_by');
        $direction = (empty($request->input('direction'))) ? 'asc' : $request->input('direction');
        $page_size = (empty($request->input('page_size'))) ? '10' : $request->input('page_size');

         // Validate pagination input from URL
        $this->validate($request, [
            'sort_by' => 'alpha_dash',
            'direction' => 'alpha_dash',
            'page_size' => 'integer'
        ]);
        // Keeps page size less than a 1000 records being pulled
        if ($page_size > 1000) $page_size = 1000;
            $records = Product::with('manufacturer')->with('source')->where('active', 1)->orderBy($sort_by, $direction)->paginate($page_size);
            $record_count = Product::where('active', 1)->count();
            return view('pages.products.index', compact('records','sort_by','direction','page_size','record_count'));
        }
    }
}
您的控制器

namespace App\Http\Controllers;

class ProductController extends myController {
    public function index(Request $request){
        $this->paginate();
    }
}

您可以创建一个包含重复代码的基本控制器,并在其他控制器中扩展该基本控制器

namespace App\Http\Controllers;

class myController extends Controller {

    public function paginate(Request $request){

        // Pagination. Grab sort_by, direction and page size.  If empty assign defaults
        $sort_by = (empty($request->input('sort_by'))) ? 'id' : $request->input('sort_by');
        $direction = (empty($request->input('direction'))) ? 'asc' : $request->input('direction');
        $page_size = (empty($request->input('page_size'))) ? '10' : $request->input('page_size');

         // Validate pagination input from URL
        $this->validate($request, [
            'sort_by' => 'alpha_dash',
            'direction' => 'alpha_dash',
            'page_size' => 'integer'
        ]);
        // Keeps page size less than a 1000 records being pulled
        if ($page_size > 1000) $page_size = 1000;
            $records = Product::with('manufacturer')->with('source')->where('active', 1)->orderBy($sort_by, $direction)->paginate($page_size);
            $record_count = Product::where('active', 1)->count();
            return view('pages.products.index', compact('records','sort_by','direction','page_size','record_count'));
        }
    }
}
您的控制器

namespace App\Http\Controllers;

class ProductController extends myController {
    public function index(Request $request){
        $this->paginate();
    }
}
助手:

class Helper {
    public static function handlePagination($request, $validate, $rules = []) {
        // Pagination. Grab sort_by, direction and page size.  If empty assign defaults
        $sort_by = (empty($request->input('sort_by'))) ? 'id' : $request->input('sort_by');
        $direction = (empty($request->input('direction'))) ? 'asc' : $request->input('direction');
        $page_size = (empty($request->input('page_size'))) ? '10' : $request->input('page_size');

        // Validate pagination input from URL
        $validate($request, [
            'sort_by' => 'alpha_dash',
            'direction' => 'alpha_dash',
            'page_size' => 'integer'
        ]); // @TODO: append $rules to ruleset

        // Keeps page size less than a 1000 records being pulled
        if ($page_size > 1000) {
            $page_size = 1000;
        }

        return compact('sort_by', 'direction', 'page_size');
    }
}
控制员:

class ProductController extends Controller 
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index(Request $request)
    {
        list($sort_by, $direction, $page_size) = Helper.handlePagination($request, $this->validate);

        $records = Product::with('manufacturer')
            ->with('source')
            ->where('active', 1)
            ->orderBy($sort_by, $direction)
            ->paginate($page_size);
        $record_count = Product::where('active', 1)->count();

        return view('pages.products.index', compact('records','sort_by','direction','page_size','record_count'));
     }
}
助手:

class Helper {
    public static function handlePagination($request, $validate, $rules = []) {
        // Pagination. Grab sort_by, direction and page size.  If empty assign defaults
        $sort_by = (empty($request->input('sort_by'))) ? 'id' : $request->input('sort_by');
        $direction = (empty($request->input('direction'))) ? 'asc' : $request->input('direction');
        $page_size = (empty($request->input('page_size'))) ? '10' : $request->input('page_size');

        // Validate pagination input from URL
        $validate($request, [
            'sort_by' => 'alpha_dash',
            'direction' => 'alpha_dash',
            'page_size' => 'integer'
        ]); // @TODO: append $rules to ruleset

        // Keeps page size less than a 1000 records being pulled
        if ($page_size > 1000) {
            $page_size = 1000;
        }

        return compact('sort_by', 'direction', 'page_size');
    }
}
控制员:

class ProductController extends Controller 
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index(Request $request)
    {
        list($sort_by, $direction, $page_size) = Helper.handlePagination($request, $this->validate);

        $records = Product::with('manufacturer')
            ->with('source')
            ->where('active', 1)
            ->orderBy($sort_by, $direction)
            ->paginate($page_size);
        $record_count = Product::where('active', 1)->count();

        return view('pages.products.index', compact('records','sort_by','direction','page_size','record_count'));
     }
}

在每个函数中重复的代码部分是什么?需要在每个扩展控制器中的代码部分进入
Controller
类本身,以便它可用于所有扩展控制器。在我看来,您似乎不需要使任何代码成为公共的。。。??你能告诉我哪些代码对所有人来说都是通用的吗?我发现很难相信每个控制器都需要分页,所以我可能会创建一个名为
PagedController
的新类来扩展
controller
,并将功能放在其中。如果你在每个控制器中都需要它,那么我会按照@WEBjuju所说的去做。在每个函数中重复的代码部分是什么?每个扩展控制器中需要的代码部分都在
controller
类中,这样它就可以用于所有扩展控制器。在我看来,你并不是是否需要使任何代码成为通用的。。。??你能告诉我哪些代码对所有人来说都是通用的吗?我发现很难相信每个控制器都需要分页,所以我可能会创建一个名为
PagedController
的新类来扩展
controller
,并将功能放在其中。如果你在每个控制器中都需要它,那么我会按照@WEBjuju所说的去做。我对你的代码做了一些修改,它工作得非常完美。谢谢我使用了你的代码,稍加修改,它工作得非常完美。谢谢