Laravel 5.6.27-如何制作自定义表格宏?

时间:2018-07-20 17:57:09

标签: php laravel forms laravel-5 macros

首先,我是Laravel的新手。

目前,我正在尝试为Macros中的<a href="{{url('our-services/'.$service->url)}}" class="small white uppercase font-weight-6 underline">Read More</a> 定制Laravel 5.6.27

这就是我拥有的:

app / Services / Macros.php

forms

app / Providers / MacroServiceProvider.php

<?php namespace App\Services;

use Collective\Html\FormBuilder;

class Macros extends FormBuilder {
  public function selectState($name, $selected = null, $options = array())
  {
    $list = [
      '' => 'Select One...',
      'AL' => 'Alabama',
      'AK' => 'Alaska',
      'AZ' => 'Arizona',
      'AR' => 'Arkansas',
      'CA' => 'California',
      'CO' => 'Colorado',
      'CT' => 'Connecticut',
      'DE' => 'Delaware',
      'DC' => 'District of Columbia',
      'FL' => 'Florida',
      'GA' => 'Georgia',
      'HI' => 'Hawaii',
      'ID' => 'Idaho',
      'IL' => 'Illinois',
      'IN' => 'Indiana',
      'IA' => 'Iowa',
      'KS' => 'Kansas',
      'KY' => 'Kentucky',
      'LA' => 'Louisiana',
      'ME' => 'Maine',
      'MD' => 'Maryland',
      'MA' => 'Massachusetts',
      'MI' => 'Michigan',
      'MN' => 'Minnesota',
      'MS' => 'Mississippi',
      'MO' => 'Missouri',
      'MT' => 'Montana',
      'NE' => 'Nebraska',
      'NV' => 'Nevada',
      'NH' => 'New Hampshire',
      'NJ' => 'New Jersey',
      'NM' => 'New Mexico',
      'NY' => 'New York',
      'NC' => 'North Carolina',
      'ND' => 'North Dakota',
      'OH' => 'Ohio',
      'OK' => 'Oklahoma',
      'OR' => 'Oregon',
      'PA' => 'Pennsylvania',
      'RI' => 'Rhode Island',
      'SC' => 'South Carolina',
      'SD' => 'South Dakota',
      'TN' => 'Tennessee',
      'TX' => 'Texas',
      'UT' => 'Utah',
      'VT' => 'Vermont',
      'VA' => 'Virginia',
      'WA' => 'Washington',
      'WV' => 'West Virginia',
      'WI' => 'Wisconsin',
      'WY' => 'Wyoming'
    ];

    return $this->select($name, $list, $selected, $options);
  }
}

我还添加了 config / app.php

<?php namespace App\Providers;

use Collective\Html\HtmlServiceProvider;

class MacroServiceProvider extends HtmlServiceProvider {

  public function register()
  {
    parent::register();

    require base_path() . '/app/Services/Macros.php';
  }
}

然后,在我的 视图 中,我输入了以下代码:

Collective\Html\HtmlServiceProvider::class,
App\Providers\MacroServiceProvider::class,

我收到以下错误:

  

“方法selectState不存在。(查看:C:\ MAMP \ htdocs \ crafto \ resources \ views \ contact.blade.php)”

我不知道我在做什么错。好像找不到我创建的{{ Form::selectState() }} 函数。我尝试了很多事情,但是对Laravel的了解并不多。我的头撞在墙上的墙上。

有人可以向我解释selectState的工作原理,尤其是Macros的工作原理吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

不要覆盖库类。要使它正常工作,将非常困难。

FormBuilder使用Macroable特性,因此可以定义宏:

app / Providers / MacroServiceProvider.php

public function register()
{
   parent::register();
   FormBuilder::macro('selectState', function ($name, $selected = null, $options = array())
  {
    $list = [
      '' => 'Select One...',
      'AL' => 'Alabama',
      'AK' => 'Alaska',
      'AZ' => 'Arizona',
      'AR' => 'Arkansas',
      'CA' => 'California',
      'CO' => 'Colorado',
      'CT' => 'Connecticut',
      'DE' => 'Delaware',
      'DC' => 'District of Columbia',
      'FL' => 'Florida',
      'GA' => 'Georgia',
      'HI' => 'Hawaii',
      'ID' => 'Idaho',
      'IL' => 'Illinois',
      'IN' => 'Indiana',
      'IA' => 'Iowa',
      'KS' => 'Kansas',
      'KY' => 'Kentucky',
      'LA' => 'Louisiana',
      'ME' => 'Maine',
      'MD' => 'Maryland',
      'MA' => 'Massachusetts',
      'MI' => 'Michigan',
      'MN' => 'Minnesota',
      'MS' => 'Mississippi',
      'MO' => 'Missouri',
      'MT' => 'Montana',
      'NE' => 'Nebraska',
      'NV' => 'Nevada',
      'NH' => 'New Hampshire',
      'NJ' => 'New Jersey',
      'NM' => 'New Mexico',
      'NY' => 'New York',
      'NC' => 'North Carolina',
      'ND' => 'North Dakota',
      'OH' => 'Ohio',
      'OK' => 'Oklahoma',
      'OR' => 'Oregon',
      'PA' => 'Pennsylvania',
      'RI' => 'Rhode Island',
      'SC' => 'South Carolina',
      'SD' => 'South Dakota',
      'TN' => 'Tennessee',
      'TX' => 'Texas',
      'UT' => 'Utah',
      'VT' => 'Vermont',
      'VA' => 'Virginia',
      'WA' => 'Washington',
      'WV' => 'West Virginia',
      'WI' => 'Wisconsin',
      'WY' => 'Wyoming'
    ];

    return $this->select($name, $list, $selected, $options);
  });

本质上,Macroable特性的作用只是持有一系列额外的函数(宏),然后通过__call__callStatic魔术方法调用它们。

当然,这仅适用于尚未在基类上定义的方法