在 Laravel 5.1 中执行 Action 前

8
我将在存储和更新方法中编写以下代码:

我正在存储和更新方法中编写以下代码:

$v = Validator::make($request->all(), [
    'field' => 'required|max:100|min:5'
]);

if ($v->fails()) {
    return redirect('route name')
                ->withErrors($v)
                ->withInput();
}

有没有内置的操作方法在执行任何操作方法之前执行?如果是,这对单个操作方法还是控制器有效?

1
您可以使用中间件... - Amarnasan
@Amarnasan:我检查了链接,但我认为没有关于在任何操作方法之前触发的常见事件。 - user5600983
你能给出一个具体的例子,说明你想要实现什么吗? - Rwd
什么是操作方法? - Ozan Kurt
2个回答

7
您可以使用中间件或覆盖callAction方法,https://laravel.com/api/5.6/Illuminate/Routing/Controller.html#method_callAction
use Illuminate\Routing\Controller;

class MyController extends Controller
{
    public function callAction($method, $parameters)
    {
        // code that runs before any action
        if (in_array($method, ['method1', 'method2'])) {
            // trigger validation
        }

        return parent::callAction($method, $parameters);
    }
}

2020年更新:

如果您发现自己在Laravel 5+中重复使用验证规则,我建议将它们添加到请求中:https://laravel.com/docs/6.x/validation#form-request-validation

/**
 * Store the incoming blog post.
 *
 * @param  StoreBlogPost  $request
 * @return Response
 */
public function store(StoreBlogPost $request)
{
    // The incoming request is valid...

    // Retrieve the validated input data...
    $validated = $request->validated();
}

1

一种内置的解决方案是使用中间件,但我发现你想要针对特定操作执行那段代码。

如果我是你,我会创建一个具体的controller类,让所有我的控制器都继承它,这个控制器可能看起来像这样:

class FilteredController extends BaseController
{
    private function getControllerAction(Request $request)
    {
        $action = $request->route()->getAction();

        $controller = class_basename($action['controller']);

        list($controller, $action) = explode('@', $controller);

        return ['action' => $action, 'controller' => $controller];
    }

    private function validateUpdateRequests()
    {
        /* Validation code 
        that will run for update_post action, 
        and update_post ONLY*/
    }

    public function validateCreateRequests()
    {
        /* Validation code that will run for 
           create_post action, and 
           create_post ONLY.*/
    }

    public __construct(Request $request)
    {
        $route_details = $this->getControllerAction($request);

        if($route_details['controller'] == 'postsController')
        {
            if($route_details['action'] == 'update_post')
            {
                $this->validateUpdateRequests();
            }

            else if($route_details['action'] == 'update_post')
            {
                $this->validateCreateRequests();
            }
        }
    }
}

我希望这可以帮到你。
再次强调,更好的方法是使用中间件,并且要针对特定操作使用中间件,你需要在路由中指定过滤条件,例如:
Route::get('/route_to_my_action', 'MyController@myAction')
->middleware(['my_middleware']);

如需了解有关 Laravel 中此过滤器样式的更多信息,请访问文档


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接