《[计算机软件及应用]Laravel入门中文手册.doc》由会员分享,可在线阅读,更多相关《[计算机软件及应用]Laravel入门中文手册.doc(113页珍藏版)》请在三一办公上搜索。
1、Laravel中文手册前言欢迎阅读Laravel文档。这份文档既可以作为入门指南,也可以作为Laravel功能特色的参考手册。如果你迫不及待想要开始Laravel之旅的话,可以直接跳到你想看的章节,不过,我们还是强烈建议你按顺序阅读这份文档,这样能让你循序渐进的打好基础,而且,每一章节都是后后续章节的基础。使用Laravel将是一种享受!Laravel是一套功能强大的PHP开发框架,并且着重于灵活性和语法的表现力。对于初学者,Laravel像其他流行、轻量级框架一样易学、易用;对于经验丰富的同学,Laravel能让你体验代码模块化的好处。Laravel的灵活性能让你随心所欲的更新、重构你用应用
2、;Laravel富于表现力的语法能让你或你的团队的代码简洁、容易阅读。Laravel优于其它PHP框架Laravel在很多方面优于其它框架,以下列出的就是其中的一部分: Bundle是Laravel的扩展包组织形式或称呼。Laravel的扩展包仓库已经相当成熟了,可以很容易的帮你把扩展包(bundle)安装到你的应用中。你可以选择下载一个扩展包(bundle)然后拷贝到bundles目录,或者通过命令行工具“Artisan”自动安装。 在Laravel中已经具有了一套高级的PHP ActiveRecord实现 - Eloquent ORM。它能方便的将“约束(constraints)”应用到关
3、系的双方,这样你就具有了对数据的完全控制,而且享受到ActiveRecord的所有便利。Eloquent原生支持Fluent中查询构造器(query-builder)的所有方法。 应用逻辑(Application Logic)可以在控制器(controllers)中实现,也可以直接集成到路由(route)声明中,并且语法和Sinatra框架类似。Laravel的设计理念是:给开发者以最大的灵活性,既能创建非常小的网站也能构建大型的企业应用。 反向路由(Reverse Routing)赋予你通过路由(routes)名称创建链接(URI)的能力。只需使用路由名称(route name),Larav
4、el就会自动帮你创建正确的URI。这样你就可以随时改变你的路由(routes),Laravel会帮你自动更新所有相关的链接。 Restful控制器(Restful Controllers)是一项区分GET和POST请求逻辑的可选方式。比如在一个用户登陆逻辑中,你声明了一个get_login()的动作(action)来处理获取登陆页面的服务;同时也声明了一个post_login()动作(action)来校验表单POST过来的数据,并且在验证之后,做出重新转向(redirect)到登陆页面还是转向控制台的决定。 自动加载类(Class Auto-loading)简化了类(class)的加载工作,以
5、后就可以不用去维护自动加载配置表和非必须的组件加载工作了。当你想加载任何库(library)或模型(model)时,立即使用就行了,Laravel会自动帮你加载需要的文件。 视图组装器(View Composers)本质上就是一段代码,这段代码在视图(View)加载时会自动执行。最好的例子就是博客中的侧边随机文章推荐,“视图组装器”中包含了加载随机文章推荐的逻辑,这样,你只需要加载内容区域的视图(view)就行了,其它的事情Laravel会帮你自动完成。 反向控制容器(IoC container)提供了生成新对象、随时实例化对象、访问单例(singleton)对象的便捷方式。反向控制(IoC)
6、意味着你几乎不需要特意去加载外部的库(libraries),就可以在代码中的任意位置访问这些对象,并且不需要忍受繁杂、冗余的代码结构。 迁移(Migrations)就像是版本控制(version control)工具,不过,它管理的是数据库范式,并且直接集成在了Laravel中。你可以使用“Artisan”命令行工具生成、执行“迁移”指令。当你的小组成员改变了数据库范式的时候,你就可以轻松的通过版本控制工具更新当前工程,然后执行“迁移指令即可,好了,你的数据库已经是最新的了! 单元测试(Unit-Testing)是Laravel中很重要的部分。Laravel自身就包含数以百计的测试用例,以保障
7、任何一处的修改不会影响其它部分的功能,这就是为什么在业内Laravel被认为是最稳版本的原因之一。Laravel也提供了方便的功能,让你自己的代码容易的进行单元测试。通过Artisan命令行工具就可以运行所有的测试用例。 自动分页(Automatic Pagination)功能避免了在你的业务逻辑中混入大量无关分页配置代码。方便的是不需要记住当前页,只要从数据库中获取总的条目数量,然后使用limit/offset获取选定的数据,最后调用paginate方法,让Laravel将各页链接输出到指定的视图(View)中即可,Laravel会替你自动完成所有工作。Laravel的自动分页系统被设计为容
8、易实现、易于修改。虽然Laravel可以自动处理这些工作,但是不要忘了调用相应方法和手动配置分页系统哦!上面提到的只是Laravel优于其它框架的几点。在这份文档中包含了Laravel所有的特性和更多优点。安装与设置目录 要求 安装 服务器配置 基本设置 环境设置 友好的链接安装要求 Apache, nginx, 或者其他web服务器。 Laravel 框架应用了很多PHP 5.3版才具备的强大的新特性,所以你必须安装PHP5.3或者以上版本。 Laravel 使用FileInfo库来检测mime类型。PHP 5.3版已经默认包含了FileInfo库。Windows用户需要在php.ini中启
9、用该模块。关于FileInfo库的更多信息请阅读:installation / configuration details on PHP.net。 Laravel 使用Mcrypt库 来加密和生成哈希。PHP 5.3已经预装了Mcrypt库。如果你在phpinfo()中没有找到Mcrypt已经启用的信息,请检查你的服务器环境是否安装完全,或者查看PHP手册中 Mcrypt库有关信息。安装1 下载 Laravel2 解压Laravel压缩包,然后上传文件到你的web服务器。3 在config/application.php中设置application key,你可以设置为任意的32位字符串。4
10、确保storage/views目录具有写入权限。5 现在你可以尝试在浏览器中运行框架。如果不出意外,你应该看到了Laravel漂亮的初始页面。一切准备就绪,我们可以继续Laravel学习之旅!选装程序如果你想充分了解和学习Laravel框架的应用,推荐你安装以下程序: SQLite, MySQL, PostgreSQL, 或者 SQL Server PDO driver. Memcached 或者 APC.安装遇到问题?如果你在安装过程中遇到了问题,可以检查以下情况: 请确保public文件夹是服务器的根目录,如果不是,你可以尝试访问Laravel的public文件夹,如http:localh
11、ost/public/。 如果你启用了mod_rewrite拓展,请把application/config/application.php文件中的index参数设置为空。 请确保服务器的storage目录及其子目录具有写入权限。服务器配置就像大部分的web开发框架一样,Laravel的设计也考虑了代码和存储安全的问题,Laravel框架只把允许公众访问的文件放在web服务器的根目录(DocumentRoot),这样可以有效的防止因为服务器的设置错误而泄露重要的代码和信息资料。稳定压倒一切!下面的案例中,我们假定把Laravel安装到 /Users/JonSnow/Sites/MySite 目录
12、。这对MySite的Apache虚拟主机的基本配置如下: DocumentRoot /Users/JonSnow/Sites/MySite/public ServerName mysite.dev注意,虽然安装目录是 /Users/JonSnow/Sites/MySite ,但是DocumentRoot配置项必须指向 /Users/JonSnow/Sites/MySite/public 目录。将DocumentRoot指向public目录是一条通用的最佳实践方法,但是某些主机是不允许改变DocumentRoot配置的,没关系,人民的力量是无穷无尽的,Laravel论坛里收集了一系列有用的方法。
13、基本设置Laravel框架的所有配置文件都存放在应用程序的config文件夹中,建议你把所有的配置文件都看一下,对应用程序的设置可以有一个基本的了解。你应该注意一下application/config/application.php文件,它包含了应用程序的基本设置。在开发或者启用网站之前,你应该首先修改application/config/application.php中的application key。Laravel会用它来加密或者生成哈希。你可以手动设置一个32位的随机字符串,也可以使用Laravel提供的Artisan命令行工具来生成一个符合标准的字符串。有关Aartisan工具的信息可
14、以访问 Artisan命令列表。注意: 如果你启用了mod_rewrite,你应该把index参数设置为空。环境设置通常情况下,应用程序的开发环境和正式生产环境的设置是不同的,Laravel使用的URL机制可以让你轻而易举的解决这个问题。打开Laravel框架的安装目录下的 paths.php 文件,你可以看到下面的数组:$environments = array( local = array(http:/localhost*, *.dev),);这个数组表示任何以localhost开头或者以*.dev结尾的请求,都被视为local环境。然后,建立application/config/loca
15、l文件夹,那么local文件夹下面的任何设置都会覆盖application/config中的基本设置。举个例子,你希望在新建的local目录中创建一个application.php文件:return array( url = http:/localhost/laravel/public,);在这个例子中,local中的URL设置会覆盖application/config/application.php文件中的URL设置。需要注意的是,你只需要指定那些你想要覆盖的设置。Laravel的环境设置就是这么简单,你可以用它来创建你需要的环境。友好的链接通常情况下,你不想index.php出现在网站的链
16、接中,那么你可以用rewrite重定向来去掉index.php。如果你使用的是Apache服务器,请启用mod_rewrite模块,然后在你的public目录创建一个.htaccess文件,内容如下: RewriteEngine on RewriteCond %REQUEST_FILENAME !-f RewriteCond %REQUEST_FILENAME !-d RewriteRule (.*)$ index.php/$1 L如果上面的.htaccess文件没有效果,可以试试下面的写法:Options +FollowSymLinksRewriteEngine onRewriteCond
17、%REQUEST_FILENAME !-fRewriteCond %REQUEST_FILENAME !-dRewriteRule . index.php L在设置了重定向之后,你还应该把application/config/application.php中的index参数设置为空。注意: 不同服务器的rewrite方法有所不同,请根据具体情况配置。路由目录 基础 通配符(Wildcards) 404事件(The 404 Event) 过滤器(Filters) 模式过滤器(Pattern Filters) 全局过滤器(Global Filters) 路由组(Route Groups) 命名路由
18、(Named Routes) HTTPS路由(HTTPS Routes) 扩展包路由(Bundle Routes) 控制器路由(Controller Routing) 命令行路由测试(CLI Route Testing)基础Laravel充分利用PHP 5.3的特性,使路由变得简单并富于表达性。这使得从构建API到完整的web应用都变得尽可能容易。路由的实现代码在 application/routes.php 文件。和其它框架不同,应用逻辑在Laravel中可以通过两种方式集成。虽然在控制器(controllers)中实现业务逻辑是普遍的做法,但是在Laravel中也可以直接在路由中嵌入应用逻
19、辑。这种方式尤其适用于只有几个页面的小型网站,这样就免去了创建一大堆控制器(controllers),还要为每个控制器创建一些不相干的方法(methods),而最后只是一部分方法(methods)通过手动设置路由的方式被暴露出来。在下面的代码示例中,第一个参数(parameter)是你“注册”的路由(route),第二个参数是这个路由将要触发的函数(function),函数中包含了应用逻辑。定义路由时不需要开头的斜线(front-slash),唯一的例外是默认路由(default route)只包含一个斜线(front-slash)。注意: 路由的权重在于其被注册的先后顺序。 因此,任何通配(
20、catch-all)的路由应该在 routes.php 文件的底部注册注册一个响应 GET / 的路由:Route:get(/, function() return Hello World!;);注册一个能同时响应(GET、POST、PUT、DELETE)HTTP请求方法(HTTP verbs)的路由:Route:any(/, function() return Hello World!;);注册响应其它HTTP请求方法(HTTP verbs)的路由:Route:post(user, function() /);Route:put(user/(:num), function($id) /);R
21、oute:delete(user/(:num), function($id) /);注册一个能响应多个HTTP请求方法(HTTP verbs)的路径(URI):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(pag
22、e/(:any?), function($page = index) /);404事件(The 404 Event)如果一个请求(request)不能匹配任何一个路由,404事件将被触发。在 application/routes.php 文件中可以找到默认的事件处理代码。默认的404事件处理代码Event:listen(404, function() return Response:error(404););你可以按照你自己的需求定制这部分代码!延伸阅读: 事件(Events)过滤器(Filters)过滤器(filters)可以在路由之前或之后触发。如果在路由之前触发的过滤器(filters)
23、有返回值,那么这个返回值将被认为是对此次请求(request)的回应(response),路由将停止执行。这一特性便于实现身份验证之类的功能。在 application/routes.php 文件中定义了所有过滤器(filters)。注册一个过滤器(filter):Route:filter(filter, function() return Redirect:to(home););绑定一个过滤器(filter)到路由:Route:get(blocked, array(before = filter, function() return View:make(blocked););给路由绑定一个之
24、后(after)执行的过滤器(filter):Route:get(download, array(after = log, function() /);绑定多个过滤器(filters)到路由:Route:get(create, array(before = auth|csrf, function() /);给过滤器(filters)传递参数:Route:get(panel, array(before = role:admin, function() /);模式过滤器(Pattern Filters)有时你可能需要针对所有包含部分路径(URI)的请求(request)绑定一个过滤器(filter
25、),例如,你想对以“admin”开头的路径(URI)绑定一个叫”auth“的过滤器(filter),以下代码就是具体实现:wD定义一个基于路径模式(URI pattern)的过滤器(filter):Route:filter(pattern: admin/*, auth);你也可以在为某个给定的路径(URI)绑定过滤器(filters)时直接提供一个带有名称(name)和回调函数(callback)的数组,这样,过滤器(filters)也就完成了注册。Defining a filter and URI pattern based filter in one:Route:filter(patter
26、n: admin/*, array(name = auth, function() / );全局过滤器(Global Filters)Laravel默认有两个过滤器(filters),他们分别在每次请求(request)之前(before)和之后(after)执行。你可以在 application/routes.php 文件中找到这两个过滤器(filters)。这两个过滤器可以方便你启动通用扩展包(bundles)或者添加全局资源(assets)。注意: 之后(after) 过滤器接收到的参数是对应当前请求(request)的 回应(Response) 对象。路由组(Route Groups)
27、路由组方便你为一组路由绑定一些属性(attributes),从而保持代码的整洁。Route:group(array(before = auth), function() Route:get(panel, function() / ); Route:get(dashboard, function() / ););命名路由(Named Routes)总是会有修改路由的时候,这就会让写死的路径(URI)产生错误。给路由赋予一个名称(name)可以方便通过这个名称(name)动态生成路径(URI),即便以后路由变化了,路径(URI)仍然和你新的路由保持一致。定义一个命名路由:Route:get(/,
28、array(as = home, function() return Hello World;);通过命名路由生成URL:$url = URL:to_route(home);重定向到命名路由:return Redirect:to_route(home);对于一个命名路由,可以方便反查当前请求(request)是否是由这个命名路由在处理。反查处理当前请求(request)的路由是否具有给定的名称(name):if (Request:route()-is(home) / 名称为”home“的路由正在处理当前请求(request)!HTTPS路由(HTTPS Routes)定义路由时,可以通过使用”
29、https“参数指定所生成的URL(或重定向时)采用HTTPS协议。定义一个HTTPS路由:Route:get(login, array(https = true, function() return View:make(login););使用”secure“函数完成同样的事情:Route:secure(GET, login, function() return View:make(login););扩展包路由(Bundle Routes)扩展包(bundle)是Laravel的模块化扩展系统。可以通过配置扩展包,方便的处理请求(request)。这里是扩展包的详细介绍,此处略过。 通过此段介
30、绍,你会认识到扩展包不仅可以通过路由(route)暴露功能,还可以在扩展包中注册路由。打开 application/bundles.php 文件,添加以下代码:注册扩展包,处理相应的路由:return array( admin = array(handles = admin),);注意到代码中的 handles 参数了吗? 这告诉Laravel加载Admin扩展包并处理任何以“admin”开头的路径(URI)。现在准备为你的扩展包注册几个路由吧,在你的扩展包的根目录创建 routes.php 文件,并添加以下代码:给扩展包添加一个根路由(root route):Route:get(:bundl
31、e), function() return Welcome to the Admin bundle!;);我们来解析一下这段代码。 注意到 (:bundle) 了吗? 它将被替换为前面注册扩展包时的 handles 参数的值。这使你的代码保持D.R.Y. - 不重复,还能让使用你的代码的开发者随意修改扩展包的根(root)URI而不破快扩展包中定义的路由!当然,你可以在扩展包中的所有路由上使用 (:bundle) 占位符,而不仅仅是跟路由(root route)。注册扩展包路由:Route:get(:bundle)/panel, function() return I handle reque
32、sts to admin/panel!;);控制器路由(Controller Routing)Controllers provide another way to manage your application logic. If youre unfamiliar with controllers you may want to read about controllers and return to this section.It is important to be aware that all routes in Laravel must be explicitly defined, i
33、ncluding routes to controllers. This means that controller methods that have not been exposed through route registration cannot be accessed. Its possible to automatically expose all methods within a controller using controller route registration. Controller route registrations are typically defined
34、in application/routes.php.Most likely, you just want to register all of the controllers in your applications controllers directory. You can do it in one simple statement. Heres how:Register all controllers for the application:Route:controller(Controller:detect();The Controller:detect method simply r
35、eturns an array of all of the controllers defined for the application.If you wish to automatically detect the controllers in a bundle, just pass the bundle name to the method. If no bundle is specified, the application folders controller directory will be searched.Register all controllers for the ad
36、min bundle:Route:controller(Controller:detect(admin);Registering the home controller with the Router:Route:controller(home);Registering several controllers with the router:Route:controller(array(dashboard.panel, admin);Once a controller is registered, you may access its methods using a simple URI co
37、nvention:http:/localhost/controller/method/argumentsThis convention is similar to that employed by CodeIgniter and other popular frameworks, where the first segment is the controller name, the second is the method, and the remaining segments are passed to the method as arguments. If no method segmen
38、t is present, the index method will be used.This routing convention may not be desirable for every situation, so you may also explicitly route URIs to controller actions using a simple, intuitive syntax.Registering a route that points to a controller action:Route:get(welcome, homeindex);Registering
39、a filtered route that points to a controller action:Route:get(welcome, array(after = log, uses = homeindex);Registering a named route that points to a controller action:Route:get(welcome, array(as = home.welcome, uses = homeindex);命令行路由测试(CLI Route Testing)可以用Laravel自带的“Artisan”命令行工具测试你的路由,只需指定请求方法(
40、request method)和需要测试的URI,所有返回的响应(response)都会通过var_dump函数输出到命令行上。通过Artisan命令行工具调用路由:php artisan route:call get api/user/1控制器目录 基础 控制器路由 插件控制器 行动过滤器 嵌套控制器 控制器布局 REST风格控制器 依赖注入 控制器工厂基础控制器是负责处理用户输入和管理模块、库与视图之间交互的类。通常情况下,控制器会向模块请求数据,然后把数据传递给视图,最后返回给用户。在程序开发中控制器通常被用来实现应用逻辑。Laravel框架还允许开发者在路由中声明应用逻辑,这部分会在路
41、由文档中详细说明。但是我们鼓励新手仍然从控制器开始。在处理应用逻辑方面,控制器和路由没有什么不同。控制器类都应该存放在application/controllers目录中,并且都继承于Base_Controller类。Laravel框架默认自带了一个Home_Controller类。创建一个简单的控制器:class Admin_Controller extends Base_Controller public function action_index() / Actions是允许被访问的控制器方法,它们都应该以action_为前缀,除此以外的其他方法都是禁止访问的。注: Base_Contr
42、oller类继承于Laravel框架的Controller类。控制器路由需要我们注意到是,在Laragel框架中所有的路由(包括控制器路由)都必须明确定义。这意味着没有在路由中注册的控制器方法都是不可见的。使用控制器路由注册之后,控制器方法会自动接受访问。控制器路由的注册信息通常定义在application/routes.php文件中。访问the routing page获取更多关于控制器路由的信息。.插件控制器插件包是Laravel框架的模块化管理系统。插件包可以非常容易的配置应用的处理请求。这部分我们将在插件包文档中作进一步了解。创建插件包控制器的方法和创建应用控制器一样,只需要在控制器名
43、前加上插件包名作为前缀。比如你的插件包名字叫admin,那么插件包控制器可以这样写:创建插件控制器:class Admin_Home_Controller extends Base_Controller public function action_index() return Hello Admin!; 但是我们怎么用路由来注册插件控制器呢?其实也非常简单:在路由中注册插件控制器:Route:controller(admin:home);现在我们就可以在浏览器中访问admin插件包的home控制器了。注: 在Laravel框架中,我们使用双冒号来表示插件包,插件包更多信息可以阅读插件包文档。
44、行动过滤器行动过滤器可以运行在控制方法之前,也可以在控制器方法之后.在Laravel框架中你不仅可以为控制器分配过滤器,同时还可以决定何种HTTP请求会触发过滤器。你可以在控制器构造器中为控制器分配前置或者后置过滤器。给所有请求附加过滤器:$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, auth)-except(array(add, posts);在前一个例子当中,过滤器只会运行在指定的控制器方法之前。而在这个例子中,我们声明的是不需要过滤的控制器方法。为POST请求附加过滤器:$this-filter(bef