Laravel 课程自学笔记

安装配置

安装composer

www.getcomposer.org
www.phpcomposer.com

composer.exe     一装到底,在第二步的时候选择php.exe 安装的位置

安装laravel

    命令行下安装:在 cmd 命令行下,先cd 到安装位置:

    C:\Users\Administrator>d:
    D:\cd wamp64
    D:\wamp64>cd www
    D:\wamp64\www>cd test
    D:\wamp64\www\test>composer create-project laravel/laravel --prefer-dist     

    这样会安装的结果是: D:\wamp64\www\test\laravel   
    如果第一次安装,会自动下载并创建相应文件名的文件夹。如创建另外的文件夹
    composer create-project laravel/laravel blog --prefer-dist

    启用镜像服务的方式有两种:
    系统全局配置:即将配置信息添加到 composer 的全局配置文件 config.json中
    名单个项目配置:将配置信息添加到某个项目的 composer.json 文件中

    修改composer的全局配置文件(cmd):
    composer config -g reop.packgist composer https://packagist.phpcomposer.com

    创建一个test文件夹,里面txt写一个 composer.json 配置文件,写入命令(cmd):
    composer config repo.packagist composer https://packagist.phpcomposer.com

Laravel初始化配置

1. wampp准备
2. 把blog文件夹上传到 SourceTree 新建/克隆
3. 开启rewrite 和 vhost

    3.1. D:\wamp64\bin\apache\apache2.4.18\conf\httpd.conf
            LoadModule rewrite_module modules/mod_rewrite.so 
            LoadModule vhost_alias_module modules/mod_vhost_alias.so
            Include conf/extra/httpd-vhosts.conf        //这是虚拟机的
            ## rewrite/vhost 前面的 # 删掉
            AllowOverride all
            Require all granted

    3.2 D:\wamp64\bin\apache\apache2.4.18\conf\extra\httpd-vhosts.conf
            
                ServerName blog
                DocumentRoot D:/wamp64/www/code/blog/
                             

    3.3 C:\Windows\System32\drivers\etc\HOSTS
            在127.0.0.1 localhost 下面再加上一行  127.0.0.1  blog

    3.4 重启wamp 浏览器地址栏输入  blog.hd/public/   就可以直接登陆laravel欢迎界面了 

    3.5  D:\wamp64\bin\php\php5.6.19、php.ini
    extension = php_openssl.dll
    extension = php_mbstring.dll
    extension = php_pdo_mysql.dll

    4.D:\wamp64\www\code\blog\server.php 将server.php 改名index.php 直接运行blog
    4.1   复制D:\wamp64\www\code\blog\public\.htaccess 到 blog 文件夹下。做伪静态文件

配置入口目录说明

vhost文件修改
C:\wamp\bin\apache\apache2.4.9\conf\extra\httpd-vhosts.conf


    ServerAdmin [email protected]
    DocumentRoot "g:/code/blog/public/"
    ServerName blog.hd
    ErrorLog "logs/dummy-host2.example.com-error.log"
    CustomLog "logs/dummy-host2.example.com-access.log" common


注:独立服务器,有修改入口文件目录权限或者子目录绑定域名的情况下使用本方法

Laravel5.2目录结构及composer.json文件解析

开发工具
phpstorm (代码提示强,特别是对laravel可设置同步修改文件)
sublime/Atom (Atom 出的插件写代码的时候效果较好)
Hbulider (国人开发 性能要求高,安装包多,但运行占资源)
Zend Studio(重型坦克。没有针对larvel做特别开发。)
Eclipe (需要装插件)
Visual Studio Code

框架结构:目录结构/composer.json

目录或文件                                                       说           明
|– app          包含Controller、Model、路由等在内的应用目录,大部分业务将在该目录下进行
|  |– Console              命令行程序目录
|  |  |– Commands        包含用于命令行执行的类,可在该目录下自定义类
|  |  |– Kernel.php      命令调用内核文件,包含commands变量(命令清
|    |     |        单,自定义的命令需加入到这里)和schedule方法(用于任务调度,即定时任务)    
|  |– Events                事件目录
|  |– Exceptions            包含了自定义错误和异常处理类
|  |– Http                  HTTP传输层相关的类目录
|  |  |– Controllers      控制器目录
|  |  |– Middleware       中间件目录
|  |  |– Requests         请求类目录
|  |  |– Kernel.php       包含http中间件和路由中间件的内核文件
|  |  |– routes.php       强大的路由
|  |– Jobs                  该目录下包含队列的任务类
|  |– Listeners             监听器目录
|  |– Providers             服务提供者目录
|  |– User.php              自带的模型实例,我们新建的Model默认也存储在该目录
|– bootstrap                    //框架启动载入目录
|  |– app.php               创建框架应用实例
|  |– autoload.php          自动加载
|  |– cache                 存放框架启动缓存,web服务器需要有该目录的写入权限
|– config                       !!!各种配置文件的目录
|  |– app.php               系统级配置文件
|  |– auth.php              用户身份认证配置文件,指定好table和model就可方便使用身份认证
|  |– broadcasting.php      事件广播配置文件
|  |– cache.php             缓存配置文件
|  |– compile.php           编译额外文件和类需要的配置文件,一般用户很少用到
|  |– database.php          数据库配置文件
|  |– filesystems.php       文件系统配置文件,这里可以配置云存储参数
|  |– mail.php              电子邮件配置文件
|  |– queue.php             消息队列配置文件
|  |– services.php          可存放第三方服务的配置信息
|  |– session.php           配置session的存储方式、生命周期等信息
|  |– view.php              模板文件配置文件,包含模板目录和编译目录等
|– database                 数据库相关目录
|  |– factories             5.1以上版本的新特性,工厂类目录,也是用于数据填充
|  |  |– ModelFactory.php   在该文件可定义不同Model所需填充的数据类型
|  |– migrations            存储数据库迁移文件
|  |– seeds                 存放数据填充类的目录
|  |  |– DatabaseSeeder.php     执行php artisan db:seed命令将会调
|     |    |                    用该类的run方法。该方法可调用执行该目录下其
|     |    |                    他Seeder类,也可调用factories方法生成
|     |    |                    ModelFactory里定义的数据模型
|    |   |
|– public                   !!!网站入口,应当将ip或域名指向该目录而不是根目录。
                                可供外部访问的css、js和图片等资源皆放置于此
|  |– index.php             入口文件
|  |– .htaccess             !!!Apache服务器用该文件重写URL
|  |– web.config            !IIS服务器用该文件重写URL
|– resources                  资源文件目录(静态资源)
|  |– assets                可存放包含LESS、SASS、CoffeeScript在内的原始资源文件
|  |– lang                  本地化文件目录(语言包)
|  |– views                 !!!视图文件就放在这啦
|– storage                    存储目录。web服务器需要有该目录及所有子目录的写入权限
|  |– app                   可用于存储应用程序所需的一些文件
|  |– framework             该目录下包括缓存、sessions和编译后的视图文件
|  |– logs                  日志目录
|– tests                        测试目录
|– vendor                       该目录下包含Laravel源代码和第三方依赖包
|– .env                         !!!针对本地环境配置的文件。config目录下的配置文
|     |                         件会使用该文件的参数,不同生产环境使用不同的.env文件即可。
|– artisan                      强大的命令行接口,你可以在app/Console/Commands下编写自定义命令
|– composer.json                !!!存放依赖关系的文件
|– composer.lock                !!!锁文件,存放安装时依赖包的真实版本
|– gulpfile.js                  gulp(一种前端构建工具)配置文件
|– package.json                 gulp配置文件
|– phpspec.yml                  phpspec(一种PHP测试框架)配置文件
|– phpunit.xml                  phpunit(一种PHP测试框架)配置文件
|– server.php                   PHP内置的Web服务器将把这个文件作为入口。
                                以public/index.php为入口的可以忽略掉该文件

composer.json文件

{   
"name": "laravel/laravel",  //项目名称
"description": "The Laravel Framework.",    //描述
"keywords": ["framework", "laravel"],   //关键词
"license": "MIT",   //许可协议 MIT 可修改但要保留原版信息
"type": "project",  //类型
"require": {    
    "php": ">=5.5.9",   //PHP版本
    "laravel/framework": "5.2.*"    //框架版本
},  
"require-dev": {    //依赖包
    "fzaninotto/faker": "~1.4",    
    "mockery/mockery": "0.9.*", 
    "phpunit/phpunit": "~4.0", 
    "symfony/css-selector": "2.8.*|3.0.*",  //这是个内核
    "symfony/dom-crawler": "2.8.*|3.0.*"    //lavel是根据这个改的
},  
"autoload": {   //自动加载
    "classmap": [   
        "database"  
    ],  
    "psr-4": {  //一种自动加载的规范
        "App\\": "app/" 
    }   
},  
"autoload-dev": {   //加载测试
    "classmap": [   
        "tests/TestCase.php"    
    ]   
},  
"scripts": {    //执行脚本
    "post-root-package-install": [  
        "php -r \"copy('.env.example', '.env');\""  //这和.env文件是一样的
    ],  
    "post-create-project-cmd": [    
        "php artisan key:generate"  //生成随机数的命令。保证session/cookie的安全
    ],  
    "post-install-cmd": [   
        "php artisan clear-compiled",   //清理安装过程文件
        "php artisan optimize"          //清理安装完成后的垃圾文件
    ],  
    "post-update-cmd": [    
        "php artisan clear-compiled",   
        "php artisan optimize"  
    ]   
},  
"config": {         //配置项
    "preferred-install": "dist" //优先安装压缩版
},  
"repositories": {   //配置composer镜像
    "packagist": {  
        "type": "composer", 
        "url": "https://packagist.phpcomposer.com"  //中文镜像地址
    }   
  }

基础路由

1.有效路由的方法 先打开 blog\app\Http\routes.php 文件

Route::get($uri,$callback);

    Route::get('/blog',function(){
        echo 'get';     
});

Route::post($uri,$callback);
Route::put ($uri,$callback);
Route::patch  ($uri,$callback);
Route::delete ($uri,$callback);
Route::options($uri,$callback);

有时候需要注册路由响应多个HTTP请求,可以通过 match 方法来实现,或者甚至可以使用 any 方法注册一个路由响应所有的HTTP请求

Route::match(['get','post'],'/test',function(){
    echo 'succ';
});

Route::any('foo',function(){});


2. 必选参数

Route::get('user/{id}',function($id){  //user 后面括号里的 id 是路由的必填参数 
  ##注意:User_参数 / - _ 都可执行
    return 'User'.$id; // $id无实意  浏览器地址栏 blog/User/10  返回user 10

}); //输出用echo同return。 




Route::get('posts/{post}/comments/{comment}',function($postId,$commentId){

    return '$postId';  //在浏览器地址栏输入 blog/posts/20/commments/30  返回 20
    return '$commentId';//在浏览器地址栏输入 blog/posts/20/commments/30  返回 30

});


3. 可选参数

Route::get('user/{id?}',function($id){  //user后id可不填,但user 后面的可选参数不填
                                    时,function里面的闭包函数($id=null) 才有输出 
        return 'User'.$id;    // 闭包函数$id 也可以先赋一个默认值,就可直接打印默认值

}); //

postman的添加

谷歌浏览器->更多工具->添加程序->开发者模式->获取更多拓展程序->查找添加->返回拓展程序页面->详细信息->添加到桌面

HTTP控制器

手动创建方法:所有 laravel 方法都要在路由里面去配置路径
    根据larvel 结构是 
    1.submit user Request(提交请求)->
    2.Routing(路由)->3.controller(控制器提交View和Model)->
    4.->View(视图层)
    4.<->(控制器和和Model互相交换信息)Model(Model和数据库连接并返回信息)<->Database

控制器的位置:HTTP/Controllers/Controller.php  这是全局的基本控制器,仅供调用一些方法


    1.配置路径 打开  blog\app\Http\routes.php 
    写入 Route::get('test','Admin\IndexController@Index');
    ## 小伙子!!!这个地方的反斜线,一定不能搞错。不然要找不到admin下的index方法的!!!
    ## test 是浏览器路径
    ## IndexController 是控制器的名字
    ## @ 后面的 Index 是方法。@是固定格式
    ## 就是说,在浏览器地址栏输入blog/test 就可直接代打开下面控制卡的内容 test123

    在控制器中,要有个前台的控制器,也要有个后台的控制器,所以在Controllers 文件夹下创建一个Admin文件夹

    blog/app/Http/Controllers/Admin/这是后台控制器有一个 IndexController.php 
    blog/app/Http/Controllers/Auth/这是网页前台控制器有 Controller.php 和 UserController.php 俩个

    2.在blog\app\Http\Controllers\Admin\IndexController.php 后台控制器中

         namespace App\Http\Controllers\Admin;      //定义命名空间路径

            use App\Http\Controllers\Controller;    //继承自上一级目录Controller 文件夹下控制器

                class IndexController extends Controller{  

                    public function index(){

                        echo 'test123';}}


Artisan 方法创建控制器:CMD命令行下  
    php artisan make:controller HomeController
    php artisan make:controller UserController

路由详解

路由的命名

—闭包路由起名

    先找路由 :blog/app/http/Controller/routes.php 

    写入: Route::get('user',['as'=>'profile',function(){
        ## 输出当前路由的地址,http://blog/user 打印 route('profile');
        echo route('profile');  

        return  '路由命名';
}]);

—控制器路由起名

    先找路由 :blog/app/http/Controller/routes.php
    ##小伙子。看清楚。这里是as ...         uses!!!! 不然找不到函数要不找不到方法
    Route::get('test',['as'=>'profile','user'=>'Admin\IndexController@index']);
    //as 表示路由的名称 uses 表示使用后面的路由里面的方法

    还有一种命名的方法:
    Route::get('test','Admin\IndexController@index')->name('profile');

路由的分组

    还是打开route.php

    ##看清楚斜线的方向。我知道你又要报错。

    Route::get('admin/login','Admin\IndexController@login');
    Route::get('admin/index','Admin\IndexController@Index');

    admin\IndexController.php

            class IndexController extends Controller{
        public function index(){
            return view('welcome');
        }
        // public function index(){
        //  echo "bibaoluyou succ";
        //  // return view('welcome');
        // }
        public function login(){
            return 'denglu';
        }
    }


这时候再在地址栏输入 blog/admin/login 出 denglu 。输入admin/index  欢迎界面 view('welcome');


上面这两个都是admin/login ,admin开头的路由单独分一个组:

    Route::group(['prefix' => 'admin'], function() {
        Route::get('login','Admin\IndexController@login');
        Route::get('index','Admin\IndexController@Index');
    });

    去掉里面的admin/login,其他的没变,还有一个同样的,命名空间Admin也可以去掉

    Route::group(['prefix' => 'admin','namespace'=>'Admin'], function() {
        Route::get('login','IndexController@login');
        Route::get('index','IndexController@Index');
    });

**注意一下,get同理,as 和 uses**

资源控制器

    前方插入artsan 命令,在CMD 下面装 X 用:
    查看路由的详细情况: php artisan route:list 
    用这条命令的时候如果有方法不存在会报错如下: 
        [ReflectionException]
             Class App\Http\Controllers\Admin\ArticleController does not exist
    创建  artisan make:controller ArticleController


    这个时候还要修改两个地方,ArticleController.php 里面
        命名空间修改:namespace App\Http\Controllers\Admin;
        use修改:   use App\Http\Controllers\Controller;
        App\Http\Controllers\Admin\ArticleController@store
    从表中可以看出来,如果是用get方法或者head 方法,得到的就是index/create 如果是用的post 方法,得到的就是store 用之前的POSTMAN也可以在VIEW当中查看

中间件

    简单说就是在这里面加了一层保护过滤
                                                        //  middleware 就是中间件
    Route::group(['prefix' => 'admin','namespace'=>'Admin','middleware'=>'web'], function() {
        Route::get('login','IndexController@login');
        Route::get('index','IndexController@Index');
    });

—下面准备测试中间件

    Route::get('/',function(){  //先访问首页
        session(['key'=>123]);  //把key 写入sessoin
        return view('welcome'); 
    });

    Route::get('/test',function(){  
        echo session('key');    //提取session里面的值
        return 'fail to get the key';
    });

    先访问blog 首页 再访问 blog/test 得到 fail to get the key.
    问题出在 必须用了middleware 中间件才能使用web服务

    读取竟然失败了!然后我们吧这两条放到middleware里面试试

        ##骚年。这个地方要注意下,prefix这里有个admin 所以访问首页的时候要先把admin加上

        Route::group(['prefix' => 'admin','namespace'=>'Admin','middleware'=>'web'], function() {
            Route::get('/',function(){  //先访问首页
            session(['key'=>123]);  //把key 写入sessoin
            return view('welcome'); 
        });

        Route::get('/test',function(){  
            echo session('key');    //提取session里面的值
            return 'fail to get the key';
        });
            Route::get('login','IndexController@login');
            Route::get('index','IndexController@Index');
            Route::resource('article', 'ArticleController');
        });

    访问首页之后再访问 blog/admin/test 可以得到 123 fail...

    但是!我们被视频坑了!!!

    因为下面居然有已经定义好的空白的中间件!

    于是:

    //因为加入中间件,把上session 实验的的内容放到这

    Route::group(['middleware' => ['web']], function () {
        Route::get('/',function(){  //先访问首页
        session(['key'=>123]);  //把key 写入sessoin
        return view('welcome'); 
    });

    Route::get('/test',function(){  
        echo session('key');    //提取session里面的值
        return 'fail to get the key';
    });
    });


    直接访问首页让后再访问test也可以得到结果。

    中间件的定义在隔壁的kernel.php 里面 写一个试试
                            //这里app\是命名空间   //这是中间件的名字比如'middlware'
            'admin.login' => \App\Http\Middleware\AdminLogin::class,

中间件 artisan 的CMD 命令:

    查artisan 所有的命令: php artisan

    D:\wamp64\www\code\blog>php artisan
    Laravel Framework version 5.2.23

    Usage:
      command [options] [arguments]

    Options:
      -h, --help            Display this help message
      -q, --quiet           Do not output any message
      -V, --version         Display this application version
          --ansi            Force ANSI output
          --no-ansi         Disable ANSI output
      -n, --no-interaction  Do not ask any interactive question
          --env[=ENV]       The environment the command should run under.
      -v|vv|vvv, --verbose  Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug

    Available commands:
      clear-compiled      Remove the compiled class file
      down                Put the application into maintenance mode
      env                 Display the current framework environment
      help                Displays help for a command
      list                Lists commands
      migrate             Run the database migrations
      optimize            Optimize the framework for better performance
      serve               Serve the application on the PHP development server
      tinker              Interact with your application
      up                  Bring the application out of maintenance mode

     app
      app:name            Set the application namespace

     auth
      auth:clear-resets   Flush expired password reset tokens

     cache
      cache:clear         Flush the application cache
      cache:table         Create a migration for the cache database table

     config
      config:cache        Create a cache file for faster configuration loading
      config:clear        Remove the configuration cache file

     db
      db:seed             Seed the database with records

     event
      event:generate      Generate the missing events and listeners based on registration

     key
      key:generate        Set the application key

     make
      make:auth           Scaffold basic login and registration views and routes
      make:console        Create a new Artisan command
      make:controller     Create a new controller class
      make:event          Create a new event class
      make:job            Create a new job class
      make:listener       Create a new event listener class
      make:middleware     Create a new middleware class
      make:migration      Create a new migration file
      make:model          Create a new Eloquent model class
      make:policy         Create a new policy class
      make:provider       Create a new service provider class
      make:request        Create a new form request class
      make:seeder         Create a new seeder class
      make:test           Create a new test class

     migrate
      migrate:install     Create the migration repository
      migrate:refresh     Reset and re-run all migrations
      migrate:reset       Rollback all database migrations
      migrate:rollback    Rollback the last database migration
      migrate:status      Show the status of each migration

     queue
      queue:failed        List all of the failed queue jobs
      queue:failed-table  Create a migration for the failed queue jobs database table
      queue:flush         Flush all of the failed queue jobs
      queue:forget        Delete a failed queue job
      queue:listen        Listen to a given queue
      queue:restart       Restart queue worker daemons after their current job
      queue:retry         Retry a failed queue job
      queue:table         Create a migration for the queue jobs database table
      queue:work          Process the next job on a queue

     route
      route:cache         Create a route cache file for faster route registration
      route:clear         Remove the route cache file
      route:list          List all registered routes

     schedule
      schedule:run        Run the scheduled commands

     session
      session:table       Create a migration for the session database table

     vendor
      vendor:publish      Publish any publishable assets from vendor packages

     view
      view:clear          Clear all compiled view files

    可见创建一个中间件应该是用的 make:middleware      输入: php artisan make:middleware AdminLogin

    简单说,命令的组成就是 php artisan 这个 命令头 信息 + 要弄啥 + 弄啥的名

—创建成功了,在middleware 文件夹 打开 AdminLogin.php

        public function handle($request, Closure $next)
    {
        echo "create AdminLogin succ";exit;  //这里写入 exit 之后,下面的欢迎页面就不执行了
        return $next($request);
    }

—在 route.php 里面直接添加 添加刚刚创建的admin.login

    Route::group(['middleware' => ['web','admin.login']], function () {
    Route::get('/',function(){  //先访问首页
    session(['key'=>123]);      //把key 写入sessoin
    return view('welcome');     //这里有欢迎页面,但是上面已经用 exit; 退出了,所以欢迎页面不会显示

HTTP视图

    视图:处理结果的可视化

    数据传递:1.with 2.传参 3.compact

    打开route.php 

通过路由调用控制器,通过控制器分配视图

Route::get('/',function(){      //视图化等同于  Route::get('/view',function(){
    return view('welcome');     //新建测试页面        return view('test_laravel');
});

ps:新建测试页面,在 views 文件夹下,复制welcome.blade.php 更名 xxx.blade.php
   blade是一个默认的模板引擎

新建一个 view 控制器
Route::get('view','ViewController@index');
CMD : php artisan make:Controller ViewController
app\http\controllers\ViewController.php 中
    public function index(){
        return view('test_larvel');}    //这就是调用视图

修改试图中的内容
比如现在要修改欢迎界面视图中的 larvel 5 字样:

    在 ViewController.php 中
        public function index(){
            $name = '这就是修改的内容';
            return view('test_laravel')->with('name',$name);}


    在 test_laravel.php 中,把 laravel 5 字样换成  就可以完成调用

    同理,在 public function index(){
                $a = 'this is test';
                return view('test_laravel')->with()->with('a'.$a);}

    在 ViewController.php 中
            

用法总结

---1.写内容

    ##在文件中用数组形式写入内容(ViewController.php)

    $data = [
        'name'=>'这就是修改的内容';     
        'a'=>'this is test';
    ];
    $titile = '这也是测试的一部分';

    ##注意返回值格式 

    return view('test_laravel',$data,$title);  

    ##或者用 compact 

    return view('test_laravel',compact('data','title'));

---2.引参数

    test_laravel.blade.php 中 **数组内容** 就用 **数组方式** 调用

    
-
非数组就直接调用

模板引擎

    刚刚的输出页面 test_laravel.blade.php 中
        

等于=>写法

{{$data}}

如果有两个参数,但只要解析一个,另外一个前面就用@

{{$data}} @{{$data}}

// @符号屏蔽语法解析 如要测试定义的参数存在(用isset?($变量名)),就解析$变量名,不存在:,就打印默认值

{{isset($data)?$data:'默认值'}}

输出页面中,如果是要输出一个定义过的变量比如 : $str = '

你可能感兴趣的:(laravel)