laravel简介
来源:互联网 发布:淘宝内衣拍照现场视频 编辑:程序博客网 时间:2024/05/21 03:27
1、简介
Laravel 应用默认的目录结构试图为不管是大型应用还是小型应用提供一个好的起点,当然,你可以自己按照喜好重新组织应用目录结构,Laravel 对类在何处被加载没有任何限制——只要 Composer 可以自动载入它们即可。
Models目录在哪里?
许多初学者都会困惑Laravel为什么没有models
目录,我可以负责任的告诉大家,这是故意的。因为models
这个词对不同人而言有不同的含义,容易造成歧义,有些开发者认为应用的模型指的是业务逻辑,另外一些人则认为模型指的是与关联数据库的交互。
正是因为这个原因,我们默认将Eloquent的模型直接放置到app
目录下,从而允许开发者自行选择放置的位置,关注我的博客,larave详解,会告诉你的;
2、根目录
App目录
app
目录包含了应用的核心代码,此外你为应用编写的代码绝大多数也会放到这里;
Bootstrap目录
bootstrap
目录包含了少许文件,用于框架的启动和自动载入配置,还有一个cache
文件夹用于包含框架为提升性能所生成的文件,如路由和服务缓存文件;
Config目录
config
目录包含了应用所有的配置文件,建议通读一遍这些配置文件以便熟悉所有配置项;
Database目录
database
目录包含了数据迁移及填充文件,如果你喜欢的话还可以将其作为 SQLite 数据库存放目录;
Public目录
public
目录包含了入口文件index.php
和前端资源文件(图片、JavaScript、CSS等);
Resources目录
resources
目录包含了视图文件及原生资源文件(LESS、SASS、CoffeeScript),以及本地化文件;
Routes目录
routes
目录包含了应用的所有路由定义。Laravel默认提供了三个路由文件:web.php
、api.php
和console.php
。
web.php
文件包含的路由都会应用web中间件组,具备Session、CSRF防护以及Cookie加密功能,如果应用无需提供无状态的、RESTful风格的API,所有路由都会定义在web.php
文件。
api.php
文件包含的路由应用了api
中间件组,具备频率限制功能,这些路由是无状态的,所以请求通过这些路由进入应用需要通过token进行认证并且不能访问Session状态。
console.php
文件用于定义所有基于闭包的控制台命令,每个闭包都被绑定到一个控制台命令并且允许与命令行IO方法进行交互,尽管这个文件并不定义HTTP路由,但是它定义了基于控制台的应用入口(路由)。
Storage目录
storage
目录包含了编译过的Blade模板、基于文件的session、文件缓存,以及其它由框架生成的文件,该目录被细分为成app
、framework
和logs
子母录,app
目录用于存放应用要使用的文件,framework
目录用于存放框架生成的文件和缓存,最后,logs
目录包含应用的日志文件;
storage/app/public
目录用于存储用户生成的文件,比如可以被公开访问的用户头像,要达到被访问的目的,你还需要在public
目录下生成一个软连接storage
指向这个目录。你可以通过php artisan storage:link
命令生成这个软链接。
Tests目录
tests
目录包含自动化测试,其中已经提供了一个开箱即用的PHPUnit示例;每一个测试类都要以 Test 开头,你可以通过phpunit
或php vendor/bin/phpunit
命令来运行测试。
Vendor目录
vendor
目录包含Composer依赖。
3、App目录
应用的核心代码位于app
目录下,默认情况下,该目录位于命名空间 App 下, 并且被 Composer 通过 PSR-4自动载入标准 自动加载。
app
目录下包含多个子目录,如Console
、Http
、Providers
等。Console
和Http
目录提供了进入应用核心的API,HTTP协议和CLI是和应用进行交互的两种机制,但实际上并不包含应用逻辑。换句话说,它们只是两个向应用发布命令的方式。Console
目录包含了所有的Artisan命令,Http
目录包含了控制器、中间件和请求等。
其他目录将会在你通过Artisan命令make生成相应类的时候生成到app
目录下。例如,app/Jobs
目录直到你执行make:job
命令生成任务类时才会出现在app
目录下。
注意:
app
目录中的很多类都可以通过Artisan命令生成,要查看所有有效的命令,可以在终端中运行php artisan list make
命令。
Console目录
Console
目录包含应用所有自定义的Artisan命令,这些命令类可以使用make:command
命令生成。该目录下还有console核心类,在这里可以注册自定义的Artisan命令以及定义调度任务。
Events目录
这个目录默认不存在,但是可以通过 event:generate
和 make:event
命令创建。该目录用于存放事件类。事件类用于告知应用其他部分某个事件发生并提供灵活的、解耦的处理机制。
Exceptions目录
Exceptions
目录包含应用的异常处理器,同时还是处理应用抛出的任何异常的好地方。如果你想要自定义异常如何记录异常或渲染,需要修改 Handler 类。
Http目录
Http
目录包含了控制器、中间件以及表单请求等,几乎所有进入应用的请求处理都在这里进行。
Jobs目录
该目录默认不存在,可以通过执行 make:job
命令生成,Jobs
目录用于存放队列任务,应用中的任务可以被队列化,也可以在当前请求生命周期内同步执行。同步执行的任务有时也被看作命令,因为它们实现了命令模式。
Listeners目录
这个目录默认不存在,可以通过执行 event:generate
和 make:listener
命令创建。Listeners
目录包含处理事件的类(事件监听器),事件监听器接收一个事件并提供对该事件发生后的响应逻辑,例如,UserRegistered
事件可以被SendWelcomeEmail
监听器处理。
Mail目录
这个目录默认不存在,但是可以通过执行 make:mail
命令生成,Mail
目录包含邮件发送类,邮件对象允许你在一个地方封装构建邮件所需的所有业务逻辑,然后使用Mail::send
方法发送邮件。
Notifications目录
这个目录默认不存在,你可以通过执行 make:notification
命令创建,Notifications
目录包含应用发送的所有通知,比如事件发生通知。Laravel的通知功能将通知发送和通知驱动解耦,你可以通过邮件,也可以通过Slack、短信或者数据库发送通知。
Policies目录
这个目录默认不存在,你可以通过执行 make:policy
命令来创建,Policies
目录包含了所有的授权策略类,策略用于判断某个用户是否有权限去访问指定资源。更多详情,请查看授权文档。
Providers目录
Providers
目录包含应用的所有服务提供者。服务提供者在启动应用过程中绑定服务到容器、注册事件以及执行其他任务以为即将到来的请求处理做准备。
在新安装的Laravel应用中,该目录已经包含了一些服务提供者,你可以按需添加自己的服务提供者到该目录。
技术特点
1、Bundle是Laravel的扩展包组织形式或称呼。Laravel的扩展包仓库已经相当成熟了,可以很容易的帮你把扩展包(bundle)安装到你的应用中。你可以选择下载一个扩展包(bundle)然后拷贝到bundles目录,或者通过命令行工具“Artisan”自动安装。
2、在Laravel中已经具有了一套高级的PHP ActiveRecord实现 -- Eloquent ORM。它能方便的将“约束(constraints)”应用到关系的双方,这样你就具有了对数据的完全控制,而且享受到ActiveRecord的所有便利。Eloquent原生支持Fluent中查询构造器(query-builder)的所有方法。
3、应用逻辑(Application Logic)可以在控制器(controllers)中实现,也可以直接集成到路由(route)声明中,并且语法和Sinatra框架类似。Laravel的设计理念是:给开发者以最大的灵活性,既能创建非常小的网站也能构建大型的企业应用。
4、反向路由(Reverse Routing)赋予你通过路由(routes)名称创建链接(URI)的能力。只需使用路由名称(route name),Laravel就会自动帮你创建正确的URI。这样你就可以随时改变你的路由(routes),Laravel会帮你自动更新所有相关的链接。
5、Restful控制器(Restful Controllers)是一项区分GET和POST请求逻辑的可选方式。比如在一个用户登陆逻辑中,你声明了一个get_login()的动作(action)来处理获取登陆页面的服务;同时也声明了一个post_login()动作(action)来校验表单POST过来的数据,并且在验证之后,做出重新转向(redirect)到登陆页面还是转向控制台的决定。
6、自动加载类(Class Auto-loading)简化了类(class)的加载工作,以后就可以不用去维护自动加载配置表和非必须的组件加载工作了。当你想加载任何库(library)或模型(model)时,立即使用就行了,Laravel会自动帮你加载需要的文件。
7、视图组装器(View Composers)本质上就是一段代码,这段代码在视图(View)加载时会自动执行。最好的例子就是博客中的侧边随机文章推荐,“视图组装器”中包含了加载随机文章推荐的逻辑,这样,你只需要加载内容区域的视图(view)就行了,其它的事情Laravel会帮你自动完成。
8、反向控制容器(IoC container)提供了生成新对象、随时实例化对象、访问单例(singleton)对象的便捷方式。反向控制(IoC)意味着你几乎不需要特意去加载外部的库(libraries),就可以在代码中的任意位置访问这些对象,并且不需要忍受繁杂、冗余的代码结构。
9、迁移(Migrations)就像是版本控制(version control)工具,不过,它管理的是数据库范式,并且直接集成在了Laravel中。你可以使用“Artisan”命令行工具生成、执行“迁移”指令。当你的小组成员改变了数据库范式的时候,你就可以轻松的通过版本控制工具更新当前工程,然后执行“迁移"指令即可,好了,你的数据库已经是最新的了!
10、单元测试(Unit-Testing)是Laravel中很重要的部分。Laravel自身就包含数以百计的测试用例,以保障任何一处的修改不会影响其它部分的功能,这就是为什么在业内Laravel被认为是最稳版本的原因之一。Laravel也提供了方便的功能,让你自己的代码容易的进行单元测试。通过Artisan命令行工具就可以运行所有的测试用例。
配置即一切
首先配置文件应该怎么设计
最后的效果大概是什么样子的?
列表页:
新建页面:
编辑页面:
class FormController extends BaseController { // 对应的模型 protected $model; // 所有的字段 protected $fields_all; // 列表页显示的字段 protected $fields_show; // 编辑页面显示的字段 protected $fields_edit; // 创建页面显示的字段 protected $fields_create;}
<?php // 账号管理系统class BadminController extends FormController{ public function __construct() { $this->model = '\Badmin'; $this->fields_all = [ 'id' => [ 'show' => '序号', ], 'nickname' => [ 'show' => '昵称', 'search' => "nickname like CONCAT('%', ?, '%')" ], 'username' => [ 'show' => '用户名', ], 'email' => [ 'show' => '邮箱', ], 'password' => [ 'show' => '密码', ], 'created_at' => [ 'show' => '创建时间', ], 'updated_at' => [ 'show' => '更新时间', ], ]; $this->fields_show = ['id' ,'nickname', 'username', 'email', 'created_at']; $this->fields_edit = ['nickname', 'username']; $this->fields_create = ['nickname', 'username', 'email', 'password']; parent::__construct(); }}
路由
Route::get('order/{id}',['as'=>'order.detail','uses'=>'OrderController@show']);Route::controller('preview', 'PreviewController');Route::resource('badmin', 'BadminController');
// 管理员账号管理Route::resource('badmin', 'BadminController');
Controller
public function __construct() { // TODO:做一些基础的判断,如果没有的话就抛出异常 $route = Route::currentRouteAction(); list($this->controller, $action) = explode('@', $route); View::share('controller', $this->controller); $fields_show = array(); foreach ($this->fields_show as $field) { $fields_show[$field] = $this->fields_all[$field]; } View::share('fields_show', $fields_show); $fields_edit = array(); foreach ($this->fields_edit as $field) { $fields_edit[$field] = $this->fields_all[$field]; } View::share('fields_edit', $fields_edit); $fields_create = array(); foreach ($this->fields_create as $field) { $fields_create[$field] = $this->fields_all[$field]; } View::share('fields_create', $fields_create); View::share('input', Input::all()); }
public function index() { $model = new $this->model; $builder = $model->orderBy('id', 'desc'); $input = Input::all(); foreach ($input as $field => $value) { if (empty($value)) { continue; } if (!isset($this->fields_all[$field])) { continue; } $search = $this->fields_all[$field]; $builder->whereRaw($search['search'], [$value]); } $models = $builder->paginate(20); return View::make('form.index', [ 'models' => $models, ]); }
$builder在laravel中真是太TMD好用了,对于这里的搜索,我使用whereRaw进行prepare查询。这里还有一个点,之前在fields_all设计的时候,我定义的直接是一个 'search' => "nickname like CONCAT('%', ?, '%')" 这里定义搜索字段的时候其实有很多种设计方法,比如定义为
‘search’ => [ 'type' => 'like', 'value' => '%?%']
create函数:
public function create() { return View::make('form.create', []); }
store函数:
public function store() { $model = new $this->model; $model->fill(Input::all()); $model->save(); return Redirect::to(action($this->controller . '@index')); }
edit,update,destory函数
public function edit($id) { $model = new $this->model; $model = $model->find($id); return View::make('form.edit', compact('model')); } public function update($id) { $model = new $this->model; $model = $model->find($id); $model->fill(Input::all()); $model->save(); return Redirect::to(action($this->controller . '@index')); } public function destroy($id) { $model = new $this->model; $model->destroy($id); return Redirect::to(action($this->controller . '@index')); }
View
列表页面注意事项:
1 使用laravel自带分页,注意记得带上本页的输入参数,这个时候,构造函数中share的Input就很有用了
2 可以使用laravel自带的from操作,比如删除操作由于需要调用HTTP的DELETE 方法,可以这么写
{{ Form::open(array( 'id' => "delete_{$model->id}", 'url' => action($controller . '@destroy', $model->id), 'class' => 'dropdown-toggle')) }} {{ Form::hidden('_method', 'DELETE') }} {{ Form::close() }}
3 搜索直接使用一个form就可以搞定了
<form class="form-inline" role="form" action="{{action($controller . '@index')}}"> @foreach ($fields_show as $field => $field_info) @if (isset($field_info['search'])) <div class="form-group"> <label class="col-sm-3 control-label">{{$field_info['show']}}</label> <div class="col-md-3"> <input name="{{$field}}" type="input" class="form-control" placeholder="" value="@if (isset($input[$field])){{$input[$field]}}@endif"> </div> </div> @endif @endforeach <input type="submit" class="btn btn-success" value="查询" /> </form>
编辑页面和创建页面
<form class="form-horizontal" role="form" action="{{action($controller . "@update", $model->id)}}" method='POST'> <input type="hidden" name="_method" value="PUT"> @foreach ($fields_edit as $field => $field_info) <div class="form-group"> <label class="col-sm-2 control-label">{{$field_info['show']}}</label> <div class="col-sm-10"> <input name="{{$field}}" type="text" class="form-control" placeholder="" value="{{$model->$field}}"> </div> </div> <div class="line line-dashed line-lg pull-in"></div> @endforeach <div class="col-sm-4 col-sm-offset-2"> <button type="submit" class="btn btn-primary">提交</button> </div> </form>
laravel改变搜索的对象变数组
路径 App/http/config/database.php
找到: 'fetch' => PDO::FETCH_CLASS,
改成: 'fetch' => PDO::FETCH_ASSOC,
后记
- laravel 简介
- laravel简介
- laravel 中功能简介
- TP与laravel简介
- laravel 中级任务翻译---简介
- [李景山php]每天laravel[007]-laravel 中级任务翻译---简介
- Lumen (Laravel子框架) 简介及分析
- Laravel
- laravel
- Laravel
- laravel
- Laravel
- Laravel
- Laravel
- Laravel
- laravel
- Laravel
- laravel
- 直接插入排序
- Java控制语句
- 字符应用
- 刮刮乐
- 我的第一篇博客,作为一个Java新菜鸟,或许我的问题会很多,但是这不是我退缩的理由。
- laravel简介
- 老程序员通过一篇文章快速学会python这门新语言
- ubuntu上php7安装pdo-mysql扩展
- 初识JavaCC(二)
- extjs对象的configs和properties有什么区别?
- 使用WakeLock使Android应用程序保持后台唤醒
- js正则表达式验证大全
- 夜神模拟器无法使用adb命令提示adb server version 31 doesn't match
- [kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher H POJ 2752