grohiro/laravel-action-submit

Laravel ActionSubmit 按钮

0.1.2 2014-07-06 13:46 UTC

This package is auto-updated.

Last update: 2024-08-29 03:31:27 UTC


README

可以生成用于执行任意动作的提交按钮。

 <form action="user/list" method="post">

 <!--UserController@search() -->
 <input type="submit" value="Search" name="_action_search" />

 <!--UserController@delete()-->
 <input type="submit" value="Delete" name="_action_delete" />
 </form>

在单个表单中创建多个提交按钮,通过按下的按钮选择要执行的动作。

路由

\Route::post('user/list', ['uses' => 'UserController@search', 'as' => 'user.search']);
\Route::post('user/delete', ['uses' => 'UserController@delete', 'as' => 'user.delete'])

视图 (Blade)

{{Form::open('user/list', ['method' => 'post'])}}
  {{Form::actionSubmitRoute('user.search', 'Search'))}}
  {{Form::actionSubmitRoute('user.delete', 'Delete'))}}
{{Form::close()}}

提交按钮

路由 Route

Form::actionSubmitRoute($routeName, $value, $patemeters, $attributes)

动作 Action

Form::actionSubmitAction($actionName, $value, $parameters, $attributes)

路径 Path

Form::actionSubmit($path, $value, $attributes)

用法

bootstrap/start.php

\Laravel\Extension\ActionSubmit\ActionSubmit::register();

require $app;

(又做了一点点。以下为闲话。)

实现方式

即使不将 Laravel 集成,也可以通过在提交按钮的 onclick 中替换 form.action 来实现相同的功能,但可能有些冗余。如果不喜欢使用 JavaScript,可以尝试使用它。

为了实现任意动作的调度而扩展了路由。Laravel 的路由是按照以下顺序解析动作的。

  • 通过 \Route::add() 等方式将路由定义注册到 RouteCollections 中
  • 从请求信息中获取满足以下所有条件的路由
    • HTTP 方法匹配
    • 协议(https?://)匹配
    • 主机名匹配
    • 路径匹配 (/controller/action)
  • 找到匹配的路由后,使用 uses 指定的动作 (Controller@action) 执行

ActionSubmit 在路由获取条件中增加了与提交按钮 name 中嵌入的路由匹配的条件。

一些需要注意的点。

  • 即使用 App::bind('router', 'MyRouter') 也不会使用 MyRouter

    • 会使用 Illuminate\Routing\Router
    • 似乎需要在 global.php 中在加载 filters.php 之前使用 App::bind()
    • App:bind() 可以在任何地方执行,但如果不在初始化前执行 routerrequest 等则没有意义
    • 即使在 global.php 中也存在问题,因此将其移动到 bootstrap/start.php
  • App::bind('router', 'Laravel\Extension\ActionSubmit\Router') 不起作用

    • 将扩展的类注册到 router 后,所有 URL 都会返回 404 Not Found
    • 调试发现路由初始注册是成功的,但在调度时路由为空(artisan route 是正常的)
    • 似乎每次调用 app('router') 都会生成一个 Router 实例
    • 通过将 App:bind('router', 'Hoge', true) 的第三个参数设置为 true 来使其成为 Singleton 以解决问题
另请参阅
  • Illuminate\Routing\Router
  • Illuminate\Routing\Route
  • Illuminate\Routing\RouteCollections