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