laravel_laravel 跨域 - CSDN
laravel 订阅
Laravel是一套简洁、优雅的PHP Web开发框架(PHP Web Framework)。它可以让你从面条一样杂乱的代码中解脱出来;它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁、富于表达力。在Laravel中已经具有了一套高级的PHP ActiveRecord实现 -- Eloquent ORM。它能方便的将“约束(constraints)”应用到关系的双方,这样你就具有了对数据的完全控制,而且享受到ActiveRecord的所有便利。Eloquent原生支持Fluent中查询构造器(query-builder)的所有方法。 展开全文
Laravel是一套简洁、优雅的PHP Web开发框架(PHP Web Framework)。它可以让你从面条一样杂乱的代码中解脱出来;它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁、富于表达力。在Laravel中已经具有了一套高级的PHP ActiveRecord实现 -- Eloquent ORM。它能方便的将“约束(constraints)”应用到关系的双方,这样你就具有了对数据的完全控制,而且享受到ActiveRecord的所有便利。Eloquent原生支持Fluent中查询构造器(query-builder)的所有方法。
信息
定    义
简洁、优雅的PHP Web开发框架
特    点
简洁、富于表达力
当前版本分支
为5.x
外文名
Laravel
作    者
泰勒.奥特威尔(taylor otwell)
Laravel功能特点
1、语法更富有表现力你知道下面这行代码里 “true” 代表什么意思么?$uri = Url::create(‘some/uri’, array(), array(), true); 另外,你知道其他参数在这里的意思么(除了第一个)?当然你不知道。因为这行代码没有表现力。再看看这段代码:$url = URL::to_secure(‘some/uri’);这个表达式使用HTTPS协议创建了一条URL链接, 事实上,上面两种写法都在做同样的事情,但哪一个更一目了然,更富有表现力呢?2、高质量的文档Laravel 有一个非常棒的的社区支持。Laravel代码本身的表现力和良好的文档使PHP程序编写令人愉快。3、丰富的扩展包Bundle是Laravel中对扩展包的称呼。它可以是任何东西 -- 大到完整的ORM,小到除错(debug)工具,仅仅复制&粘贴就能安装任何扩展包!Laravel的扩展包由世界各地的开发者贡献,而且还在不断增加中。4、开源、托管在GITHUB上Laravel是完全开源的。所有代码都可以从Github上获取,并且欢迎你贡献出自己的力量。
收起全文
精华内容
参与话题
  • Laravel框架基础到项目实战 完整版

    万人学习 2019-05-22 18:55:35
    Laravel是一套简洁、优雅的PHP Web开发框架(PHP Web Framework)。它可以让你从面条一样杂乱的代码...laravel框架功能较多,但是语法相对简单,在学习中API相对比较复杂,丰富的第三方组件是laravel框架学习的一个难点。
  • PHP+Laravel实战博客项目

    千人学习 2019-11-07 16:16:12
    1.项目的需求分析和程序详细设计 2.Git服务器搭建和项目版本管理应用 3.登录、注册、前后面模板开发 4.... 5.... 6.... 7.... PHP基本应用,接口技术、Composer和Laravel5.5
  • Laravel--使用介绍

    千次阅读 2018-08-02 16:18:24
    Laravel--使用介绍   1、简介 Laravel 应用默认的目录结构试图为不管是大型应用还是小型应用提供一个好的起点,当然,你可以自己按照喜好重新组织应用目录结构,Laravel 对类在何处被加载没有任何限制——只要 ...

                                         Laravel--使用介绍

     

    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.phpapi.phpconsole.php

    web.php文件包含的路由都会应用web中间件组,具备Session、CSRF防护以及Cookie加密功能,如果应用无需提供无状态的、RESTful风格的API,所有路由都会定义在web.php文件。

    api.php 文件包含的路由应用了api中间件组,具备频率限制功能,这些路由是无状态的,所以请求通过这些路由进入应用需要通过token进行认证并且不能访问Session状态。

    console.php 文件用于定义所有基于闭包的控制台命令,每个闭包都被绑定到一个控制台命令并且允许与命令行IO方法进行交互,尽管这个文件并不定义HTTP路由,但是它定义了基于控制台的应用入口(路由)。

    Storage目录

    storage目录包含了编译过的Blade模板、基于文件的session、文件缓存,以及其它由框架生成的文件,该目录被细分为成appframeworklogs子母录,app目录用于存放应用要使用的文件,framework目录用于存放框架生成的文件和缓存,最后,logs目录包含应用的日志文件;

    storage/app/public 目录用于存储用户生成的文件,比如可以被公开访问的用户头像,要达到被访问的目的,你还需要在public目录下生成一个软连接storage 指向这个目录。你可以通过php artisan storage:link 命令生成这个软链接。

    Tests目录

    tests目录包含自动化测试,其中已经提供了一个开箱即用的PHPUnit示例;每一个测试类都要以 Test 开头,你可以通过phpunitphp vendor/bin/phpunit 命令来运行测试。

    Vendor目录

    vendor目录包含Composer依赖。

    3、App目录

    应用的核心代码位于app目录下,默认情况下,该目录位于命名空间 App 下,  并且被 Composer 通过 PSR-4自动载入标准 自动加载。

    app目录下包含多个子目录,如ConsoleHttpProviders等。ConsoleHttp目录提供了进入应用核心的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命令行工具就可以运行所有的测试用例。

     

    11、自动分页(Automatic Pagination)功能避免了在你的业务逻辑中混入大量无关分页配置代码。方便的是不需要记住当前页,只要从数据库中获取总的条目数量,然后使用limit/offset获取选定的数据,最后调用‘paginate’方法,让Laravel将各页链接输出到指定的视图(View)中即可,Laravel会替你自动完成所有工作。Laravel的自动分页系统被设计为容易实现、易于修改。虽然Laravel可以自动处理这些工作,但是不要忘了调用相应方法和手动配置分页系统哦
     

    配置即一切

    一切皆于需求,后台从0开始搭建,但是写了一两个页面后发现太多的是对单表的增删改查操作,于是就想到了,能不能做一个快速搭建的后台。想到一句话,配置即一切。如果一个CURD后台能只进行配置就自动生成,该是多么美妙的事情,那么就开始搭建这么个结构。

     

    首先配置文件应该怎么设计

    起初想到将配置文件放到config目录下,但是想想还是放弃了这个想法,那样子可能会导致有一个“万能”文件,又臭又长。那么,其次,这个功能只针对单表,所以,是不是可以将配置文件放置在Model中,后来也觉得这个想法不大好,这个配置文件是承担页面展示的功能的,如果放在Model中就算是入侵了Model层了。所以最后决定放在了Controller中。

     

    最后的效果大概是什么样子的?

    后台大概会有几个页面:

    列表页:

    列表页中有查询操作,编辑,删除按钮,新建按钮。

    新建页面:

     

    编辑页面:

     

    好了,对应这几个页面,我们可以设置配置项了。

     

    基本想法是搭建一个FormController,所有以后需要配置生成后台的controller就继承这个FormController就好了。在FormController中定义属性:

    复制代码

    class FormController extends BaseController {
     
         // 对应的模型
         protected $model;
     
         // 所有的字段
         protected $fields_all;
     
         // 列表页显示的字段
         protected $fields_show;
     
         // 编辑页面显示的字段
         protected $fields_edit;
     
         // 创建页面显示的字段
         protected $fields_create;
    }

    复制代码

    定义了Model,来表示这个Controller是对那个Model进行单表操作的。

    定义了fields_all属性,来将所有的字段来进行一个说明和定义。这个定义和说明就包括字段显示名字,字段是否要进行搜索,字段类型是什么。

    对于列表页,不是所有属性都显示出来,所以定义一个fieldsshow,这个数组存放的是

    fields_all中的一些字段,用来显示的字段。

    对于编辑页面,要显示的字段就放在$field_edit中

    对于创建页面,要显示的字段就放在$field_create中

     

    好了,现在继承FormController的类就只需要这么配置就好;

    复制代码

    <?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();
         }
    } 

    复制代码

    在构造函数中定义model,fieldsall,

    fields_show, fieldsedit,

    fields_create。

    对于fields_all,key为数据库对应的字段名,value为一个数组,show是显示名,如果你在列表页希望这个字段能进行搜索,就设置下search属性。

     

    路由

    下面是路由,laravel中路由基本有三种:

    Route::get('order/{id}',['as'=>'order.detail','uses'=>'OrderController@show']);
    Route::controller('preview', 'PreviewController');
    Route::resource('badmin', 'BadminController');

     

    第三种已经完全定义好了增删改查操作,看起来能省我不少的事情,好吧,我就使用这个resource来做了。

     

    所以在route.php中我只需要定义这么一条就ok了

     

    // 管理员账号管理
    Route::resource('badmin', 'BadminController');

     

    Controller 

    下面写FromController中的resource方法

     

    按照laravel的resource定义的,需要填充的方法有:

     

    我习惯在构造函数中把一些诸如Input,全局定义的东西都share到模版中,代码如下:

    复制代码

         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());
         }

    复制代码

     

    这里把controller放到外面是为了在view中可以使用诸如:

    action(controller.′@destroy′,

    model->id),

    的路径定义

     

    index函数:

     

    复制代码

     
         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' => '%?%'
    ]

     

     

    但是考虑到使用这个FromController的都是程序员,所以这里的search直接使用预处理的语句,然后在index中直接使用whereRaw,这样使得配置文件的易读性增加了。

     

    下面是

    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'));
         }
     

    复制代码

     

    这里的model的fill是不是很简单,爽到爆。当然model中还是需要定义fillable字段

     

    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

    下面就是view的编写。

    view大概就只要三个页面,列表页面,编辑页面,创建页面

     

    列表页面注意事项:

    1 使用laravel自带分页,注意记得带上本页的输入参数,这个时候,构造函数中share的Input就很有用了

    {{models−>appends(

    input)->links()}}

     

    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() }}

    复制代码

     

     

    其实自己写DELETE也行,就是在From表单中多传递一个_method隐藏域

     

    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就能搞定了

     

    复制代码

      <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>

    复制代码

     

     

    记得resource中更新的操作是要使用PUT方式,删除的操作要使用DELETE方式。

    至于view的模版,我这里使用的是一款叫notebook的模版,它是基于bootstrap的,你也可以使用其他更好看的模版来写。

     

    好了,至此这么个快速搭建CURD的结构就完成了。现在可以在运营人员给需求的时候,很牛逼地说,等我一分钟,我就给你一个世界~~

    laravel改变搜索的对象变数组

    路径  App/http/config/database.php

    找到:  'fetch' => PDO::FETCH_CLASS,
    改成:  'fetch' => PDO::FETCH_ASSOC,

    后记

    其实回想下,这整个结构不算复杂。配置即一切的思想能解决很多问题。但是依赖配置的路子最怕的是几个事情:

    1 配置文件过于复杂。(如果你的配置文件过于复杂,已经超过了敲代码本身需要了解的东西,那么这个配置项的学习成本就太太太高了)

    2 配置字段语意不清。(配置的字段名字和意思不对,字段名和变量名一样重要!)

     

    当然这个就是个初步,改进的几个点还有

    1 所有字段都使用input标签,需要在配置中加入其它标签类型

    2 是不是考虑view中所有的东西都使用laravel自带的form对应字段?

     

    展开全文
  • Laravel后端框架

    2018-10-22 21:38:13
    Laravel是一套简洁、优雅的PHP Web开发框架(PHP Web Framework)。它可以让你从面条一样杂乱的代码中解脱出来;它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁、富于表达力
  • laravel入门教程(一)

    万次阅读 2018-06-03 13:20:05
    laravel入门教程(一) 本教程是针对 laravel 5 来讲解的 0.1、一个简单的示例 //文件:routes/web.php &lt;?php Route::get('/','WelcomeController@index'); //文件:app/...

    laravel入门教程(一)

    本教程是针对 laravel 5 来讲解的

    0.1、一个简单的示例

    //文件:routes/web.php
    <?php
    Route::get('/','WelcomeController@index');
    
    //文件:app/Http/Controllers/WelcomeController.php
    <?php
    namescpace app\Http\Controllers;
    
    class WelcomeController{
        public function index(){
            return 'Hello, World!';
        }
    }
    

    访问http://xxxxxxxxx.xxx/ 就可以看见“Hello,World!”。
    实际上,这种写法等价于另一种更为简便的写法

    //文件:routes/web.php
    <?php
    Route::get('/',function(){
        return 'Hello, World!';
    });

    但是,为了保持与后面讲解内容的一致性和代码编写的一致性,最好使用第一种方法。第一种方法的第一个文件中定义了路由,当访问‘/’的路由的时候,就去找WelcomeController里面的index方法。第二个文件定义的就是WelcomeController控制器以及它的index方法。

    0.2、一个访问数据库数据的demo

    //文件:routes/web.php
    <?php
    Route::get('/',function{
        return Greeting::first()->body;
    });
    //文件:app/Greeting.php
    //这个是模型文件
    <?php
    use Illuminate\Database\Eloquent\Model;
    
    class Greeting extends Model{}
    
    //文件:database/migrations/2018_06_03_123123_create_greetings_table.php
    //这个是数据库迁移文件,后面会详细讲解
    <?php
     use Illuminate\Database\Migrations\Migration;
     use Illuminate\Database\Schema\Blueprint;
     class CreateGreetingsTable extends Migration{
         public function up(){
             Schema::create('greetings',function(Blueprint $table){
                $table->increments('id');
                $table->string('body');
                $table->timestamps();
             });
         }//创建数据库的文件,这些文件都可以使用artisan命令自动生成,内容自己填充
    
         public function down(){
             Schema::drop('greetings');
         }//销毁数据库时的操作
     }
    

    如果在greetings数据库里面存入一条数据:“Hello, World!”。就可以在首页看到了。

    下面开始正式学习laravel

    1、创建一个新的laravel项目

    1.1、使用Laravel安装工具来安装Laravel
    (1)、开发全局安装Composer
    (2)、运行

    composer global require “laravel/installer=~1.1”

    安装laravel安装工具。启动一个全向的Laravel项目:

    laravel new projectName

    此命令会在当前目录下创建一个新的名为 projectName 的子目录,并在其中安装 一个全新的Laravel项目

    1.2、使用Composer的create-project 来安装Laravel
    (1)、输入以下命令:

    composer create-project laravel/laravel projectName –prefer-dist

    此命令会在当前目录下创建一个新的名为 projectName 的子目录,并在其中安装 一个全新的Laravel项目

    1.3、创建好Laravel项目之后,生成的项目结构大致如下(因为版本不一样,可能稍有区别)

    新安装的 Laravel 应用包含许多文件夹:
    app目录包含了应用的核心代码;
    bootstrap目录包含了少许文件用于框架的启动和自动载入配置,还有一个cache文件夹用于包含框架生成的启动文件以提高性能;

    config目录包含了应用所有的配置文件;

    database目录包含了数据迁移及填充文件,如果你喜欢的话还可以将其作为 SQLite 数据库存放目录;

    public目录包含了前端控制器和资源文件(图片、JavaScript、CSS等);

    resources目录包含了视图文件及原生资源文件(LESS、SASS、CoffeeScript),以及本地化文件;

    storage目录包含了编译过的Blade模板、基于文件的session、文件缓存,以及其它由框架生成的文件,该文件夹被细分为成app、framework和logs子目录,app目录用于存放应用要使用的文件,framework目录用于存放框架生成的文件和缓存,最后,logs目录包含应用的日志文件;

    tests目录包含自动化测试,其中已经提供了一个开箱即用的PHPUnit示例;

    vendor目录包含Composer依赖;

    App目录

    应用的核心代码位于app目录下,默认情况下,该目录位于命名空间 App 下, 并且被 Composer 通过 PSR-4自动载入标准 自动加载。你可以通过Artisan命令app:name来修改该命名空间。

    app目录下包含多个子目录,如Console、Http、Providers等。Console和Http目录提供了进入应用核心的API,HTTP协议和CLI是和应用进行交互的两种机制,但实际上并不包含应用逻辑。换句话说,它们只是两个向应用发布命令的方式。Console目录包含了所有的Artisan命令,Http目录包含了控制器、中间件和请求等。

    Jobs目录是放置队列任务的地方,应用中的任务可以被队列化,也可以在当前请求生命周期内同步执行。

    Events目录是放置事件类的地方,事件可以用于通知应用其它部分给定的动作已经发生,并提供灵活的解耦的处理。

    Listeners目录包含事件的处理器类,处理器接收一个事件并提供对该事件发生后的响应逻辑,比如,UserRegistered事件可以被SendWelcomeEmail监听器处理。

    Exceptions目录包含应用的异常处理器,同时还是处理应用抛出的任何异常的好地方。

    注意:app目录中的很多类都可以通过Artisan命令生成,要查看所有有效的命令,可以在终端中运行php artisan list make命令。

    2、配置

    内容包括数据库连接,队列以及邮件设置都放置在config文件夹中。这里的每一个文件都将返回一个数组,数组中的每个值都可以通过一个配置键进行访问,该配置键有文件名和后续的键组成,以点好(.)进行分隔。所以,可以在config/services.php中创建如下所示的信息。

    // config/services.php
    return [
        'sparkpost' => [
            'secret' => 'aaaaaa'
        ]
    ];

    现在可以使用

    config(‘services.sparkpost.secret)

    访问配置好的变量了。

    每个环境中的任何配置变量都应该放在.env文件中(而不是提交给源代码控制)。如果希望在每个环境使用不同的Bugsnag API密钥,可以将配置信息从.env中提取出来,如下所示:

    //config/services.php
    return [
        'bugsnag' => [
            'api_key' => env('BUGSNAG_API_KEY')
        ]
    ];

    .env()这个函数可以从.env文件中提取出该键名所对应的值。现在可以将该键名对应的信息添加到.env(当前环境的设置)和.env.example(适用于所有环境的模板)文件中。

    BUGSNAG_API_KEY = oinfp9813410942

    3、路由和控制器

    在学习web框架时,定义好应用程序的路由是第一个也是最重要的一个环节。没有路由,就无法与终端用户进行交互。

    在一个laravel应用程序中,一般是在routes/web.php中定义路由。如果是api的路由,则在api.php中定义路由。示例0.1就是一个路由定义的例子。

    在详细介绍路由之前,先介绍几个概念:

    闭包:闭包是php版本的匿名函数。闭包是一个函数,可以将它作为一个对象传递,并赋值给一个变量,将其作为参数传递给其他的函数和方法,甚至进行序列化。
    中间件:laravel的请求和响应的过程包含很多封装起来的内容,包括所谓的中间件。仅仅定义路由闭包以及控制器方法,还不足以将输出发送给浏览器,所以这里采用返回内容的方式,这样返回的内筒可以继续在response stack以及中间件中运行(即继续在程序中处理该返回的内容),运行完成后再返回给浏览器共终端用户查看。

    demo3.1

    //简单的网站
    
    Route::get('/',function(){
        return view('welcome');
    });
    
    Route::get('about',function(){
        return view('about');
    });
    
    Route::get('products',function(){
        return view('products');
    });
    Route::get('services',function(){
        return view('services');
    });

    上面的代码等价于

    $router->get('/',function(){
        return view('welcome');
    });
    
    $router->get('about',function(){
        return view('about');
    });
    
    $router->get('products',function(){
        return view('products');
    });
    $router->get('services',function(){
        return view('services');
    });

    常用的HTTP方法有:GET/POST/PUT/DELETE/PATCH
    进行替换就可以了。例如:

    Route::get('/',function(){
        return '123';
    });
    
    Route::post('/',function(){
        return '456';
    });
    
    Route::put('/',function(){});
    Route::delete('/',function(){});
    Route::any('/',function(){});
    Route::match(['get','post'],'/',function(){});

    另一种方法是将控制器名称和方法作为字符串传递给闭包

    Route::get('/','WelcomeController@index');

    路由参数:如果定义的路由具有参数(可变的额URL地址段),那么可以在路由中定义它们,并将它们传递给闭包。

    //路由参数示例
    Route::get('users/{id}/friends',function(){
        //
    });

    一般只有get方法这样写参数。
    在录用参数({id})中使用相同的名称,以及将对应的名字添加到路由定义的方法参数中(function{$sid)是十分常见的。除非使用路由/模型绑定,否则定义的路由参数与哪个方法参数相匹配仅由它们的顺序(从左到右)决定,如以下代码所示。

    Route::get('users'/{userId}/comments/{commentId}',function(
        $thisIsActuallyTheRouteId,
        $thisisReallyTheCommentId
        ){
        //
    });

    也就是说,可以让它们使用不同的名称,也可以使用相同的名称。这里建议使它们的名称保持一致,以免未来开发人员在使用的时候可能因为不一致的命名而出现问题。
    还可以用过在参数名称后添加一个问号(?)来实现路由参数的选择。

    //可选路由参数
    Route::get('users/{id?}',function($id = 'fallbackId'){
        //
    });

    在这种情况下,应该为相应的路由变量设置好默认值。并且可以使用正则表达式来定义一个路由,这个时候,只有该参数满足特定的模式时才会匹配

    //通过正则表达式来定义路由
    Route::get(;users/{id}',function($id){
        //
    })->where('id','[0-9]+');
    
    Route::get('users/{username}',function($username){
        //
    })->where('username','[A-Za-z]+');
    
    Route::get('posts/{id}/{slug}',function($id,$slug){
        //
    })->where(['id'] => '[0-9]+',]slug' => '[A-Za-z]+');

    路由名称
    url()助手函数:写相对路径,可以自动补全站点全称

    //在routes/web.php中定义具有名称的路由
    Route::get('members/{id}','MembersController@show')->name('members.show');
    
    //使用route()助手在视图中链接路由
    <a href="<php echo route('members.show',['id' = 4]); ?>">

    路由组
    允许多个路由组合在一起,并且可以将任何共享的配置应用于整个组,从而避免配置信息的重复。

    //定义一个路由组
    Route::group([],function(){
        Route::get('hello',function(){
            return 'Hello';
        });
        Route::get('world',function(){
            return ' World!';
        });
    });

    传入的空数组允许传递各种配置信息,这些配置将对组内的所有路由都生效。

    中间件
    路由组最常见的功能就是将中间件应用于一组路由中,但是在其他方面,路由组也常常被应用在权限控制方面。

    //将一组路由限制为只允许登录用户访问
    Route::group(['middleware' => 'auth'],function(){
        Route::get('aaa',function(){
            return view('aaaa');
        });
        Route::get('bbb',function(){
                return view('bbbb');
        });
    });

    此时中间件auth对aaa和bbb这两者都会生效。在此示例中,表示用户必须登录后才能查看控制中心(aaa)或账户页面(bbb)。

    中间件在控制器中的应用:
    通常,在控制器中使用中间件比在路由中使用中间件更为清晰和直接。可以在控制器中调用middleware()方法来使用中间件。参数代表中间件的名称,可以使用modifier方法(only()和except())来确定将由哪些方式接收中间件

    class DashboardController extends Controller{
        public function __construct(){
            $this->middleware('auth');
            $this->middleware('admin-auth')->only('admin');
            $this->middleware('team-member')->except('admin');
        }
    }

    路径前缀

    //为一组路由设置路径前缀
    Route::group(['prefix' => 'api'],function(){
        Route::get('/',function(){
            //设置path /api
        });
    
        Route::get('users',function(){
            //设置path /api/users
        });
    });

    子域名路由
    子域名路由的作用域是子域名,而不是路由前缀

    //子域名路由
    Route::group(['domain' => 'api.myapp.com'],function(){
        Route::get('/',function(){
            //
        });
    });
    
    //参数化的子域名路由
    Route::group(['domain'=> '{acount}.myapp.com'],function(){
        Route::get('/',function($acount){
            //
        });
        Route::get('users/{id}',function($acount,$id){
            //
        });
    });
    展开全文
  • Laravel常用的模型属性

    2020-09-17 17:34:37
    Laravel常用的模型属性 在网上找了有关laravel常用的模型属性,方便后续更好地使用 原文地址:[添加链接描述](https://learnku.com/articles/21644) $connection /** * 为模型指定一个连接名称。 * * @var string...

    在网上找了有关laravel常用的模型属性,方便后续更好地使用
    原文地址:https://learnku.com/articles/21644

    $connection

    /**
      * 为模型指定一个连接名称。
      *
      * @var string
      */
     protected $connection = 'connection-name';
    

    $table

    /**
     * 为模型指定一个表名。
     *
     * @var string
     */
     protected $table = 'users';
    

    $primaryKey

    /**
     * 为模型指定主键。
     *
     * @var string
     */
     protected $primaryKey = 'user_id';
    

    $keyType

    /**
      * 自定义主键类型。
      *
      * @var string
      */
     protected $keyType = 'string';
    

    $incrementing

    /**
      * 如果使用的是非递增或者非数字的主键。
      *
      * @var bool
      */
     public $incrementing = false;
    

    $with

    /**
      * 加载模型关联数据。
      * 
      * @var array
      */
      protected $with = [
          'comments'
      ];
    

    $withCount

    /**
      * 加载模型关联数据数量。
      * 
      * @var array
      */
      protected $withCount = [
          'comments'
      ];
    

    $timestamps

    /**
      * 执行模型是否自动维护时间戳.
      *
      * @var bool
      */
     public $timestamps = false;
    

    注:guarded 与 fillable,模型使用中只能二选一
    $fillable

    /**
     * 可以被批量赋值的属性。
     *
     * @var array
     */
     protected $fillable = ['name', 'age'];
    

    $guarded

     /**
      * 不可被批量赋值的属性,当 $guarded 为空数组时则所有属性都可以被批量赋值。
      *
      * @var array
      */
     protected $guarded = ['price'];
    

    CREATED_AT

     /**
      * 创建时间戳字段名称。
      *
      * @var string
      */
     const CREATED_AT = 'created_at';
    

    UPDATED_AT

     /**
      * 更新时间戳字段名称。
      *
      * @var string
      */
     const UPDATED_AT = 'updated_at';
    

    $attributes

     /**
      * 给定字段默认值。
      *
      * @var array
      */
     protected $attributes = [
         'status' => self::STATUS_CREATED,
     ];
    

    $casts

     /**
      * 字段转换为对应的类型。
      *
      * @var array
      */
     protected $casts = [
        'id' => 'integer',
        'settings' => 'array',
        'is_admin' => 'boolean',
     ];
    

    $dates

     /**
      * 需要转换成日期的属性。
      *
      * @var array
      */
     protected $dates = ['deleted_at'];
    

    $dateFormat

    /**
      * 模型中日期字段的保存格式。
      *
      * @var string
      */
     protected $dateFormat = 'U';
    

    $appends

    /**
      * 追加到模型数组表单的访问器。
      *
      * @var array
      */
     protected $appends = ['is_admin'];
    

    $hidden

    /**
      * 数组中的属性会被隐藏。
      *
      * @var array
      */
     protected $hidden = ['password'];
    

    $visible

    /**
      * 数组中的属性会被展示。
      *
      * @var array
      */
     protected $visible = ['first_name', 'last_name'];
    

    $dispatchesEvents

    /**
      * 模型的事件映射。
      *
      * @var array
      */
     protected $dispatchesEvents = [
         'saved' => UserSaved::class,
         'deleted' => UserDeleted::class,
     ];
    

    $forceDeleting

     /**
      * 指示模型当前是否强制删除。
      *
      * @var bool
      */
     protected $forceDeleting = false;
    

    $perPage

     /**
      * 默认分页数量。
      *
      * @var int
      */
     protected $perPage = 50;
    

    $touches

    /**
      * 更新添加的关联模型的 updated_at 字段。
      *
      * @var array
      */
     protected $touches = ['post'];
    
    展开全文
  • laravel {{}} 与{!! !!}

    2019-08-22 20:50:18
    撸了今年阿里、头条和美团的面试,我有一个重要发现.......>>> ...

    {{}}  支持转义     一段html代码只是被当成普通的字符串输出

    {!! !!} 不支持转移  一段html代码可以被正常的解析

    展开全文
  • Laravel框架】简介

    2018-10-19 16:30:22
    Laravel 简介 Laravel是一套简洁,优雅的PHPWeb开发框架,具有富于表达性且简洁的语法 Laravel是易于理解且强大的,它提供了强大的工具用以开发大型,健壮的应用。具有验证、路由、Session、缓存、数据库迁移...
  • Laravel入门

    万次阅读 2017-03-28 08:47:36
    一、laravel简介及安装 1.简介:Laravel是一套简洁、优雅的PHP Web开发框架(PHP Web Framework)。它可以让你从面条一样杂乱的代码中解脱出来;它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁、富于表达力...
  • Laravel的核心概念

    万次阅读 多人点赞 2020-03-27 10:26:01
    确实如此,这篇文章读完你可能并不能从无到有写出一个博客,但知道Laravel的核心概念之后,当你再次写起Laravel时,会变得一目了然胸有成竹。PHP的生命周期万物皆有他的生命周期。熟悉Android的同学一定熟悉Android...
  • 优化PHP程序

    2011-10-10 22:03:58
    优化PHP程序 转载:http://zhaoqi7577.blog.163.com/blog/static/90154965200872812238412/ 网上很多文章介绍优化php程序,是通过安装Zend Optimizer之类的加速软件实现的,但这种加速是有限的。本
  • Laravel框架高并发性能优化

    千次阅读 2018-07-05 15:24:33
    调整框架本身的配置 编辑.envAPP_ENV = productionAPP_DEBUG = falsephp artisan route:cache / php artisan config:cachecomposer dump-autoload --optimizephp artisan optimize其他可能 开启OPcachephp-fpm ...
  • laravel使用redis报错

    千次阅读 2019-07-21 21:37:43
    当你使用redis时,也许会报这个错误: (1/1) ConnectionException ...����Ŀ����������ܾ����޷����ӡ� [tcp://127.0.0.1:6379] ...at AbstractConnecti...
  • Laravel admin 后台管理插件的使用

    千次阅读 2019-08-15 16:19:04
    自从15年初第一次接触 Laravel 4.2 开始,我就迷上使用 Laravel 框架了。我一直都想找个时间好好写写有关 Laravel 的使用文章,由浅入深的介绍 Laravel 框架。 今天通过使用 laravel-admin 插件,来简单说说怎么优雅...
  • LaravelLaravel-admin后台框架-2创建数据表建立模块增删改查CURD(2) 【LaravelLaravel-admin后台框架-2创建数据表建立模块增删改查CURD(1) 【LaravelLaravel-admin后台框架-1安装 实战 Laravel-admin 是...
  • 安装laravel-admin

    万次阅读 2019-03-16 17:24:34
    最近放假在家没事做,博主想到用laravel-admin做一个管理后台,将安装过程以及过程中遇到的坑向大家分享下,避免大家遇坑。 在安装前我们先修改两点,等下在安装过程中会报错,所以我们将先修改这两点,避免遇坑,...
  • laravel+vue2.0终于搞定了!

    万次阅读 2017-08-26 16:18:45
    1:起手在慕课网看了laravel基础入门的就会发现,laravel解决了很多后台开发起来老大难的问题,模板引擎和路由机制还有很多开发服务:登录/注册验证,验证码,分页等等.. 2:起手也在慕课网看了vue基础也有很多先进的概念如...
  • Laravel起步---phpstudy运行laravel项目

    千次阅读 2019-10-10 11:03:37
    前言:小编此篇文章仅献给第一次接触laravel框架的新手,路过的大佬可以跳过。 laravel的下载与安装 简介 不知道大家是否和小编一样,在刚接触一款框架的时候总会在那些错综复杂的配置安装环境花大量的时间,有...
  • php基于laravel框架的批量插入操作

    万次阅读 2019-08-02 20:56:35
    在日常开发中,用到批量插入的操作还是挺多的。记得很早很早以前,我还是在循环中写sql插入,结果被项目经理按在...由图可知:laravel提供了insert插入数组的方法,也就是说,我们可以直接insert($array)实现批量插入的
  • laravel入门(一)

    千次阅读 2020-03-07 18:01:17
    近期我也在大众趋势的带领下开始了我的“laravel征程之旅”。本着做笔记的记录方式给大家分享一下我学习过程中的心得,因为是初学,可能有不正确的地方希望大家能够指出。 laravel的环境 PHP版本的选择 Laravel 5.1...
1 2 3 4 5 ... 20
收藏数 82,869
精华内容 33,147
关键字:

laravel