Why not keep thing simple :

imports:
 - { file: BlogBundle/Controller/AnnotController.php }
 - { annotations: BlogBundle/Controller/AnnotController.php }

?


On 30 nov. 2010, at 09:35, Konstantin Kudryashov wrote:

> I like the idea of `file:` notation for default loaders. It's feeling more
> natural & Symfony2-ish =)
> 
> ---
> http://about.me/everzet/bio
> 
> 
> 
> On Tue, Nov 30, 2010 at 10:31, Miha Vrhovnik <miha.vrhov...@gmail.com>wrote:
> 
>> The same way browser does?
>> file:///D:/foo/index.html
>> 
>> M
>> On Nov 30, 9:15 am, Fabien Potencier <fabien.potenc...@symfony-
>> project.com> wrote:
>>> On 11/30/10 9:01 AM, Henrik Bjornskov wrote:
>>> 
>>>> We have in our own systems used the resourceName: which have worked
>>>> out quite well.
>>> 
>>>> Instead of always specifying the resource to use, cant we fallback to
>>>> file if theres no prefix?
>>> 
>>> Yes, this is the proposition number 2.
>>> 
>>> But this is not possible with "something:resource". How do you
>>> differentiate between a path and a resource with a prefix?
>>> 
>>> annotations:foobar
>>> c:\...
>>> 
>>> Fabien
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>>> On Nov 30, 8:42 am, Fabien Potencier<fabien.potenc...@symfony-
>>>> project.com>  wrote:
>>>>> Hi all,
>>> 
>>>>> Time for another RFC. Today, I want your opinion on custom loader
>>>>> resources notation.
>>> 
>>>>> As you might know, the Dependency Injection and Routing components
>> have
>>>>> the notion of loaders. A loader is able to load "resource"s. A
>> resource
>>>>> can be anything; write a loader that knows how to load the resource
>> and
>>>>> you're good to go. Both components comes with built-in file loaders
>> for
>>>>> XML, YAML, and PHP:
>>> 
>>>>> # config.yml
>>>>> imports:
>>>>>    - { resource: security.yml }
>>> 
>>>>> # routing.yml
>>>>> imports
>>>>>   - { resource: BlogBundle/Resources/config/routing.xml, prefix:
>> /blog }
>>> 
>>>>> The interesting part is that a resource is not necessarily a file. Of
>>>>> course, most of the time, this is part of a file path, but it does not
>>>>> need to.
>>> 
>>>>> For instance, if you have a look at the Routing component and the
>>>>> FrameworkExtraBundle documentation, you will see that there is a
>> special
>>>>> "annotation" loader. For this annotation loader, the resource is not a
>>>>> file path but it can be a glob or a directory of files to parse for
>>>>> annotations:
>>> 
>>>>> imports:
>>>>>   - { resource: annotations:BlogBundle/Controller/AnnotController.php
>> }
>>> 
>>>>> As you can see, the current convention is to to prefix the "real"
>>>>> resource by a word followed by a colon, here "annotations:".
>>> 
>>>>> Symfony2 determines the loader to use via a LoaderResolverInterface
>>>>> instance. Here is the default implementation of this interface:
>>> 
>>>>>      public function resolve($resource)
>>>>>      {
>>>>>          foreach ($this->loaders as $loader) {
>>>>>              if ($loader->supports($resource)) {
>>>>>                  return $loader;
>>>>>              }
>>>>>          }
>>> 
>>>>>          return false;
>>>>>      }
>>> 
>>>>> So, each loader has a supports() method that must return true if it is
>>>>> able to load the resource. Here is for instance the supports() method
>>>>> for the PHP and XML loader:
>>> 
>>>>>      // PHP
>>>>>      public function supports($resource)
>>>>>      {
>>>>>          return is_string($resource)
>>>>>            &&  'php' === pathinfo($resource, PATHINFO_EXTENSION)
>>>>>            &&  is_file($this->getAbsolutePath($resource));
>>>>>      }
>>> 
>>>>>      // XML
>>>>>      public function supports($resource)
>>>>>      {
>>>>>          return is_string($resource)
>>>>>            &&  'xml' === pathinfo($resource, PATHINFO_EXTENSION);
>>>>>      }
>>> 
>>>>> As you can see, for the annotation loader to work, the PHP loader
>> checks
>>>>> if the resource is actually an existing file; which is not the case
>> for
>>>>> XML loader.
>>> 
>>>>> I had to do that because of the registration order. If you remove the
>>>>> 'is_file' check in the PHP loader and register the annotation loader
>>>>> after the PHP one, the PHP loader will always "win" but won't be able
>> to
>>>>> do anything useful with the resource.
>>> 
>>>>> So, we need a way to clearly identify which loader need to be used.
>> The
>>>>> current implementation of the PHP loader is a "hack" as you won't have
>> a
>>>>> proper exception if you want to load a PHP resource and if you make a
>>>>> typo in the file path because the loader will tell the resolver that
>> it
>>>>> does not support the resource. So, you will have an exception saying
>>>>> that there is no loader able to load your resource, which is not the
>>>>> real problem (you have a typo in the file path).
>>> 
>>>>> everzet had the same problem and came up with a patch:
>> https://github.com/fabpot/symfony/pull/178
>>> 
>>>>> In this pull request, we talked about the prefix to use, and one
>>>>> proposal (the one implemented in the patch) was to use (), as they
>>>>> cannot be used at the beginning of a real file path. So, to create a
>>>>> custom loader, you need prefix the resource like this:
>>> 
>>>>> imports:
>>>>>   - { resource: (annotations)
>> BlogBundle/Controller/AnnotController.php }
>>> 
>>>>> I was about to merge the change and then I step back and found this
>>>>> convention quite ugly (I was the one to propose that).
>>> 
>>>>> I thought about that more and here are some proposals:
>>> 
>>>>> 1/ Always prefix the path with something, even for file resources
>> (like
>>>>> a DSN):
>>> 
>>>>> imports:
>>>>>    - { resource: file:BlogBundle/Controller/AnnotController.php }
>>>>>    - { resource:
>> annotations:BlogBundle/Controller/AnnotController.php }
>>> 
>>>>>    * This is explicit, no ambiguity possible, simple supports()
>>>>> implementation, clear error messages;
>>>>>    * But when using a file as a resource, which is what you will do
>> most
>>>>> of the time, you will have to use the 'file:' prefix.
>>> 
>>>>> 2/ Use a prefix for everything except file loaders
>>> 
>>>>> For this one, we need to come up with a convention that can be easily
>>>>> checked and cannot be part of a file name:
>>> 
>>>>>    (annotations) BlogBundle/Controller/AnnotController.php
>>>>>    annotations::BlogBundle/Controller/AnnotController.php
>>>>>    [annotations]BlogBundle/Controller/AnnotController.php
>>>>>    ...
>>> 
>>>>> 3/ You own idea here ;)
>>> 
>>>>> Fabien
>>> 
>>>>> --
>>>>> Fabien Potencier
>>>>> Sensio CEO - symfony lead developer
>>>>> sensiolabs.com | symfony-project.org | fabien.potencier.org
>>>>> Tél: +33 1 40 99 80 80
>> 
>> --
>> If you want to report a vulnerability issue on symfony, please send it to
>> security at symfony-project.com
>> 
>> You received this message because you are subscribed to the Google
>> Groups "symfony developers" group.
>> To post to this group, send email to symfony-devs@googlegroups.com
>> To unsubscribe from this group, send email to
>> symfony-devs+unsubscr...@googlegroups.com<symfony-devs%2bunsubscr...@googlegroups.com>
>> For more options, visit this group at
>> http://groups.google.com/group/symfony-devs?hl=en
>> 
> 
> -- 
> If you want to report a vulnerability issue on symfony, please send it to 
> security at symfony-project.com
> 
> You received this message because you are subscribed to the Google
> Groups "symfony developers" group.
> To post to this group, send email to symfony-devs@googlegroups.com
> To unsubscribe from this group, send email to
> symfony-devs+unsubscr...@googlegroups.com
> For more options, visit this group at
> http://groups.google.com/group/symfony-devs?hl=en

-- 
If you want to report a vulnerability issue on symfony, please send it to 
security at symfony-project.com

You received this message because you are subscribed to the Google
Groups "symfony developers" group.
To post to this group, send email to symfony-devs@googlegroups.com
To unsubscribe from this group, send email to
symfony-devs+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/symfony-devs?hl=en

Reply via email to