CRUD控制器
编辑该页面CRUD控制器
CRUD控制器提供CRUD操作(创建、显示、更新、删除)教义ORM实体。每个CRUD控制器可以关联到一个或多个仪表盘。
从技术上讲,这些CRUD控制器是常规ob娱乐下载Symfony控制器所以你可以做任何你通常做在一个控制器,如注射服务和使用快捷键$ this - >渲染()
或$ this - > isGranted ()
。
CRUD控制器必须实现EasyCorp
,确保特定方法中定义控制器。而不是实现的接口,还可以延长的AbstractCrudController
类。运行以下命令来生成一个CRUD控制器的基本结构:
1
美元php bin /控制台:admin: crud
CRUD控制器页面
的四个主要页面CRUD控制器:
指数
,显示实体的列表可分页的,按列排序和精制搜索查询和过滤器;细节
的内容,显示一个给定的实体;新
,允许创建新实体实例;编辑
,允许更新给定实体的任何属性。
这些页面生成四个名称相同的行为AbstractCrudController
控制器。这个控制器定义其他次要动作(如。删除
和自动完成
),不匹配任何页面。
这些行动的默认行为AbstractCrudController
适合大多数的后端,但是你可以定制它在几个方面:EasyAdmin事件,自定义EasyAdmin模板等。
页面名称和常量
一些方法需要作为参数的名称有些CRUD页面。您可以使用任何以下字符串:“指数”
,“细节”
,“编辑”
和“新”
。如果你喜欢使用常量这些值,使用Crud: PAGE_INDEX
,Crud: PAGE_DETAIL
,Crud: PAGE_EDIT
和Crud: PAGE_NEW
(他们中定义EasyCorp
类)。
CRUD控制器配置
唯一强制性CRUD控制器配置选项是FQCN教义实体进行管理的控制器。这是定义为一个公共静态方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
名称空间应用程序\控制器\管理;使用应用程序\实体\产品;使用EasyCorp\包\EasyAdminBundle\控制器\AbstractCrudController;类ProductCrudController扩展AbstractCrudController{/ /必须返回一个FQCN(完全限定类名)的教义ORM的实体公共静态函数getEntityFqcn():字符串{返回产品::类;}/ /……}
其余的CRUD选项配置使用configureCrud ()
方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
名称空间应用程序\控制器\管理;使用EasyCorp\包\EasyAdminBundle\配置\Crud;使用EasyCorp\包\EasyAdminBundle\控制器\AbstractCrudController;类ProductCrudController扩展AbstractCrudController{/ /……公共函数configureCrud(Crud美元crud):Crud{返回美元crud- >setEntityLabelInSingular (“……”)- >setDateFormat (“……”)/ /……;}}
设计选项
1 2 3 4 5 6 7 8 9 10 11 12
公共函数configureCrud(Crud美元crud):Crud{返回美元crud/ /设置这个选项如果你喜欢横跨整个的页面内容/ /浏览器宽度,而不是默认的设计设置一个最大宽度- >renderContentMaximized ()/ /设置这个选项如果你喜欢侧边栏(包含主菜单)/ /显示作为一个窄栏而不是默认的扩展设计- >renderSidebarMinimized ();}
实体的选择
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
公共函数configureCrud(Crud美元crud):Crud{返回美元crud/ /标签指这个实体在标题、按钮等。- >setEntityLabelInSingular (“产品”)- >setEntityLabelInPlural (“产品”)/ /除了一个字符串,单数和复数标签的参数的方法/ /可以闭包定义了两个可空参数:entityInstance (/ /在“索引”和“新”零页)和当前页面名称- >setEntityLabelInSingular (fn(?)的产品美元产品字符串,?美元pageName)= >美元产品吗?美元产品- >toString ():“产品”)- >setEntityLabelInPlural (函数(?类别美元类别字符串,?美元pageName){返回“编辑”= = =美元pageName吗?美元类别- >getLabel ():“类别”;})/ / Symob娱乐下载fony所需安全许可管理实体/ /(默认情况下,没有一个可以管理的所有实例的实体)- >setEntityPermission (“ROLE_EDITOR”);}
标题和帮助选项
默认情况下,页面标题的指数
和新
基于页面实体的选择价值观的定义setEntityLabelInSingular ()
和setEntityLabelInPlural ()
方法。在细节
和编辑
页,EasyAdmin首先试图将实体转换为字符串表示,落回到一个通用的标题。
你可以覆盖默认的页面标题用以下方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
公共函数configureCrud(Crud美元crud):Crud{返回美元crud/ /页面的顶部的可见的标题和<标题>元素的内容/ /可以包括这些占位符:/ / % entity_name %、% entity_as_string %/ / % entity_id %, % entity_short_id %/ / % entity_label_singular %, % entity_label_plural %- >setPageTitle (“指数”,“% entity_label_plural %清单”)/ /关闭您可以通过PHP作为标题的价值- >setPageTitle (“新”,fn () = >新\ DateTime (“现在”)>新\ DateTime (今天下午的)?“新晚餐”:“新午餐”)/ /详细和编辑页面,关闭接收当前实体/ /第一个参数- >setPageTitle (“细节”fn(产品美元产品)= >(字符串)美元产品)- >setPageTitle (“编辑”fn(类别美元类别)= > sprintf (“编辑< b > % s < / b > ',美元类别- >getName ()))/ /消息显示给最终用户的帮助(它可以包含HTML标记)- >setHelp (“编辑”,“……”);}
日期、时间和数字格式选项
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日24
公共函数configureCrud(Crud美元crud):Crud{返回美元crud/ /参数必须要么这些字符串之一:“短”,“中”,“长”,“全部”,“没有”/ /(字符串也可以作为\ EasyCorp \包\ EasyAdminBundle \字段\ DateTimeField:: FORMAT_ *常量)/ /或一个有效的ICU Datetime模式(参见https://unicode-org.github.io/icu/userguide/format_parse/datetime/)- >setDateFormat (“……”)- >setTimeFormat (“……”)/ /第一个参数= datetime模式或日期格式;第二个可选参数=时间格式- >setDateTimeFormat (“……”,“……”)- >setDateIntervalFormat (' % % y年(s) % % m月(s) % % d (s)”)- >setTimezone (“……”)/ /这个选项使数值呈现与sprintf ()/ /调用使用该值作为第一个参数。/ /这个选择将会重写任何格式选项的所有数值/ /(例如setNumDecimals (), setRoundingMode(),等被忽略)/ / NumberField和IntegerField可以覆盖这个值/ /自己setNumberFormat()方法,它以同样的方式工作- >setNumberFormat (“% .2d”);;}
搜索、订单和分页选项
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
公共函数configureCrud(Crud美元crud):Crud{返回美元crud/ /……/ /学说实体属性的名称,搜索了/ /(默认情况下看起来在所有属性)- >setSearchFields ([“名字”,“描述”])/ /使用点(如。“seller.email”)搜索关联的教条- >setSearchFields ([“名字”,“描述”,“seller.email”,“seller.address.zipCode”])/ /设置为null禁用和隐藏搜索框- >setSearchFields (零)/ /调用这个方法集中搜索输入时自动加载的索引页面- >setAutofocusSearch ();}
提示
默认搜索引擎进行了或查询(寻找foo酒吧
返回项目,喷火
或酒吧
或foo酒吧
)。你可以查询包裹全部或部分引用作出一个精确的搜索:“foo栏”
只返回项的具体内容,包括中间的空格。
1 2 3 4 5 6 7 8 9 10 11 12 13
公共函数configureCrud(Crud美元crud):Crud{返回美元crud/ /……/ /定义初始分类应用于实体的列表/ /(稍后用户可以改变这种排序通过单击表列)- >setDefaultSort ([“id”= >“DESC”])- >setDefaultSort ([“id”= >“DESC”,“标题”= >“ASC”,“startsAt”= >“DESC”])由主义协会/ /你可以两个层次- >setDefaultSort ([“seller.name”= >“ASC”]);}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
公共函数configureCrud(Crud美元crud):Crud{返回美元crud/ /……/ /每页显示数量最大的实体- >setPaginatorPageSize (30.)/ /页面的数量显示当前页面的每一面/ /例如如果num页面= 35,当前页面= 7,你设置- > setPaginatorRangeSize (4)/ / paginator显示(以前):1…3 4 5 6 [7]8 9 10 11……35(下)/ /设置这个数字为0来显示一个简单的“<前|下一个>”寻呼机- >setPaginatorRangeSize (4)/ /这是高级选项相关学说分页/ /(参见https://www.doctrine-project.org/projects/doctrine-orm/en/2.7/tutorials/pagination.html)- >setPaginatorUseOutputWalkers (真正的)- >setPaginatorFetchJoinCollection (真正的);}
默认的教义查询执行实体的列表显示在指数
考虑分类配置页,可选的搜索查询,可选的过滤器和分页。如果你需要完全定制这个查询,覆盖createIndexQueryBuilder ()
在你的CRUD方法的控制器。
模板和表单选项
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30 31
公共函数configureCrud(Crud美元crud):Crud{返回美元crud/ /这个方法允许使用自己的模板来呈现一个特定部分/ /后端而不是使用EasyAdmin默认模板/ /第一个参数是“模板名称”,这是一样的/ /分支路径但没有@EasyAdmin /前缀和. html。树枝的后缀- >overrideTemplate (“crud /场/ id”,“管理/字段/ my_id.html.twig”)/ /主题/主题时使用该实体的呈现形式/ /(除了EasyAdmin默认主题)- >addFormTheme (“foo.html.twig”)/ /该方法覆盖所有现有形式(包括主题/ /默认EasyAdmin形式主题)- >setFormThemes ([“my_theme.html.twig”,“admin.html.twig”])/ /设置整个表单的选项(稍后,您可以设置选项/ /每个表单类型通过相关字段的方法)/ /将一个数组参数传递给新应用相同的选项和编辑表单- >setFormOptions ([“validation_groups”= > [“默认”,“my_validation_group”]]);/ /两个数组参数传递给新应用不同的选项和编辑表单/ /(通过一个空数组参数如果你想任何选项适用于某种形式)- >setFormOptions ([“validation_groups”= > [“my_validation_group”]],[“validation_groups”= > [“默认”),“……”= >“……”),);;}
自定义创建或编辑实体后重定向
默认情况下,当点击“保存”按钮,创建或编辑实体重定向到前一页。如果你想改变这种行为,覆盖getRedirectResponseAfterSave ()
方法。
例如,如果你添加了一个自定义动作“保存并查看详细”,你可能更愿意保存更改后重定向到详细页面:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
受保护的函数getRedirectResponseAfterSave(AdminContext美元上下文、字符串美元行动):RedirectResponse{美元submitButtonName=美元上下文- >getRequest ()- >请求- >所有()(“ea”][“newForm中将”][“btn”];如果(“saveAndViewDetail”= = =美元submitButtonName){美元url=美元这- >容器- >get (AdminUrlGenerator::类)- >setAction(行动::细节)- >setEntityId (美元上下文- >getEntity ()- >getPrimaryKeyValue ())- >generateUrl ();返回美元这- >重定向(美元url);}返回父::getRedirectResponseAfterSave (美元上下文,美元行动);}
同样的配置在不同的CRUD控制器
如果你想做同样的配置在所有CRUD控制器,不需要重复在每个控制器配置。相反,添加configureCrud ()
在仪表板,所有控制器将继承方法配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
使用EasyCorp\包\EasyAdminBundle\配置\Crud;使用EasyCorp\包\EasyAdminBundle\配置\指示板;使用EasyCorp\包\EasyAdminBundle\控制器\AbstractDashboardController;类DashboardController扩展AbstractDashboardController{/ /……公共函数configureCrud():Crud{返回Crud::新()/ /定义分页大小对所有CRUD控制器/ /(每个CRUD控制器可以覆盖这个值如果需要)- >setPaginatorPageSize (30.);}}
字段
字段允许显示教义的内容在每个实体CRUD页面。EasyAdmin提供了内置的字段来显示所有的通用数据类型,但你也可以创建自己的领域。
如果你的CRUD控制器的延伸AbstractCrudController
,自动配置的字段。在指数
页面,您将看到几个字段和其他的页面你会看到许多领域如需要显示所有教义实体的属性。
读了章对字段学习如何配置哪些字段显示在每一页,如何配置每个字段呈现的方式,等等。
定制CRUD操作
默认的CRUD操作(index ()
,详细信息()
,编辑()
,新()
和delete ()
方法在控制器)实现应用程序中使用的最常见的行为。
第一种方法来定制他们的行为是覆盖这些方法在自己的控制器。然而,最初的行动一般,它们包含相当多的代码,所以重写它们并不方便。
相反,您可以覆盖其他较小的方法实现某些功能所需的CRUD操作。例如,index ()
行动调用一个命名方法createIndexQueryBuilder ()
创建教义query builder用于获取结果显示在索引清单。如果你想定制,清单,最好是覆盖createIndexQueryBuilder ()
而不是整个方法index ()
方法。这些方法有很多,所以你应该检查EasyCorp
类。
其他定制CRUD操作是使用事件触发EasyAdmin,如BeforeCrudActionEvent
和AfterCrudActionEvent
。
创建、保存和删除实体
大部分的CRUD操作的控制器最终创建、保存或删除实体。如果你的CRUD控制器的延伸AbstractCrudController
,这些方法已经实现,但是你可以定制它们重写方法,听事件。
首先,您可以重写createEntity ()
,updateEntity ()
,persistEntity ()
和deleteEntity ()
方法。的createEntity ()
例如只执行方法返回新entityFqcn美元()
,所以你需要重写它如果你的实体需要通过构造函数参数或设置它的一些属性:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
名称空间应用程序\控制器\管理;使用应用程序\实体\产品;使用EasyCorp\包\EasyAdminBundle\控制器\AbstractCrudController;类ProductCrudController扩展AbstractCrudController{公共静态函数getEntityFqcn():字符串{返回产品::类;}公共函数createEntity(字符串美元entityFqcn){美元产品=新产品();美元产品- >createdBy (美元这- >getUser ());返回美元产品;}/ /……}
覆盖此行为的其他方法是听事件触发EasyAdmin创建一个实体时,更新,保存,删除,等等。
通过额外的变量CRUD模板
默认实现CRUD操作AbstractCrudController
不以通常的结束$ this - >渲染(……)
指令来呈现一个树枝Symfony模板并返回它的内容ob娱乐下载响应
对象。
相反,返回一个CRUD操作EasyCorp
对象的变量传递给模板呈现CRUD操作的内容。这KeyValueStore
类似于Symfony的对象ob娱乐下载ParameterBag
对象。这就像一个面向对象的数组等有用的方法get ()
,设置()
,有()
等。
每个CRUD操作结束之前,他们KeyValueStore
对象传递给一个方法调用configureResponseParameters ()
你可以覆盖在自己的控制器添加/删除/改变这些模板变量:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日24日25
名称空间应用程序\控制器\管理;使用应用程序\实体\产品;使用EasyCorp\包\EasyAdminBundle\配置\Crud;使用EasyCorp\包\EasyAdminBundle\配置\KeyValueStore;使用EasyCorp\包\EasyAdminBundle\控制器\AbstractCrudController;类ProductCrudController扩展AbstractCrudController{/ /……公共函数configureResponseParameters(KeyValueStore美元responseParameters):KeyValueStore{如果(Crud::PAGE_DETAIL = = =美元responseParameters- >get (“pageName”)){美元responseParameters- >集(“foo”,“……”);/ /键支持“点符号”,所以你可以获取/设置嵌套/ /值分离与一个点的部分:美元responseParameters- >setIfNotSet (“方法”,“……”);/ /这相当于:$参数['酒吧'][“foo”] =“……”}返回美元responseParameters;}}
您可以添加尽可能多或尽可能少的参数KeyValueStore
你需要对象。唯一强制参数templateName
或templatePath
设置模板的名称或路径分别呈现为CRUD操作的结果。
模板名称和模板的路径
所有使用的模板EasyAdmin呈现其内容都是可配置的。这就是为什么EasyAdmin处理“模板名称”而不是正常的树枝模板路径。
模板的名字是一样的但没有模板路径@EasyAdmin
前缀,.html.twig
后缀。例如,@EasyAdmin / layout.html.twig
指由EasyAdmin提供内置的布局模板。然而,布局
是指“任何模板配置为应用程序中的布局”。
使用模板名称而不是路径给你充分灵活地自定义应用程序行为,同时保持所有的自定义模板。在树枝模板,使用ea.templatePath ()
函数的分支路径关联到给定的模板名称:
1 2 3 4 5 6 7
<divid=“穿衣”>{{包括(ea.templatePath (“flash_messages”))}}< /div>{%如果some_value是null %}{{包括(ea.templatePath(“标签/空”))}}{%endif%}
生成管理url
作为解释篇关于仪表板,所有url的仪表板使用相同的路线,他们只在查询字符串参数不同。不用处理,您可以使用AdminUrlGenerator
服务在PHP代码中生成的url。
在生成一个URL时,你不从头开始。EasyAdmin重用现有的所有查询参数在当前请求。这样做是故意的,因为产生新的URL基于当前URL是最常见的场景。使用unsetAll ()
方法删除所有现有的查询参数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30 31 32 33 34 35 36 37 38 39
名称空间应用程序\控制器\管理;使用EasyCorp\包\EasyAdminBundle\控制器\AbstractCrudController;使用EasyCorp\包\EasyAdminBundle\路由器\AdminUrlGenerator;类SomeCrudController扩展AbstractCrudController{私人美元adminUrlGenerator;公共函数__construct(AdminUrlGenerator美元adminUrlGenerator){美元这- >adminUrlGenerator =美元adminUrlGenerator;}/ /……公共函数someMethod(){/ /而不是注入AdminUrlGenerator服务在构造函数中,/ /你也可以从内部控制器动作如下:/ / $ adminUrlGenerator = $ this - >容器- > (adminUrlGenerator::类);/ /现有的查询参数维护,所以你只/ /必须通过你想要改变的值。美元url=美元这- >adminUrlGenerator- >集(“页面”,2)- >generateUrl ();/ /您可以删除现有的参数美元url=美元这- >adminUrlGenerator- >设置(“menuIndex”)- >generateUrl ();美元url=美元这- >adminUrlGenerator- >unsetAll ()- >集(“foo”,“someValue”)- >generateUrl ();/ / URL builder为最常见的参数提供了捷径美元url=美元这- >adminUrlGenerator- >setController (SomeCrudController::类)- >setAction (“theActionName”)- >generateUrl ();/ /……}}
提示
如果你需要手动处理管理url为任何原因,查询字符串参数的名称被定义为常量EA类。
相同的特性是由于中可用的模板ea_url ()
树枝的功能。在模板可以省略的generateUrl ()
方法(它将自动为你):
1 2 3 4 5 6 7 8 9
{#都是等价的#}{%集页面url = ea_url ({2}): .generateUrl () %}{%集页面url = ea_url ({2}): %}{%集url = ea_url ()。集(“页面”,2)%}{%集url = ea_url () .setController(“应用程序控制器\ \ \ \管理\ \ SomeCrudController”) .setAction (theActionName) %}
生成CRUD url EasyAdmin以外
当生成EasyAdmin页面的url EasyAdmin以外(例如,从一个普通Symfony控制器)ob娱乐下载管理上下文变量是不可用的。这就是为什么你必须设置CRUD控制器相关的URL。如果你有超过一个仪表板,您还必须设置仪表板:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
使用应用程序\控制器\管理\DashboardController;使用应用程序\控制器\管理\ProductCrudController;使用EasyCorp\包\EasyAdminBundle\配置\行动;使用EasyCorp\包\EasyAdminBundle\路由器\AdminUrlGenerator;使用ob娱乐下载\包\FrameworkBundle\控制器\AbstractController;类Someob娱乐下载SymfonyController扩展AbstractController{私人美元adminUrlGenerator;公共函数__construct(AdminUrlGenerator美元adminUrlGenerator){美元这- >adminUrlGenerator =美元adminUrlGenerator;}公共函数someMethod(){/ /如果您的应用程序只包含一个仪表板,就足够了/ /定义控制器与这个URL美元url=美元这- >adminUrlGenerator- >setController (ProductCrudController::类)- >setAction(行动::指数)- >generateUrl ();/ /在应用程序中包含多个仪表盘,你也必须/ /定义仪表板相关的URL美元url=美元这- >adminUrlGenerator- >setDashboard (DashboardController::类)- >setController (ProductCrudController::类)- >setAction(行动::指数)- >generateUrl ();/ /一些行动可能需要通过额外的参数美元url=美元这- >adminUrlGenerator- >setController (ProductCrudController::类)- >setAction(行动::编辑)- >setEntityId (美元产品- >getId ())- >generateUrl ();/ /……}}
这同样适用于url生成树枝模板:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
{#如果你的应用程序仅仅定义了一个仪表板#}{%集url = ea_url () .setController(“应用程序控制器\ \ \ \管理\ \ ProductCrudController”) .setAction(指数)%}{#如果你喜欢PHP常数,用这个:.setAction(常数(“EasyCorp \ \包\ \ EasyAdminBundle \ \ Config \ \行动::指数”))#}{#如果您的应用程序定义了多个仪表盘#}{%集url = ea_url () .setDashboard(“应用程序控制器\ \ \ \管理\ \ DashboardController”) .setController(控制器的应用\ \ \ \管理\ \ ProductCrudController”) .setAction(指数)%}{#一些行动可能需要通过额外的参数#}{%集url = ea_url () .setController(“应用程序控制器\ \ \ \管理\ \ ProductCrudController”) .setAction(编辑).setEntityId (product.id) %}