Creating and using Laravel 4 commands

2020-05-27 03:59发布

EDIT: Figured out where I was going wrong and placed an answer at the end

I'm trying to create a Laravel Command, I can see it's changed considerably from "tasks" in Laravel 3. However I can't seem to get it to run. These are the steps I have taken:

php artisan command:make Import

Returns

Command created successfully

The file in the commands directory is then created and I have slightly modified to return "Hello World" like so:

use Illuminate\Console\Command;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\InputArgument;

class Import extends Command {

    /**
     * The console command name.
     *
     * @var string
     */
    protected $name = 'command:import';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Command description.';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return void
     */
    public function fire()
    {
        return 'Hello World';
    }

    /**
     * Get the console command arguments.
     *
     * @return array
     */
    protected function getArguments()
    {
        return array(
            array('example', InputArgument::REQUIRED, 'An example argument.'),
        );
    }

    /**
     * Get the console command options.
     *
     * @return array
     */
    protected function getOptions()
    {
        return array(
            array('example', null, InputOption::VALUE_OPTIONAL, 'An example option.', null),
        );
    }

}

However when I try and run the command like so:

php artisan Import

I get the following error:

[InvalidArgumentException] Command "Import" is not defined.

I have tried it with and without capitals as well as naming it "ImportCommand" since the documentation names its command "FooCommand" but with no luck.

Any help would be most appreciated.

4条回答
虎瘦雄心在
2楼-- · 2020-05-27 04:18

Actually figured this out. Further down the documentation it states that you must register your command in "app/start/artisan.php" using the following method:

Artisan::add(new import);

Also the name you give in your command class is significant as that's what you need to use to call it. So I should have actually been calling it like so:

php artisan command:import

One final thing. What the fire() returns is unimportant, to return strings you must echo them.

查看更多
我只想做你的唯一
3楼-- · 2020-05-27 04:25

In newer Laravel versions there isn't an import command. You just have to do the following two thing:

  1. Register your command in app/start/artisan.php:

    Artisan::add(new Import);
    
  2. Run the command in Artisan:

    php artisan command:name Import
    
查看更多
▲ chillily
4楼-- · 2020-05-27 04:37

try this.

protected function getArguments()
{
    return [];
}

protected function getOptions()
{
    return [];
} 

also add this in /app/start/artisan.php

Artisan::add(new ParseCommand);

then Run Command on Root directory

./artisan command:import; 
查看更多
Evening l夕情丶
5楼-- · 2020-05-27 04:38

there's a mis-understanding on Artisan commands because of the used wording.

In your case you choose : 'command:import' as a name of one of your 'Import' commands.

Think about it as an object, with methods.

If "Import" has many commands:

you can use as command name > protected $name = 'import:csv';

another command would be > protected $name = 'import:txt';

and > protected $name = 'import:contacts';

so your commands with "Import" nature are better organised.

and when you request , you see your commands organised as a single entity.

If not,

and you have only a single command then give your command a single clear name. protected $name = 'import';

查看更多
登录 后发表回答