宝哥软件园

Laravel 4初级教程的视图、名称空间、路由

编辑:宝哥软件园 来源:互联网 时间:2021-09-09

1.视图分离和嵌套

在learnlaravel文件夹下运行命令:

PHP artisan生成: viewadmin。_ layouts.default此时,生成器插件帮助我们创建了app/view/admin/_ layouts/default . blade . PHP文件,并对内容进行了如下修改:

!doctype html html head meta charset=' utf-8 ' title learn Laravel 4/title @ include(' admin。_ partials . assets))/headdydiv class=' container ' div class=' nav bar nav bar-inverse nav bar-fixed-top ' div class=' nav bar-inner ' div class=' container ' a class=' brand ' href=' { { URL : route(' admin。pages . index ')} } ' learn lave l4/a @ include(' admin。_ parts . navigation ')/div/div/div HR @ yield(' main ')/div/body/html这是MVC中的视图文件视图需要仔细解释。

视图文件夹是一个视图文件夹,视图文件夹可以嵌套。就像上面一样,创建了admin/_layout嵌套文件夹,并在其中创建了一个名为default.blade.php的文件。然后,当我们将来在Laravel的任何地方使用这个视图时,它将被称为admin。_布局。默认值

我们可以看到上面代码的第七行是“@ include ('admin。_零件。assets ')”,这意味着根据我们上面刚刚学到的知识加载另一个文件。Blade是Laravel的模板引擎,@include在这里意味着直接引入该文件的所有代码,并将其放在这里成为当前视图的一部分。

注意第25行的“@yield('main ')”。这是什么意思?这有点复杂。我们以后再谈。

2.权限验证

Laravel支持标准的HTTP认证,但是在这里我们需要构建一个博客系统,所以我们将编写一个完善的管理员登录系统并从页面登录。

使用命令行创建app/view/admin/auth/log in . blade . PHP文件。代码如下:

@extends('admin。_ layouts . default())@ section(' main ')div id=' log in ' class=' log in ' { { form : open()} } @ if($ errors-has(' log in '))div class=' alert-errors ' { $ errors-first(' log in ',' : message ')} }/div @ endif div class=' control-group ' { form 3360: label(' Email ',' Email ')} } div class=' controls ' { form 3:3333333

@ extends ('admin。_ layouts . default ')@ section(' main ')这是什么意思?实际上,在将来,我们将知道当在控制器中调用视图时,只调用这个login.blade.php文件。第一行表示该视图是admin的子视图。_layouts.default此时,刀片引擎也将加载此视图。怎么组装?这时,下面的@section('main ')应该会出现,它所包装的代码将直接放入admin中的@yield('main ')中。_layouts.default Section和yield可以任意匹配,只要两个视图之间存在调用关系,就可以这样使用,非常灵活。

这里你可能会有一个问题,为什么示例代码中有这么多空行?这是个人经历。编译视图时,将定期处理刀片引擎的所有标签。引擎本身有一个问题,不是bug,就是换行符会被处理,导致前后行和这一行被紧紧挤压在一起。在前端浏览器中查看源代码时,并不清楚。前后加空行可以解决这个问题。当然,这可能是一个自动的“压缩”功能,将不再深入讨论。

添加控制器文件app/controllers/admin/authcontroller . PHP,然后有人说,我知道了,哈哈,跑

PHP artisan generate : controller admin。AuthController "

这个想法是正确的,但是你能运行它吗?会直接创建一个“管理员。app/controller目录中的“AuthController.php”文件,有人说,我就用“admin/AuthController”作为总公司,请试试。甚至没有。因此,我们需要先在app/controllers中手动创建admin文件夹,然后在命令行中输入:

PHP artisan生成:控制器管理员/授权控制器。接下来,把AuthController.php的内容改写如下:

?phpnamespace应用程序控制器管理员;使用授权、基本控制器、表单、输入、重定向、哨兵、视图;Class auth controller扩展基控制器{/* * *显示登录页面* @ return view */public function getlog in(){ return view :3360 make(' admin . auth . log in ');} /** * POST登录验证* @ return redirect */public function POST log in(){ $ credentials=array(' email '=input 33603360 get(' email '),' password '=input 33603360 get(' password ');尝试{ $ user=sentry : authenticate($ credentials,false);if($ user){ return redirect :3360 route(' admin . pages . index ');} } catch( Exception $ e){ return redirect : route(' admin . log in ')-with errors(array(' log in '=$ e-getMessage()));} }/* * * logout * @ return redirect */public function getlogout(){ sentry :3360 log out();返回redirect :3360 route(' admin . log in ');}}这是我们登录和注销的控制器,MVC中的C。接下来,我将解释命名空间,这是Laravel或composer的基础。是整个Laravel教程的重点和难点。我希望你小心点,不要放过任何你不懂的东西。你可以在phphub论坛或golaravel论坛的相应帖子下提问,也可以直接发帖提问。

让我们首先观察这个文件的位置,它位于应用程序/控制器/管理目录中。有什么区别?在其他框架中,比如CI,虽然最多只有一层,但是可以通过直接添加文件夹名称来直接调用子文件夹。另一方面,Laravel并没有那么简单,它涉及到PHP的命名空间。

1.composer支持PSR-0和PSR-4标准,这两个标准规定PHP包通过名称空间进行区分,并向外界提供服务。所有公开的类都应该在 author name package name命名空间中,例如luiMFFCMail类。这样,即使是同名的包,只要是不同的作者,都可以在https://packagist.org/共存,供大家使用。

2.命名空间可以类比为Linux系统中的一个目录。在任何目录下,当前目录下的所有文件和可执行程序都可以通过文件名直接打开。如果需要打开其他目录中的文件,需要使用绝对路径或相对路径。

3.您可能在许多其他教程中看到过,控制器头中没有namesapce声明,在那个堆中也没有使用xxx,比如这个文件https://github.com/cecoo/laravel 4 demo/blob/master/app/controllers/Blog controller . PHP,这个文件直接使用第8行的Blog类。为什么呢?

因为它们都被声明为自动加载到composer应用程序的配置文件中,并且它们没有在顶部声明它们的命名空间,这将被自动添加为顶级命名空间。这个配置文件是composer.json,对象配置项是自动加载下的classmap项。此声明将使Composer在生成自动加载文件时自动扫描文件中的所有类和子文件夹中的所有类。只要没有声明特定的命名空间,它就会被自动加载为顶级空间。【前面的说法不正确,请指正!】

有关名称空间的更多详细信息,请参考PHP名称空间简介。

好了,到目前为止我们的MVC三要素已经收集好了,那么接下来我们应该怎么做呢?配置路由。这里的路由不是家里用的无线路由:-D,而是用户请求的URL到控制器某个方法的转换。函数是PHP中代码段的最小单位,所以用户请求的一个路径,比如http://ooxx.com/fuck/me,会在这个URL被调用到路由后被解析,应该调用哪个函数,最后结果会返回给用户。

Laravel的路由结果通过闭包返回,在app/routes.php中增加了以下内容:

route : get(' Admin/注销',数组(' as'='admin .注销',' uses '=' App Controllers Admin [email protected]');route : get(' Admin/log in ',array('as'='admin.login ',' uses '=' App Controllers Admin [email protected]');route : post(' Admin/log in ',array('as'='admin.login.post ',' uses '=' App Controllers Admin [email protected]'));Route:group(数组('前缀'='admin ','之前'='auth.admin '),function(){ route 3360: any('/',' App Controllers Admin [email protected]');Route:resource('文章','应用程序控制器管理文章控制器');Route:resource('pages ',' App controller Admin pages controller ');});前三项意味着保存两个get请求和一个post请求。下面是一个路由组,它指定了一个前缀admin并添加了一个过滤器auth.admin有一个“/”路径可以适应同时获取和发布请求,它的完整路径是http://ooxx.com/admin/.剩下的两个资源控制器本质上只是简写,控制器类中URL和方法名的对应表显示在资源控制器中。

上面提到的过滤器auth.admin是由Laravel提供的一个请求过滤器。这个文件在路由文件的旁边,app/filters.php Add:

route : filter(' auth . admin ',function(){if(!sentry : CheCk()){ return redirect :3360 route(' admin . log in ');}});这就完成了我们的授权验证。上面的代码意味着在进入该路由组中的任何路由之前,auth.admin过滤器将被传递一次,并且该过滤器将调用Sentry:check()。如果为假,它将进入if代码块,并将用户的请求跳转到命名路由“admin.login”并命名路由文档。从这条命名路线的名字,大家都能看出来是在对访客说:笨蛋,你在干什么,登录~

这里的“命名路由”功能旨在模仿Ruby On Rails的“link_to”到对象路由绑定功能。但是PHP上传意味着没有守护进程的部署,这让我们无法像Rails一样维护一个全代码的路由表,实现资源路由-资源对象-路由调用的绑定功能,只创建一个名为routing的半成品,人为解决了调整/人到/人时改名字的问题。

这时,我们可以试着参观我们的项目。建议配置Apache将一个端口指向项目learnlaravel的公共目录,即通过http://127.0.0.133608080等地址访问项目,不建议从子文件夹访问。如果你不能,你可以运行它

Php artisan serve启动PHP5.4的内置HTTP服务器,地址为http://localhost:8000。请注意,这里无法访问127.0.0.1。

接下来,我们在浏览器中访问/admin,并注意到URL将自动跳转到/admin/login,这表明我们的过滤器工作正常,但您可能会看到以下页面

这表明代码是错误的。接下来,我们修改app/config/app.php的第一项如下:

Debug'=true,刷新页面,出现错误提示!你觉得Laravel4.2的错误提示很好吗?确实不错,但是我觉得还不如4.1之前的:-D。我得到了以下错误:

说“app controllers admin auth controller”找不到,为什么?这份文件显然是存在的。

这就涉及到另一个问题,Laravel中的自动加载问题。Laravel是基于命名空间的,它只会自动加载顶层命名空间中的所有类,也就是说我们新添加的控制器类不在顶层命名空间下,所以我们需要告诉Laravel这个类是存在的。怎么说呢?奔跑

作曲家转储-自动加载是可以的,刷新页面,他告诉我

查看[管理员。_partials.assets]未找到。

这是真的。我们尚未创建此文档。只需创建一个空文件。如果它是用生成器构建的,不要忘记删除其中的默认内容。再次刷新页面。如果有问题,我相信你可以自己解决。

好了,一个难看的页面出现了。为什么这么丑?鸽子为什么这么大?)因为我们没有引入任何css和js文件,甚至导航栏的html都是不完整的。没关系,过来按照我github上的代码复制到对应的文件。此外,将我的项目中公共文件下的js和css文件夹完全复制到您的公共文件夹中非常重要。

再次刷新,如果看到下面的页面,说明你成功了!

3.尝试登录

添加一个带种子的管理员,顺便添加一个管理员组。用以下内容创建一个新的app/database/seeds/sentryseeder . PHP:

?phpclass SentrySeeder扩展了播种机{ public function run(){ db : table(' users ')-delete();db : table(' group ')-delete();db : table(' users _ group ')-delete();sentry :3360 getuser provider()-create(array(' email '='[email protected]',' password'='ooxx ',' first_name'='OO ',' last_name'='XX ',' activated'=1,);sentry : getgroup provider()-create(array(' name '=' Admin ',' permissions'=['admin'=1],));//将用户添加到用户组$ admin user=sentry :3360 geturprovider()-findbylogin(' email protected ');$ adminGroup=sentry :3360 getgroup provider()-findByName(' Admin ');$ adminUser-addGrouP($ adminGrouP);}}在app/database/seeds/database播种机. php中添加新行:

$ this-call(' SentrySeeder ');然后运行:

在php artisan db:seed成功播种后,您会发现用户、组和users _ groups表中添加了一个新行。但是,文章和页面表也分别增加了10行。是的,种子是如此愚蠢

让我们尝试登录!如果你得到:

类别应用程序控制器管理页面控制器不存在

这说明你成功了!

更多资讯
游戏推荐
更多+