1、Laravel中文手册前言欢迎阅读Laravel文档。这份文档既可以作为入门指南,也可以作为Laravel功能特色的参考手册。如果你迫不及待想要开始Laravel之旅的话,可以直接跳到你想看的章节,不过,我们还是强烈建议你按顺序阅读这份文档,这样能让你循序渐进的打好基础,而且,每一章节都是后后续章节的基础。使用Laravel将是一种享受!Laravel是一套功能强大的PHP开发框架,并且着重于灵活性和语法的表现力。对于初学者,Laravel像其他流行、轻量级框架一样易学、易用;对于经验丰富的同学,Laravel能让你体验代码模块化的好处。Laravel的灵活性能让你随心所欲的更新、重构你用应用
2、;Laravel富于表现力的语法能让你或你的团队的代码简洁、容易阅读。Laravel优于其它PHP框架Laravel在很多方面优于其它框架,以下列出的就是其中的一部分: Bundle是Laravel的扩展包组织形式或称呼。Laravel的扩展包仓库已经相当成熟了,可以很容易的帮你把扩展包(bundle)安装到你的应用中。你可以选择下载一个扩展包(bundle)然后拷贝到bundles目录,或者通过命令行工具“Artisan”自动安装。 在Laravel中已经具有了一套高级的PHPActiveRecord实现 -EloquentORM。它能方便的将“约束(constraints)”应用到关系的双
3、方,这样你就具有了对数据的完全控制,而且享受到ActiveRecord 的所有便利。Eloquent原生支持 Fluent中查询构造器(query-builder)的所有方法。 应用逻辑(ApplicationLogic)可以在控制器(controllers)中实现,也可以直接集成到路由(route)声明中,并且语法和Sinatra框架类似。Laravel的设计理念是:给开发者以最大的灵活性,既能创建非常小的网站也能构建大型的企业应用。 反向路由(ReverseRouting)赋予你通过路由(routes)名称创建链接(URI)的能力。只需使用路由名称(routename),Laravel就会
4、自动帮你创建正确的URI。这样你就可以随时改变你的路由(routes),Laravel会帮你自动更新所有相关的链接。 Restful控制器(RestfulControllers)是一项区分GET和POST请求逻辑的可选方式。比如在一个用户登陆逻辑中,你声明了一个get_login()的动作(action)来处理获取登陆页面的服务;同时也声明了一个post_login()动作(action)来校验表单POST过来的数据,并且在验证之后,做出重新转向(redirect)到登陆页面还是转向控制台的决定。 自动加载类(ClassAuto-loading)简化了类(class)的加载工作,以后就可以不用
5、去维护自动加载配置表和非必须的组件加载工作了。当你想加载任何库(library)或模型(model)时,立即使用就行了,Laravel会自动帮你加载需要的文件。 视图组装器(ViewComposers)本质上就是一段代码,这段代码在视图(View)加载时会自动执行。最好的例子就是博客中的侧边随机文章推荐,“视图组装器”中包含了加载随机文章推荐的逻辑,这样,你只需要加载内容区域的视图(view)就行了,其它的事情Laravel会帮你自动完成。 反向控制容器(IoCcontainer)提供了生成新对象、随时实例化对象、访问单例(singleton)对象的便捷方式。反向控制(IoC)意味着你几乎不需
6、要特意去加载外部的库(libraries),就可以在代码中的任意位置访问这些对象,并且不需要忍受繁杂、冗余的代码结构。 迁移(Migrations)就像是版本控制(versioncontrol)工具,不过,它管理的是数据库范式,并且直接集成在了Laravel中。你可以使用“Artisan”命令行工具生成、执行“迁移”指令。当你的小组成员改变了数据库范式的时候,你就可以轻松的通过版本控制工具更新当前工程,然后执行“迁移“指令即可,好了,你的数据库已经是最新的了! 单元测试(Unit-Testing)是Laravel中很重要的部分。Laravel自身就包含数以百计的测试用例,以保障任何一处的修改不
7、会影响其它部分的功能,这就是为什么在业内Laravel被认为是最稳版本的原因之一。Laravel也提供了方便的功能,让你自己的代码容易的进行单元测试。通过Artisan命令行工具就可以运行所有的测试用例。 自动分页(AutomaticPagination)功能避免了在你的业务逻辑中混入大量无关分页配置代码。方便的是不需要记住当前页,只要从数据库中获取总的条目数量,然后使用limit/offset获取选定的数据,最后调用paginate方法,让Laravel将各页链接输出到指定的视图(View)中即可,Laravel会替你自动完成所有工作。Laravel的自动分页系统被设计为容易实现、易于修改。
8、虽然Laravel可以自动处理这些工作,但是不要忘了调用相应方法和手动配置分页系统哦!上面提到的只是Laravel优于其它框架的几点。在这份文档中包含了Laravel所有的特性和更多优点。安装与设置目录 要求 安装 服务器配置 基本设置 环境设置 友好的链接安装要求 Apache,nginx, 或者其他web服务器。 Laravel 框架应用了很多PHP5.3版才具备的强大的新特性,所以你必须安装PHP5.3或者以上版本。 Laravel 使用FileInfo库来检测mime类型。PHP5.3版已经默认包含了FileInfo库。Windows用户需要在php.ini中启用该模块。关于FileI
9、nfo库的更多信息请阅读:installation/configurationdetailsonPHP.net。 Laravel 使用Mcrypt库 来加密和生成哈希。PHP5.3已经预装了Mcrypt库。如果你在phpinfo()中没有找到Mcrypt已经启用的信息,请检查你的服务器环境是否安装完全,或者查看PHP手册中 Mcrypt库有关信息。安装 下载 Laravel 解压Laravel压缩包,然后上传文件到你的web服务器。 在config/application.php中设置applicationkey,你可以设置为任意的32位字符串。 确保storage/views目录具有写入权限
10、。 现在你可以尝试在浏览器中运行框架。如果不出意外,你应该看到了Laravel漂亮的初始页面。一切准备就绪,我们可以继续Laravel学习之旅!选装程序如果你想充分了解和学习Laravel框架的应用,推荐你安装以下程序: SQLite,MySQL,PostgreSQL, 或者 SQLServerPDOdriver. Memcached 或者 APC.安装遇到问题?如果你在安装过程中遇到了问题,可以检查以下情况: 请确保public文件夹是服务器的根目录,如果不是,你可以尝试访问Laravel的public文件夹,如http:localhost/public/。 如果你启用了mod_rewrit
11、e拓展,请把application/config/application.php文件中的index参数设置为空。 请确保服务器的storage目录及其子目录具有写入权限。服务器配置就像大部分的web开发框架一样,Laravel的设计也考虑了代码和存储安全的问题,Laravel框架只把允许公众访问的文件放在web服务器的根目录(DocumentRoot),这样可以有效的防止因为服务器的设置错误而泄露重要的代码和信息资料。稳定压倒一切!下面的案例中,我们假定把Laravel安装到 /Users/JonSnow/Sites/MySite 目录。这对MySite的Apache虚拟主机的基本配置如下:D
12、ocumentRoot/Users/JonSnow/Sites/MySite/publicServerNamemysite.dev注意,虽然安装目录是 /Users/JonSnow/Sites/MySite ,但是DocumentRoot配置项必须指向 /Users/JonSnow/Sites/MySite/public 目录。将DocumentRoot指向public目录是一条通用的最佳实践方法,但是某些主机是不允许改变DocumentRoot配置的,没关系,人民的力量是无穷无尽的,Laravel论坛里收集了一系列有用的方法。基本设置Laravel框架的所有配置文件都存放在应用程序的conf
13、ig文件夹中,建议你把所有的配置文件都看一下,对应用程序的设置可以有一个基本的了解。你应该注意一下application/config/application.php文件,它包含了应用程序的基本设置。在开发或者启用网站之前,你应该首先修改application/config/application.php中的applicationkey。Laravel会用它来加密或者生成哈希。你可以手动设置一个32位的随机字符串,也可以使用Laravel提供的Artisan命令行工具来生成一个符合标准的字符串。有关Aartisan工具的信息可以访问 Artisan命令列表。注意: 如果你启用了mod_rewr
14、ite,你应该把index参数设置为空。环境设置通常情况下,应用程序的开发环境和正式生产环境的设置是不同的,Laravel使用的URL机制可以让你轻而易举的解决这个问题。打开Laravel框架的安装目录下的 paths.php 文件,你可以看到下面的数组:$environments=array(local=array(http:/localhost*,*.dev),);这个数组表示任何以“localhost“开头或者以“*.dev“结尾的请求,都被视为“local“环境。然后,建立application/config/local文件夹,那么local文件夹下面的任何设置都会覆盖applicat
15、ion/config中的基本设置。举个例子,你希望在新建的local目录中创建一个application.php文件:returnarray(url=http:/localhost/laravel/public,);在这个例子中,local中的URL设置会覆盖application/config/application.php文件中的URL设置。需要注意的是,你只需要指定那些你想要覆盖的设置。Laravel的环境设置就是这么简单,你可以用它来创建你需要的环境。友好的链接通常情况下,你不想“index.php“出现在网站的链接中,那么你可以用rewrite重定向来去掉“index.php“。如果
16、你使用的是Apache服务器,请启用mod_rewrite模块,然后在你的public目录创建一个.htaccess文件,内容如下:RewriteEngineonRewriteCond%REQUEST_FILENAME!-fRewriteCond%REQUEST_FILENAME!-dRewriteRule(.*)$index.php/$1L如果上面的.htaccess文件没有效果,可以试试下面的写法:Options+FollowSymLinksRewriteEngineonRewriteCond%REQUEST_FILENAME!-fRewriteCond%REQUEST_FILENAME!
17、-dRewriteRule.index.phpL在设置了重定向之后,你还应该把application/config/application.php中的index参数设置为空。注意: 不同服务器的rewrite方法有所不同,请根据具体情况配置。路由目录 基础 通配符(Wildcards) 404事件(The404Event) 过滤器(Filters) 模式过滤器(PatternFilters) 全局过滤器(GlobalFilters) 路由组(RouteGroups) 命名路由(NamedRoutes) HTTPS路由(HTTPSRoutes) 扩展包路由(BundleRoutes) 控制器路由
18、(ControllerRouting) 命令行路由测试(CLIRouteTesting)基础Laravel充分利用PHP5.3的特性,使路由变得简单并富于表达性。这使得从构建API到完整的web应用都变得尽可能容易。路由的实现代码在 application/routes.php 文件。和其它框架不同,应用逻辑在Laravel中可以通过两种方式集成。虽然在控制器(controllers)中实现业务逻辑是普遍的做法,但是在Laravel中也可以直接在路由中嵌入应用逻辑。这种方式尤其适用于只有几个页面的小型网站,这样就免去了创建一大堆控制器(controllers),还要为每个控制器创建一些不相干的
19、方法(methods),而最后只是一部分方法(methods)通过手动设置路由的方式被暴露出来。在下面的代码示例中,第一个参数(parameter)是你“注册”的路由(route),第二个参数是这个路由将要触发的函数(function),函数中包含了应用逻辑。定义路由时不需要开头的斜线(front-slash),唯一的例外是默认路由(defaultroute)只包含一个斜线(front-slash)。注意: 路由的权重在于其被注册的先后顺序。 因此,任何通配(catch-all)的路由应该在routes.php 文件的底部注册注册一个响应 “GET/“ 的路由:Route:get(/,func
20、tion() return“HelloWorld!“;);注册一个能同时响应(GET、POST、PUT、DELETE)HTTP请求方法(HTTPverbs)的路由:Route:any(/,function() return“HelloWorld!“;);注册响应其它HTTP请求方法(HTTPverbs)的路由:Route:post(user,function()/);Route:put(user/(:num),function($id) /);Route:delete(user/(:num),function($id) /);注册一个能响应多个HTTP请求方法(HTTPverbs)的路径(UR
21、I):Router:register(array(GET,POST),$uri,$callback);通配符(Wildcards)强制路径(URI)中的某部分为数字:Route:get(user/(:num),function($id) /);允许路径(URI)中的某部分是字母、数字串:Route:get(post/(:any),function($title) /);允许路径(URI)中的某部分是可选的:Route:get(page/(:any?),function($page=index) /);404事件(The404Event)如果一个请求(request)不能匹配任何一个路由,404
22、事件将被触发。在 application/routes.php文件中可以找到默认的事件处理代码。默认的404事件处理代码Event:listen(404,function() returnResponse:error(404););你可以按照你自己的需求定制这部分代码!延伸阅读: 事件(Events)过滤器(Filters)过滤器(filters)可以在路由之前或之后触发。如果在路由之前触发的过滤器(filters)有返回值,那么这个返回值将被认为是对此次请求(request)的回应(response),路由将停止执行。这一特性便于实现身份验证之类的功能。在 application/route
23、s.php 文件中定义了所有过滤器(filters)。注册一个过滤器(filter):Route:filter(filter,function() returnRedirect:to(home););绑定一个过滤器(filter)到路由:Route:get(blocked,array(before=filter,function() returnView:make(blocked););给路由绑定一个之后(after)执行的过滤器(filter):Route:get(download,array(after=log,function() /);绑定多个过滤器(filters)到路由:Route
24、:get(create,array(before=auth|csrf,function() /);给过滤器(filters)传递参数:Route:get(panel,array(before=role:admin,function() /);模式过滤器(PatternFilters)有时你可能需要针对所有包含部分路径(URI)的请求(request)绑定一个过滤器(filter),例如,你想对以“admin”开头的路径(URI)绑定一个叫”auth“的过滤器(filter),以下代码就是具体实现:wD定义一个基于路径模式(URIpattern)的过滤器(filter):Route:filter
25、(pattern:admin/*,auth);你也可以在为某个给定的路径(URI)绑定过滤器(filters)时直接提供一个带有名称(name)和回调函数(callback)的数组,这样,过滤器(filters)也就完成了注册。DefiningafilterandURIpatternbasedfilterinone:Route:filter(pattern:admin/*,array(name=auth,function() /);全局过滤器(GlobalFilters)Laravel默认有两个过滤器(filters),他们分别在每次请求(request)之前(before)和之后(after
26、)执行。你可以在 application/routes.php 文件中找到这两个过滤器(filters)。这两个过滤器可以方便你启动通用扩展包(bundles)或者添加全局资源(assets)。注意:之后(after)过滤器接收到的参数是对应当前请求(request)的 回应(Response)对象。路由组(RouteGroups)路由组方便你为一组路由绑定一些属性(attributes),从而保持代码的整洁。Route:group(array(before=auth),function() Route:get(panel,function() /);Route:get(dashboard,f
27、unction() /););命名路由(NamedRoutes)总是会有修改路由的时候,这就会让写死的路径(URI)产生错误。给路由赋予一个名称(name)可以方便通过这个名称(name)动态生成路径(URI),即便以后路由变化了,路径(URI)仍然和你新的路由保持一致。定义一个命名路由:Route:get(/,array(as=home,function() return“HelloWorld“;);通过命名路由生成URL:$url=URL:to_route(home);重定向到命名路由:returnRedirect:to_route(home);对于一个命名路由,可以方便反查当前请求(re
28、quest)是否是由这个命名路由在处理。反查处理当前请求(request)的路由是否具有给定的名称(name):if(Request:route()-is(home) / 名称为”home“的路由正在处理当前请求(request)!HTTPS路由(HTTPSRoutes)定义路由时,可以通过使用”https“参数指定所生成的URL(或重定向时)采用HTTPS协议。定义一个HTTPS路由:Route:get(login,array(https=true,function() returnView:make(login););使用”secure“函数完成同样的事情:Route:secure(GET
29、,login,function() returnView:make(login););扩展包路由(BundleRoutes)扩展包(bundle)是Laravel的模块化扩展系统。可以通过配置扩展包,方便的处理请求(request)。这里是扩展包的详细介绍,此处略过。通过此段介绍,你会认识到扩展包不仅可以通过路由(route)暴露功能,还可以在扩展包中注册路由。打开 application/bundles.php 文件,添加以下代码:注册扩展包,处理相应的路由:returnarray(admin=array(handles=admin),);注意到代码中的 handles 参数了吗? 这告诉L
30、aravel加载Admin扩展包并处理任何以“admin”开头的路径(URI)。现在准备为你的扩展包注册几个路由吧,在你的扩展包的根目录创建 routes.php 文件,并添加以下代码:给扩展包添加一个根路由(rootroute):Route:get(:bundle),function()returnWelcometotheAdminbundle!;);我们来解析一下这段代码。 注意到 (:bundle) 了吗? 它将被替换为前面注册扩展包时的handles 参数的值。这使你的代码保持D.R.Y.- 不重复,还能让使用你的代码的开发者随意修改扩展包的根(root)URI而不破快扩展包中定义的路
31、由!当然,你可以在扩展包中的所有路由上使用 (:bundle) 占位符,而不仅仅是跟路由(rootroute)。注册扩展包路由:Route:get(:bundle)/panel,function()return“Ihandlerequeststoadmin/panel!“;);控制器路由(ControllerRouting)Controllers provide another way to manage your application logic. If youre unfamiliar withcontrollersyoumaywanttoreadaboutcontrollersandr
32、eturntothissection.ItisimportanttobeawarethatallroutesinLaravelmustbeexplicitlydefined,includingroutestocontrollers. This means that controller methods that have not been exposed through routeregistration cannot be accessed. Its possible to automatically expose all methods within acontrollerusingcon
33、trollerrouteregistration.Controllerrouteregistrationsaretypicallydefinedinapplication/routes.php.Most likely, you just want to register all of the controllers in your applications “controllers“directory.Youcandoitinonesimplestatement.Hereshow:Registerallcontrollersfortheapplication:Route:controller(
34、Controller:detect();The Controller:detect method simply returns an array of all of the controllers defined for theapplication.Ifyou wish to automatically detectthecontrollersin abundle, justpassthebundle nameto themethod.Ifnobundleisspecified,theapplicationfolderscontrollerdirectorywillbesearched.Re
35、gisterallcontrollersforthe“admin“bundle:Route:controller(Controller:detect(admin);Registeringthe“home“controllerwiththeRouter:Route:controller(home);Registeringseveralcontrollerswiththerouter:Route:controller(array(dashboard.panel,admin);Onceacontrollerisregistered,youmayaccessitsmethodsusingasimple
36、URIconvention:http:/localhost/controller/method/argumentsThisconventionissimilartothatemployedbyCodeIgniterandotherpopularframeworks,wherethefirstsegmentisthecontrollername,thesecondisthemethod,andtheremainingsegmentsarepassedtothemethodasarguments.Ifnomethodsegmentispresent,the“index“methodwillbeus
37、ed.Thisroutingconventionmaynotbedesirableforeverysituation,soyoumayalsoexplicitlyrouteURIstocontrolleractionsusingasimple,intuitivesyntax.Registeringaroutethatpointstoacontrolleraction:Route:get(welcome,homeindex);Registeringafilteredroutethatpointstoacontrolleraction:Route:get(welcome,array(after=l
38、og,uses=homeindex);Registeringanamedroutethatpointstoacontrolleraction:Route:get(welcome,array(as=home.welcome,uses=homeindex);命令行路由测试(CLIRouteTesting)可以用Laravel自带的“Artisan”命令行工具测试你的路由,只需指定请求方法(requestmethod)和需要测试的URI,所有返回的响应(response)都会通过var_dump函数输出到命令行上。通过Artisan命令行工具调用路由:phpartisanroute:callgeta
39、pi/user/1控制器目录 基础 控制器路由 插件控制器 行动过滤器 嵌套控制器 控制器布局 REST风格控制器 依赖注入 控制器工厂基础控制器是负责处理用户输入和管理模块、库与视图之间交互的类。通常情况下,控制器会向模块请求数据,然后把数据传递给视图,最后返回给用户。在程序开发中控制器通常被用来实现应用逻辑。Laravel框架还允许开发者在路由中声明应用逻辑,这部分会在路由文档中详细说明。但是我们鼓励新手仍然从控制器开始。在处理应用逻辑方面,控制器和路由没有什么不同。控制器类都应该存放在application/controllers目录中,并且都继承于Base_Controller类。La
40、ravel框架默认自带了一个Home_Controller类。创建一个简单的控制器:classAdmin_ControllerextendsBase_Controllerpublicfunctionaction_index()/Actions是允许被访问的控制器方法,它们都应该以“action_“为前缀,除此以外的其他方法都是禁止访问的。注: Base_Controller类继承于Laravel框架的Controller类。控制器路由需要我们注意到是,在Laragel框架中所有的路由(包括控制器路由)都必须明确定义。这意味着没有在路由中注册的控制器方法都是不可见的。使用控制器路由注册之后,控制
41、器方法会自动接受访问。控制器路由的注册信息通常定义在application/routes.php文件中。访问theroutingpage获取更多关于控制器路由的信息。.插件控制器插件包是Laravel框架的模块化管理系统。插件包可以非常容易的配置应用的处理请求。这部分我们将在插件包文档中作进一步了解。创建插件包控制器的方法和创建应用控制器一样,只需要在控制器名前加上插件包名作为前缀。比如你的插件包名字叫“admin“,那么插件包控制器可以这样写:创建插件控制器:classAdmin_Home_ControllerextendsBase_Controller publicfunctionacti
42、on_index() return“HelloAdmin!“;但是我们怎么用路由来注册插件控制器呢?其实也非常简单:在路由中注册插件控制器:Route:controller(admin:home);现在我们就可以在浏览器中访问“admin“插件包的home控制器了。注: 在Laravel框架中,我们使用双冒号来表示插件包,插件包更多信息可以阅读插件包文档。行动过滤器行动过滤器可以运行在控制方法之前,也可以在控制器方法之后.在Laravel框架中你不仅可以为控制器分配过滤器,同时还可以决定何种HTTP请求会触发过滤器。你可以在控制器构造器中为控制器分配前置或者后置过滤器。给所有请求附加过滤器:$
43、this-filter(before,auth);在这个例子中,auth过滤器会运行在所有控制器方法之前。我们可以在application/routes.php文件中找到auth过滤器。它是用来验证用户是否登录,如果没有就会重定向到login。给少数控制器附加过滤器:$this-filter(before,auth)-only(array(index,list);在这个例子中auth过滤器会在action_index()和action_list()方法前运行,用户必须登录才能访问这些页面。但是该控制器中的其他方法不会触发身份验证。给多数控制器附加过滤器:$this-filter(before,
44、auth)-except(array(add,posts);在前一个例子当中,过滤器只会运行在指定的控制器方法之前。而在这个例子中,我们声明的是不需要过滤的控制器方法。为POST请求附加过滤器:$this-filter(before,csrf)-on(post);在这个例子中我给POST请求附加了一个csrf过滤器。csrf过滤器主要是用来过滤来自其他系统的posts(比如传说中的spam机器人)。Larvel框架自带了这个过滤器,你可以在application/routes.php文件中找到它。进阶阅读: 路由过滤器嵌套控制器控制器可以存放在application/controllers目录
45、的任意层次的子目录中。创建一个控制器controllers/admin/panel.php,代码如下:classAdmin_Panel_ControllerextendsBase_Controller publicfunctionaction_index() /在路由中用.号来注册嵌套控制器:Route:controller(admin.panel);注: 当使用嵌套控制器的时候,控制器的注册顺序总是按目录的层次从深到浅。访问控制器的index方法:http:/localhost/admin/panel控制器布局控制器布局的完整文档请阅读模板文档.REST风格控制器除了使用“action_“前
46、缀之外,我们还可以使用HTTP请求类型来作为控制器方法的前缀。为控制添加REST风格属性:classHome_ControllerextendsBase_Controller public$restful=true;建立REST风格的控制器方法:classHome_ControllerextendsBase_Controller public$restful=true;publicfunctionget_index() /publicfunctionpost_index() /在我们建立CRUD方法的时候这种风格非常的友好。依赖注入如果你正在编写可测试的代码,你可能会想在你的控制器构造使用依赖
47、注入。这非常简单,只需要在IoC容器中注册你的控制器即可。在注册控制器时,需要使用controller前缀,因此在application/start.php文件中,我们可以像下面这样注册控制器:IoC:register(controller:user,function() returnnewUser_Controller;);当控制器接收请求时,Laravel框架会自动检测控制器在容器中是否注册,如果已注册,那么将会生成一个控制器实例。注: 在使用控制器的依赖注入前,你应该阅读IoC容器文档。控制器工厂如果你想更好的控制控制器实例,那么你就需要是使用Laravel提供的控制器工厂。为控制器实例
48、注册一个事件:Event:listen(Controller:factory,function($controller) returnnew$controller;);这个事件会接收需要实例化的类名,然后返回给你一个控制器实例。模型与类库目录 模型 类库 自动加载 最佳实践模型模型是应用程序的核心部分,应用逻辑(控制器/路由)和视图都是用户与模型进行交互的媒介。模型中最典型的逻辑是商业逻辑。下面是模型中常见的功能: 数据库交互 文件 I/O 服务器交互例如,可能你正在写一个博客程序,那么你就需要一个“post“模型。如果允许用户评论的话,你还需要一个“comment“模型和“User“模型。类库类库是框架中能够实现某种功能但是不属于某个具体应用的类的集合。例如PDF生成类可以转换HTML文件,它的功能相对复杂,并且可以独立于应用程序之外,我们就可以把它放到“library“(类库)里。创建一个库类和创建普通的类一样容易,只需要把它放到libraries文件夹中。举个例子,下面我们将创建一个简单的库类